一、背景
当备库回放业务时,多个相互不依赖的业务能够并发回放,本方法首要用于解决多个可并发回放的业务的并发回放问题。经过并发的多个扫描线程实现并发对事物回放行列进行扫描,生成多个能够并发回放的事物,而且通知回放线程进行并发的回放。
二、数据结构设计
备库的事物数据依照事物 ID 分段存储到备库的事物数据行列中,参阅如下图 1;依据事物 ID 为 UUID 完全无序的特性,能够对 UUID 进行事物 ID 分段并发扫描。将事物 ID UUID 分段后,交给多个扫描线程协程,每个扫描线程负责某个 UUID 分区进行多个扫描线程并发扫描,扫描可回放的事物。

三、线程生命周期
当扫描线程发现可回放的事物后,会将事物 ID 参加 txnList 履行 enqueu 操作,参加事物 ID 后,扫描线程会履行 notify 操作,唤醒正在睡眠的回放线程进行业务回放操作,示意图参阅如下图 2。

五、如何判断回放是否完毕
因为采取了并发扫描以及并发回放,所以需求在悉数可回放业务悉数回放完毕后,完毕回放的流程,在此给出回放完毕的定义。
当可回放业务悉数回放完毕后,认为回放完毕。可回放业务分为 3 类,曩昔发现的可回放业务/现在发现的可回放业务/将来发现的可回放业务。
曩昔发现的可回放业务都会被参加到 txnList 中,现在发现的可回放业务正在由回放线程进行回放,将来发现的可回放业务是由扫描线程扫描 UUID 进行发现的。
-
曩昔发现的业务回放完毕的条件为 txnList 为空;
-
现在发现的业务回放完毕的条件为一切的 workerStatus 总和为 0;
-
将来发现的业务回放完毕的条件为一切的扫描线程,GatherAll 扫描可回放业务无法发现。
六、功能调优
依据 CPU 数量,可经过动态调整扫描线程和回放线程的回放协程数量,以合理分配两组协程的负载。这样做能够充分利用多核处理器的功能,并提高系统的吞吐量和呼应能力。

