更新时间:2025-04-09 gmt 08:00

mysql主备复制原理简介-j9九游会登录

rds for mysql的默认备库、只读实例、自建从库、drs链路灾备实例均采用mysql的binlog复制技术,也称为mysql主备复制或主从复制技术。本章节介绍mysql的主从复制原理。

主备复制流程

  • 主节点(master)中有数据更新时,会按照binlog格式,将更新的操作以event形式写入到主节点的binlog中。event有多种类型:insert、delete、update、query等。
  • 从节点(slave)连接主节点时,有多少个从节点就会创建多少个binlog dump线程。
  • 当主节点的binlog发生变化时,binlog dump线程会通知所有从节点,并将相应binlog内容推给从节点。
  • 从节点的i/o thread收到binlog内容后,会将内容写到本地relay log(中继日志)。
  • 从节点的sql thread会读取i/o thread写入的relay log,并且根据relay log中的event,回放对应的操作(dml、ddl等)。

seconds_behind_master计算方式

seconds_behind_master即主备复制时延,通过show slave status查询获取。seconds_behind_master计算的伪代码实现如下:

if (sql thread is running) 
//如果sql线程启动
{
     if (sql thread processed all the available relay log)
     //io thread拉取主库binlog的位置和sql thread应用的relay log相对于主库binlog的位置相等
     {
         if (io thread is running)
             //如果io线程启动,设置延迟为0
             print 0;
         else
             //如果io线程未启动,设置延迟为null
             print null;
     }
     else
         //如果sql线程没有应用完所有的io线程写入的event,那么需要计算seconds_behind_master
         按公式计算seconds_behind_master的值;
}  
else
     //如果sql线程也没有启动,则设置为空值
     print null;

上述伪代码中,seconds_behind_master的计算公式为:

seconds_behind_master = time(0) - last_master_timestamp - clock_diff_with_master

相关变量含义如下:
  1. time(0):当前从节点服务器的系统时间。
  2. clock_diff_with_master:从节点的系统时间和主节点服务器系统时间的差值,一般为0。如果主从节点系统时间不一致,那么计算出的从节点复制时延会不准确。
  3. last_master_timestamp:从节点在回放relay log中event过程中计算和更新,该变量在并行复制(mts)和非并行复制方式下,更新的时机是不同的,默认全部开启并行复制:
    • 并行复制:可以简单理解为,从节点的sql线程在每个事务执行完成后,更新last_master_timestamp值,其更新是以事务为单位。所以大事务、ddl容易导致主备延迟大,具体请参见主备复制延迟持续增长后自动恢复
    • 非并行复制:从节点的sql线程读取了relay log中的事务后,事务未执行前便会更新last_master_timestamp,其更新是以事务为单位。

综上所述,seconds_behind_master的计算公式可以理解为:

seconds_behind_master = 当前从节点服务器的系统时间 - 从节点sql线程处理中事务在主节点的执行时间 - 从节点的系统时间和主节点服务器系统时间的差值

相关文档

网站地图