更新时间: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
相关变量含义如下:
- time(0):当前从节点服务器的系统时间。
- clock_diff_with_master:从节点的系统时间和主节点服务器系统时间的差值,一般为0。如果主从节点系统时间不一致,那么计算出的从节点复制时延会不准确。
- 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线程处理中事务在主节点的执行时间 - 从节点的系统时间和主节点服务器系统时间的差值
相关文档
意见反馈
文档内容是否对您有帮助?
提交成功!非常感谢您的反馈,我们会继续努力做到更好!
您可在查看反馈及问题处理状态。
系统繁忙,请稍后重试
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨