半同步复制无法保证“零丢失”,仅能缩小主库宕机时的数据丢失窗口;若主库崩溃且唯一半同步从库不可用,仍可能丢事务。

半同步复制无法保证“零丢失”,它只能显著缩小主库宕机时的数据丢失窗口;若主库崩溃且唯一半同步从库也同时不可用,仍可能丢事务。
确认主从异步复制已稳定运行
半同步是建立在异步复制之上的增强机制,不是独立复制通道。如果 SHOW SLAVE STATUS\G 中 Slave_IO_Running 或 Slave_SQL_Running 不为 Yes,或 Seconds_Behind_Master 持续增长,先别碰半同步——插件加载后也不会生效。
- 确保主库已开启
log_bin、server_id唯一,且从库server_id与主库不同 - 检查主库
GRANT REPLICATION SLAVE权限是否正确授予,网络能通(telnet master_ip 3306) - 从库执行
CHANGE MASTER TO后必须运行START SLAVE,且无IO/SQL Thread报错
安装并启用半同步插件(注意动态 vs 持久化)
插件名和 SO 文件名因 MySQL 版本略有差异:5.7 默认含 semisync_master.so 和 semisync_slave.so;8.0+ 可能需确认插件路径或使用 plugin-load-add。动态设置方便测试,但重启即失效。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';,再SET GLOBAL rpl_semi_sync_master_enabled = 1; - 从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';,再SET GLOBAL rpl_semi_sync_slave_enabled = 1; - 关键一步:从库必须重启 I/O 线程才能真正接入半同步流程 ——
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; - 写入配置文件更稳妥:
[mysqld]下添加rpl_semi_sync_master_enabled=1(主库)和rpl_semi_sync_slave_enabled=1(从库),避免服务重启后退化为纯异步
验证状态与超时行为(最容易被忽略的降级陷阱)
半同步不是“永远开启”的开关,它会在超时或从库失联时自动降级为异步复制,并持续尝试重连。不监控这个降级过程,等于没配。
- 主库查状态:
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';返回ON才表示当前处于半同步模式 - 同时看:
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';必须 ≥ 1;若为 0,说明没有从库成功注册为半同步节点 - 重点盯两个降级指标:
Rpl_semi_sync_master_no_tx(未收到 ACK 的事务数)和Rpl_semi_sync_master_no_times(超时次数)——值持续上涨说明网络或从库 relay log 写入慢 - 超时时间默认 10000 毫秒(10 秒),可调低(如 1000)缩短等待窗口,但过低会导致频繁降级;不要设为 0(等同于禁用)
为什么你看到 Rpl_semi_sync_slave_status 是 OFF?
从库上 SHOW STATUS LIKE 'Rpl_semi_sync_slave_status'; 显示 OFF 是常见现象,不代表失败——它只反映该从库是否正在以半同步方式接收 binlog,而这个状态依赖主库是否把它纳入半同步客户端列表。只要主库 Rpl_semi_sync_master_clients > 0 且 Rpl_semi_sync_master_status = ON,就说明半同步链路已通。
- 不要仅凭从库单点状态判断整体是否生效
- 如果主库
Rpl_semi_sync_master_clients一直为 0,检查从库是否真的完成了START SLAVE IO_THREAD,以及主库错误日志中是否有semi-sync相关拒绝记录 - 多从库环境下,只有显式启用了
rpl_semi_sync_slave_enabled并完成 I/O 线程重启的从库,才会被主库计入该计数器
真正决定数据能否“接近零丢失”的,不是插件是否装上,而是主库超时后是否及时告警、降级是否被感知、以及有没有配套的备份校验机制。半同步只是把“可能丢几个事务”压缩到“大概率只丢最后一个未确认事务”,别把它当成保险柜。

















