Job 执行
冲突检测
binlog 顺序同步模型要求按照 binlog 顺序一个一个来同步 binlog event,这样的顺序同步势必不能满足高 QPS 低同步延迟的同步需求,并且不是所有的 binlog 涉及到的操作都存在冲突。Binlog replication 采用冲突检测机制,鉴别出来需要顺序执行的 jobs,在确保这些 jobs 的顺序执行的基础上,最大程度地保持其他 job 的并发执行来满足性能方面的要求。
冲突检测流程如下:
- 遇到 DDL job,等待前面已经分发出来的所有 DML jobs 执行完成后,然后单独执行该 DDL job,执行完成之后保存 checkpoint 信息。
- 遇到 DML job,会 先检测并且尝试解决冲突。如果检测到冲突(即存在两个 executor 的 worker 的 jobs 都需要与当前的 job 保持顺序执行),会发送一个 flush job 来等待已经分发的所有 DML jobs 执行完成,然后再将 job 分发到对应的 worker,并且记录该分发信息到内存。在没有冲突的情况下,如果不需要与已经分发出去的 job 保持顺序的话,发送 job 到任意 worker 上;如果需要保持顺序的话,那么根据内存储存的历史分发信息,发送 job 到对应的 worker 上。
冲突检测实现比较简单,根据转换步骤获得每条 statement 对应的
primary/unique key
信息,来进行交集检测,如果存在交集那么认定是需要顺序的执行两条 statement,请参考 具体实现代码。
这个问题,有说法了,dm有冲突检测机制。确保primary/unique key的设置正确,就不会发生上述这种,insert id=1 之后delete id=1,乱序执行的问题。