MySQL并行复制2

来源:这里教程网 时间:2026-03-01 18:25:14 作者:

MySQL5.7基于时间戳的并行复制, https://dev.mysql.com/worklog/task/?id=7165 中作了优化,之前是机遇parent- commit的并行,就是说在之前的事务都提交后开始的prepare能并行,这种方式并行度不够理想,然后换成了lock- base的并行,这种方式是同时进入prepare的就能并行,就是说在加锁阶段有重复,说明是互相之间没有锁的,就能并行,但是2个串行的互相没有锁的,因为没有重叠,也不能并行。 基于锁的并行,定义每个事务锁区间的方法是,最后一个dml锁时间作为起点,事务提交之前作为终点。这个概念很重要,不是第一个dml 的时间是起点,以为后面有其他获取锁的需求,可能会冲突。 有个global 时间戳,每次事务提交的时候都会去更新这个,然后其他事务执行每个dml的时候,都会用这个global时间戳去更新事务的last_commited, 在事务结束的时候设置sequence_number. 所以普通的理解就是第二个事务的last_commit小于第一个事务的sequence_number 就能并行。或者说,从库上正在执行的事务的最小sequence_number比 一个事务的last_commit大,那这个事务就能并发。 slave上维护了一个正在执行的事务的sequence, 这个队列里第一个事务就是最早的事务,也拥有最小的sequence_number,所以事务能否并发,要去跟队列中第一个事务的sequence_number对比。

 transaction_sequence[0].sequence_number > this.last_committed

如能并发,在调度后,这个事务会加到队列中,在提交后,会标记成这个事务完成,让调度器忽略这个事务。 这个队列是gaq队列,固定的循环队列,如果队列满了怎么办? MySQL的实现中,并不是用sequnece_number去对比的,而是使用了lwm,这个之前的事务都是提交的,所以lwm拥有最小的sequence_number。 在调度event的时候,如果不是新group,就会去进行上面的判断是否等待,如果是新的组,会等待所有的worker线程完成。 判断是否是新组,有很多条件,比如是第一个event,sequnce_number,last_committed 没有设置,gap_sucessor,last_sequence_number没有设置等。 对于writeset,实现时尽可能缩小last_committed, 加大lock interval,这样尽可能多的事务有锁重叠,加大并发度。 It's never too late to know.

相关推荐