MySQL半同步复制配置后性能降低,如何调整rpl_semi_sync参数提升效率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计887个文字,预计阅读时间需要4分钟。
由于 `rpl_semi_sync_master_wait_for_slave_count` 默认是 1,数据库必须等待至少一个从库返回 ACK 才能提交事务;而 ACK 并非日志落盘完成,只是接收并写入 relay log 缓冲区 —— 但网络延迟、从库负载高、乃至 TCP 接收队列积压,都可能导致等待卡在主库的 `commit`。
- 默认行为下,哪怕从库只慢 50ms,主库每条写事务就多等 50ms,QPS 直接腰斩
-
rpl_semi_sync_master_timeout单位是毫秒,但设太小(比如 100)会导致频繁退化为异步,失去半同步意义;设太大(比如 10000)又放大延迟风险 - MySQL 5.7+ 的
rpl_semi_sync_master_wait_point设为AFTER_SYNC(默认)比AFTER_COMMIT更安全,但也更慢——它要求主库先刷 binlog、再等 ACK,最后才提交本地事务
如何调低延迟又不丢数据
核心思路:不让主库“傻等”,而是用超时 + 自适应降级 + 精准 ACK 控制。
本文共计887个文字,预计阅读时间需要4分钟。
由于 `rpl_semi_sync_master_wait_for_slave_count` 默认是 1,数据库必须等待至少一个从库返回 ACK 才能提交事务;而 ACK 并非日志落盘完成,只是接收并写入 relay log 缓冲区 —— 但网络延迟、从库负载高、乃至 TCP 接收队列积压,都可能导致等待卡在主库的 `commit`。
- 默认行为下,哪怕从库只慢 50ms,主库每条写事务就多等 50ms,QPS 直接腰斩
-
rpl_semi_sync_master_timeout单位是毫秒,但设太小(比如 100)会导致频繁退化为异步,失去半同步意义;设太大(比如 10000)又放大延迟风险 - MySQL 5.7+ 的
rpl_semi_sync_master_wait_point设为AFTER_SYNC(默认)比AFTER_COMMIT更安全,但也更慢——它要求主库先刷 binlog、再等 ACK,最后才提交本地事务
如何调低延迟又不丢数据
核心思路:不让主库“傻等”,而是用超时 + 自适应降级 + 精准 ACK 控制。

