MySQL半同步复制

2021-03-01  本文已影响0人  爱钓鱼的码农

MySQL复制类型

不论复制为何种类型,大致流程为都为4阶段:
1.InnoDB Redo File Write
2.binlog File Flush & Sync
3.InnoDB Redo File Commit(同时释放事务持有的锁)
4.Send binlog to Slave。
相关参数:
rpl_semi_sync_master_enabled
rpl_semi_sync_master_timeout
rpl_semi_sync_master_wait_point(半同步与增强半同步参数)

异步复制

Master、Slave事务更新的不同步,就算是没有网络或者其他系统的异常,当业务并发上来时,slave因为要顺序执行master批量事务导致很大的延迟,在读写分离的架构中会导致用户读取数据不一致的现象。

半同步复制

after_commit模式下,4个阶段的顺序为1->2->3->4。
Master将每个事务写入binlog(sync_binlog=1),传递到slave刷新到磁盘(sync_relay=1),同时主库提交事务(commit)。Master等待Slave反馈收到relay-log,只有收到ACK后master才将commit OK结果反馈给客户端。在MySQL-5.7之前使用after_commit的模式下,客户端事务在存储引擎层提交后,在得到从库确认的过程中,主库宕机了。此时,即主库在等待Slave ACK的时候,虽然没有返回当前客户端,但事务已经提交其他客户端会读取到已提交事务。如果Slave端还没有读到该事务的events,同时主库发生了crash,然后切换到备库。那么之前读到的事务就不见了,出现了逻辑意义上的幻读。

增强半同步

after_sync模式下,4个阶段的顺序为1->2->4->3,消除幻读的问题。

半同步与增强半同步如何选择

现在假设阶段1、2、3各需要1ms时间,阶段4需要0.2ms时间,那么一次事务提交的时间:
T after_sync = 1 + 1 + 0.2 + 1 = 3.2 ms
T after_commit = 1 + 1 + 0.2 + 1 = 3.2 ms

after_sync的事务T1~T3的耗时


after_sync.png

after_commit的事务T1~T3的耗时


after_commit.png

直观感觉after_commit在耗时上优于after_sync,但是此结论为基于单线程的情况下如何加上Group Commit的背景又是如何呢?
在并发的场景下,若事务之间的修改不冲突,则事务是可以同时提交的,也就是可以进入到组提交(Group Commit)优化流程中。那么这时,事务的提交如下图所示:


group.png

事务TX1~TX4可以同时进入到提交阶段,这时会进入到MySQL的组提交优化中。这时产生的优化效果有:

上一篇下一篇

猜你喜欢

热点阅读