MySQL5.7 新特性: Multi-threaded Slave 多线程复制
Updated:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html
什么是MTS
一句话概括:通过组提交的方式 master怎么并行,slave就怎么并行。
- 关键因素:组提交
|
|
为什么要用MTS
一句话概括:解决单线程复制的延迟问题
note1:当master有多个线程在写数据,那么MTS效果会非常好
note2:如果master对大表进行DDL,这样的延迟是没办法避免的
开启MTS的重要参数
参数 | comment | 默认配置 | 推荐配置 | 调整方式 |
---|---|---|---|---|
slave_parallel_workers | applier threads数量 | 0 | 16 | dynamic |
slave_parallel_type | 并行方式 | DATABASE | LOGICAL_CLOCK | dynamic |
slave_preserve_commit_order | 并行排序提交 | 0 | 1 | dynamic |
master_info_repository | master_info持久化方式 | FILE | DATABASE | static |
relay_log_info_repository | relay_info持久化方式 | FILE | DATABASE | static |
relay_log_recovery | 重新获取relay log | 0 | 1 | static |
重要组件
- IO thread并没有改变
- SQL thread 会变成Coordinator线程
- 会新增很多work线程来受Coordinator调度
|
|
Binlog 和 MTS
同一个last_committed 可以并行执行
同一个last_committed 中的sequence_number 默认是无序的
|
|
顺序
- 当slave_preserve_commit_order=0时
没有办法保证顺序,在恢复的过程中会有问题,到时候你怎么start slave 呢?
start slave until SQL_AFTER_MTS_GAPS ; reset slave
|
|
- 当slave_preserve_commit_order=1时
后一个sequence_number提交的时候,会等待前一个sequence_number完成。
Waiting for preceding transaction to commit
|
|