半同步复制
介于异步与全同步之间的复制模式:主库提交时等待至少一个备库确认『已收到日志』,收到确认就返回客户端,不必等备库应用完成。这样在保证数据不丢的前提下,把等待时间压到网络往返量级。等待超时会自动退化为异步,可用性保住了,但退化期间存在数据丢失窗口,这一点必须被监控覆盖。
基本信息
| 适用平台 | MySQL(插件 rpl_semi_sync_source/replica)、MariaDB 半同步插件 |
|---|---|
| 语义 | 备库确认收到日志即返回,不等应用完成 |
| 关键参数 | 超时时间(毫秒)、等待副本数 |
| 退化行为 | 超过超时时间未收到确认则转为异步,写不再阻塞 |
典型使用场景
- 核心交易库要求数据不丢,同时不能接受全同步带来的高延迟
- 同城双机房部署:专线时延低,半同步带来的额外延迟可接受
- 规避异步复制的数据丢失:主库故障切换时尽量减少未同步事务
- 作为过渡方案:从异步升级到更强一致性前的中间状态
- 跨机房主备的日常运行模式,配合监控确认从未长时间退化
MySQL 半同步关键参数
MySQL 半同步关键参数
# 主库:安装并启用插件后设置
rpl_semi_sync_source_enabled = ON
rpl_semi_sync_source_timeout = 1000 # 毫秒,超时退化为异步
rpl_semi_sync_source_wait_for_replica_count = 1 # 至少等待几个副本确认
# 备库
rpl_semi_sync_replica_enabled = ON
# 运行期核对状态(MySQL 8.0 变量名)
# SHOW VARIABLES LIKE 'rpl_semi_sync%';
# SHOW STATUS LIKE 'Rpl_semi_sync_source_status'; # ON 表示当前仍是半同步状态读法
| 指标 | 含义 | 异常表现 |
|---|---|---|
| plugin status | 插件是否启用 | 未启用时参数设置无效,实际仍是异步 |
| Rpl_semi_sync_source_status | 当前是否处于半同步 | 长期 OFF 说明已退化并持续丢数据风险 |
| 超时计数 | 退化发生次数 | 频繁增长说明副本慢或网络抖动 |
| 等待副本数 | 每次提交等待的副本数量 | 大于拓扑实际副本数时会次次等到超时 |
超时退化保证了可用性,但也意味着『退化为异步的那段时间』存在数据丢失窗口。监控必须同时覆盖插件状态与退化计数,只报警『复制断了』是不够的。