1. 半同步复制
After_commit (MySQL 5.6,有损复制)
- 客户端提交事务。
- 存储层提交事务。
- 推送Binlog到从库,从库接收并写入本地后反馈ACK信息。
- 主库收到ACK应答信息后,客户端返回Commit OK。
After_sync (MySQL 5.7,无损复制)
- 客户端提交事务。
- 推送Binlog到从库,从库接收并写入本地后反馈ACK信息。
- 主库通过独立ACK应答线程收到ACK信息。
- 存储引擎层提交事务,客户端返回Commit OK。
2. 并行复制演化
-
普通并行复制:
- 若事务在同一时间戳内提交,且不存在锁冲突,具有相同的last_commited,这些事务可以在从库上并行回放,总结就是主库怎么回放,从库就怎么回放
- 问题:如果主库的并发度不高,从库不能高效地进行并行回放。
-
基于writeset的并行复制改进:
- 不再要求事务必须在同一时间戳内提交。
- 并行的粒度被细化到了记录级别。
- MySQL计算每个事务中修改的每个行记录的WriteSet值,通过对比当前和历史的writeset值来判断事务之间是否存在冲突。
- 如果不存在冲突,事务就可以被标记为与先前的事务具有相同的
last_committed
值,并进行并行回放。
3. 并行复制参数
slave_parallel_type=logical_clock
-
binlog_transaction_dependency_tracking=commit-order|writeset|writeset_session
(默认是commit-order
) -
transaction_write_set_extraction=XXhash64
(writeset级别专属) -
slave_parallel_workers=8
(并行复制worker的线程数量) -
slave_preserve_commit_order=1
(顺序提交的方式回放)