主从同步延迟(MySQL Replication Lag)是生产环境中非常常见的问题。解决思路不是单一的,而是需要从架构设计、硬件配置、参数调优、业务逻辑等多个层面综合入手。
以下是系统性的排查与解决方案,按从易到难、从治标到治本的顺序排列:
在解决问题前,先通过 SHOW SLAVE STATUS\G 查看两个关键线程的状态:
常见原因分类:
这是解决高并发场景下延迟最有效的手段。
方案 A:启用并行复制 (Parallel Replication)
WRITESET 的并行复制。这是解决 SQL 单线程瓶颈的终极武器。[mysqld]
slave_parallel_workers = 8 # 设置并行worker数量,建议4-16
slave_parallel_type = LOGICAL_CLOCK # 5.7+ 推荐,保证事务依赖顺序
# 或者 MySQL 8.0 可以使用 WRITESET
binlog_transaction_dependency_tracking = WRITESET
方案 B:读写分离 + 缓存(减轻从库压力)
方案 C:分库分表
关闭从库 binlog(如果不需要级联):
如果这台从库不需要作为其他从库的主库,可以关闭它的 log_slave_updates 和 binlog,减少 IO 压力。
开启 GTID 模式: 使用 GTID(Global Transaction Identifier)可以更稳定地进行复制,减少因位点和日志文件不一致导致的同步错误。
调整刷盘策略(牺牲一定安全性换性能):
innodb_flush_log_at_trx_commit 和 sync_binlog。很多时候延迟是“人祸”,优化 SQL 比优化数据库更有效。
消灭大事务:
DELETE FROM table WHERE create_time < '2020-01-01'; (删除1000万条数据)。避免对无主键表进行更新/删除:
UPDATE table SET col=1 WHERE non_pk_col=2; 时,如果 non_pk_col 无索引,会全表扫描。减少不必要的 DDL 操作:
ALTER TABLE 加字段、加索引,如果是大表,会锁表并导致长时间延迟。建议使用 pt-online-schema-change 或 gh-ost 进行在线改表。如果延迟已经产生,且业务无法等待,可以采取以下临时措施:
业务降级:
使用半同步复制 (Semi-Sync Replication):
强制跳过错误(慎用):
SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;对于大多数生产环境,建议按以下顺序操作:
一句话总结: 如果是老版本 MySQL,先升级并开启并行复制;如果是新版本,先查大事务和无主键表。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。