MySQL 5.7并行复制初理解
我们知道MySQL 5.7并行复制引入了两个值last_committed
和sequence_number
。last_committed
表示事务提交的时候,上次事务提交的编号,在主库上同时提交的事务设置成相同的last_committed
。如果事务具有相同的last_committed
,表示这些事务都在一组内,可以进行并行的回放。这个机制也是Commit-Parent-Based SchemeWL#6314
中的实现方式。不过之后,官方对这种模式做了改进,所以最新的并行回放机制和WL#6314
有了不同,详情见Lock-Based SchemeWL#7165
。
下面介绍一下旧模式Commit-Parent-Based SchemeWL#6314
和新模式Lock-Based SchemeWL#7165
的不同之处,以及改进的地方。
Commit-Parent-Based Scheme WL#6314
Commit-Parent-Based Scheme
简介
- 在master上,有一个全局计数器(global counter)。在每一次存储引擎提交之前,计数器值就会增加。
- 在master上,在事务进入prepare阶段之前,全局计数器的当前值会被储存在事务中。这个值称为此事务的
commit-parent
。 - 在master上,
commit-parent
会在事务的开头被储存在binlog中。 - 在slave上,如果两个事务有同一个
commit-parent
,他们就可以并行被执行。
此commit-parent
就是我们在binlog中看到的last_committed
。如果commit-parent
相同,即last_committed
相同,则被视为同一组,可以并行回放。
Commit-Parent-Based Scheme
的问题
一句话:Commit-Parent-Based Scheme
会降低复制的并行程度。
解释一下图:
水平虚线表示事务按时间顺序往后走。
P表示事务在进入prepare阶段之前读到的
commit-parent
值的那个时间点。可以简单的视为加锁时间点。C表示事务增加了全局计数器(global counter)的值的那个时间点。可以简单的视为释放锁的时间点
P对应的
commit-parent
(last_commited
)是取自所有已经执行完的事务的最大的C对应的sequence_number
。举例来说:- Trx4的P对应的
commit-parent
(last_commited
)取自所有已经执行完的事务的最大的C对应的sequence_number
,也就是Trx1的C对应的sequence_number
。因为这个时候Trx1已经执行完,但是Trx2还未执行完。 - Trx5的P对应的
commit-parent
(last_commited
)取自所有已经执行完的事务的最大的C对应的sequence_number
,也就是Trx2的C对应的sequence_number
;Trx6的P对应的commit-parent
(last_commited
)取自所有已经执行完的事务的最大的C对应的sequence_number
,也就是Trx2的C对应的sequence_number
。所以Trx5和Trx6具有相同的commit-parent
(last_commited
),在进行回放的时候,Trx5和Trx6可以并行回放。
</
- Trx4的P对应的