• 一本书
    2024-12-12 来自湖北
    假设事务在主库上执行了 N 秒,那么备库刚接收到 Binlog,开始执行时,延迟就是 N 秒了,如果备库上执行速度和主库一样,那么备库上延迟最高会达到 2N 秒。对于 DDL,如果使用单线程复制,备库上的延迟时间会从 0 秒开始,最高 N 秒。如果使用了多线程复制,那么备库开始执行 DDL 时,延迟可能就已经是 N 秒了,最高会达到 2N 秒。 老师,我对以上这个流程不是很理解,这里单线程复制与多线程复制的差异在哪里啊,前面说开始执行时,延迟就是 N 秒,那么延迟最低是N秒吧,但是为什么单线程复制时,延迟从 0 秒开始,最高是 N 秒呢?

    作者回复: 这和延迟的计算方式有关系。计算公式简化一下, time_diff = time() - last_master_timestamp last_master_timestamp = tv_sec + exec_time 这里tv_sec是DDL在主库上的开始执行时间,假设是t。 exec_time是DDL的执行耗时,假设是N秒。 备库上开始执行DDL的时间是 t + N,结束时间是 t + N + N, 对应的,延迟时间是从 t + N - (t + N) = 0,到 t + 2N - (t + N) = N。 如果使用了多线程复制,计算方式就更复杂一些了,不是按当前应用的那个Binlog事件的开始时间来计算tv_sec,而是和Gaq有关。

    
    