半同步的语义边界
默认的异步复制下,主库提交事务后就返回成功,此时若主库宕机,尚未传出的变更会丢。半同步复制要求主库至少收到一个从库的确认才向客户端提交成功,把故障丢失窗口压缩到一个事务以内。它保证的是从库已收到,不保证从库已落盘或已重放,因此仍不是零丢失方案。
基本信息
| 适用平台 | MySQL 5.7 / 8.0,通过 semisync 插件实现 |
|---|---|
| 插件名 | 8.0 为 rpl_semi_sync_source 与 rpl_semi_sync_replica(旧名为 master/slave) |
| 超时参数 | rpl_semi_sync_source_timeout,单位毫秒 |
| 超时行为 | 自动降级为异步,并关闭半同步状态标志 |
| 拓扑要求 | 至少两个候选从库,避免单点退化 |
典型使用场景
- 对数据丢失敏感的业务,要求主库故障时最多丢一个未确认事务
- 同城双机房:用近端从库做半同步确认,远端做异步
- 切换演练前提高数据安全等级,降低切换时的数据损失
- 希望提升复制可靠性但不引入组复制的运维复杂度
- 订单、支付类核心库的复制链路加固
安装与启用
安装与启用
-- 源端(主库)
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled = 1;
-- 从库端
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled = 1;
-- 确认状态:Rpl_semi_sync_source_status 为 ON 表示生效
SHOW STATUS LIKE 'Rpl_semi_sync%';关键参数
关键参数
[mysqld]
rpl_semi_sync_source_enabled = 1
rpl_semi_sync_source_timeout = 1000 # 毫秒,超时后降级并告警
rpl_semi_sync_source_wait_for_replica_count = 1 # 至少 N 个从库确认
rpl_semi_sync_source_wait_point = AFTER_SYNC # 默认值,先等确认再提交
# 从库侧
rpl_semi_sync_replica_enabled = 1状态与参数速查
| 项 | 含义 | 关注点 |
|---|---|---|
| Rpl_semi_sync_source_status | 半同步当前是否生效 | 显示 OFF 说明已降级为异步 |
| no_times 类计数 | 超时降级发生的次数 | 持续增长说明从库响应慢或掉线 |
| wait_point | 等待确认的时机 | AFTER_SYNC 是默认与推荐值 |
| wait_for_replica_count | 需要确认的从库个数 | 设大更安全但更容易触发降级 |
| source_timeout | 等待确认的毫秒上限 | 过小会频繁降级,过大则失去收益 |
半同步只保证事务已被从库接收,不保证从库已经提交或写入磁盘;真正追求零丢失要考虑组复制(MGR)或共享存储类方案。
只有一个从库时启用半同步,从库一断主库就退化成异步,反而让人以为仍受保护:至少配置两个候选从库,并把降级事件接入告警。