MySQL 主从复制原理与延迟处理
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
主从复制是 MySQL 高可用与读写分离的基础:主库写 binlog,从库拉取并重放,实现数据同步。但“主从延迟”几乎每个团队都遇到过——写入后立刻读从库,读到的还是旧数据。本文讲清原理与延迟处理。
一、复制的三个线程
主库的 binlog dump 线程把 binlog 事件推送给从库;从库的 IO 线程接收并写入本地 relay log(中继日志);从库的 SQL 线程读取 relay log 重放。延迟可能发生在任何一环:主库写入太快、从库 IO 接收不及时、SQL 重放太慢。binlog 有三种格式:statement 记录 SQL 语句(体积小但 NOW()、UUID 等不确定函数会导致主从不一致);row 记录行变更(默认推荐,体积大但安全);mixed 自动选择。
二、怎么看延迟
在从库执行 SHOW SLAVE STATUS\G,重点看 Seconds_Behind_Master(粗略值,为 0 不代表真同步)、Slave_IO_Running/Slave_SQL_Running(必须都是 Yes)、Relay_Log_Pos 与 Master_Log_Pos 的差值。更精确的对比是在主从各执行 SHOW MASTER STATUS 比对位点。注意:Seconds_Behind_Master 只统计 SQL 线程落后 IO 线程的程度,主库到从库 IO 线程的网络延迟不包含在内。
三、延迟大的常见原因与处理
① 大事务:一个更新百万行的事务,从库重放要同样长时间——业务层拆小事务。② 从库单线程重放瓶颈:开启并行复制 slave_parallel_type=LOGICAL_CLOCK、slave_parallel_workers=4~8(5.7+)。③ 从库机器规格低:从库配置至少与主库持平,磁盘用 SSD。④ 网络:跨机房复制延迟高,走内网专线。⑤ 锁等待:从库上有长查询阻塞重放,业务上读写分离要避免在从库跑分析型大查询,或用 max_replication_threads/读写分离中间件分流。
四、业务层缓解
写后立即读的场景(下单后查订单),强制读主库或用“会话内粘性读”(写后 N 秒内该用户的读请求路由到主库);非关键读走从库。中间件(MyCat、ShardingSphere)或应用层路由都能实现。监控上对 Seconds_Behind_Master 设告警(如超过 10 秒通知),延迟突增往往意味着主库刚跑了大事务,要顺藤摸瓜。
总结
主从复制 = binlog + IO 线程 + SQL 线程。延迟处理三板斧:开并行复制、拆大事务、业务侧读写分离策略。监控 Seconds_Behind_Master 并设置告警,把延迟从“用户投诉”变成“监控告警”。