在一主多从架构下配置 MySQL 半同步复制,需要在主库和至少一个从库上安装半同步插件,并将主库设置为等待至少一个从库确认事务提交。适用场景是对数据一致性要求较高且能接受少量写入延迟的系统,风险边界在于网络波动可能导致主库降级为异步复制。
先说结论:MySQL 半同步复制能确保主库提交的事务至少被一个从库接收,但需权衡写入延迟与网络稳定性。
- 适合:对数据丢失零容忍、主从网络延迟稳定的核心业务库。
- 先准备:确认 MySQL 版本支持半同步插件,检查主从网络连通性及延迟。
- 验收:通过状态变量确认半同步连接建立,模拟从库故障验证主库降级机制。
命令速用版
以下命令需在主库和从库分别执行,注意替换插件文件名以匹配实际版本。
# 主库安装并启用插件 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 10000; # 从库安装并启用插件 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
为什么会这样
半同步复制的核心机制是主库在提交事务前等待从库的 ACK 确认信号。
异步复制中,主库写完 binlog 即返回成功,从库延迟读取可能导致数据丢失。半同步复制要求主库等待至少一个从库接收并写入中继日志后返回成功。在一主多从架构下,默认只需其中一个从库确认即可,这既保证了数据冗余,又避免了等待所有从库带来的过高延迟。若超时未收到确认,主库会自动切换回异步复制以保证可用性。
分步处理
按顺序在主库和从库上执行配置,确保插件加载成功且参数生效。
步骤 1:确认版本与插件文件
MySQL 5.5 及以上版本内置半同步插件,但 5.7 之前需手动加载。检查 plugin 目录是否存在semisync_master.so和semisync_slave.so。
步骤 2:主库配置
在主库执行安装命令,设置超时时间。超时时间建议设置为网络往返延迟的 3-5 倍,单位毫秒。
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 10000;
步骤 3:从库配置
在所有计划参与半同步的从库上安装插件并启用。一主多从场景下,无需所有从库都开启,但建议至少开启两个从库以防单点故障。
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
步骤 4:持久化配置
将上述SET GLOBAL参数写入配置文件my.cnf或my.ini,防止重启失效。
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000 [mysqld] rpl_semi_sync_slave_enabled=1
怎么验证是否生效
通过状态变量检查主从半同步连接状态及客户端会话属性。
主库检查:
SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';
若Rpl_semi_sync_master_status值为ON,且Rpl_semi_sync_master_clients大于 0,表示半同步复制已建立。
从库检查:
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
值为ON表示从库已启用半同步功能。
会话检查:
新建一个主库连接,执行SHOW SESSION STATUS LIKE 'Rpl_semi_sync_master_wait_sessions';,写入数据后观察等待情况。
常见坑
- 超时降级风险:当网络抖动或从库负载过高导致 ACK 超时,主库会自动切回异步复制,此时写入不再强一致,需监控
Rpl_semi_sync_master_no_tx计数增长。 - 从库全挂影响:若所有开启半同步的从库宕机,主库在超时后会降级为异步,写入性能可能波动,但不会阻塞主库服务。
- 插件版本匹配:主从库 MySQL 版本不一致可能导致插件文件名不同或协议不兼容,升级前需核对官方文档。
- 事务提交感知:半同步仅针对事务提交,非事务表(如 MyISAM)或不提交的操作不受半同步保护。
常见问题
半同步复制会影响所有从库吗?
不会,主库默认只需等待一个从库确认即可提交事务。
在一主多从架构下,主库配置半同步后,只要任意一个启用了半同步插件的从库返回 ACK,主库即认为成功。其他未启用或延迟高的从库不影响主库提交,但仍会异步接收数据。
从库宕机后主库会阻塞吗?
不会永久阻塞,主库会在超时后自动降级为异步复制。
主库参数rpl_semi_sync_master_timeout控制等待时长,默认 10 秒。超时后主库记录日志并切换为异步模式,保证业务写入可用,但此时数据一致性保障暂时失效。
MySQL 8.0 配置有什么不同?
MySQL 8.0 默认可能未加载插件,且支持更细粒度的等待策略。
8.0 版本依然使用相同的插件名,但引入了rpl_semi_sync_master_wait_for_slave_count参数,允许配置等待多个从库确认,默认值为 1,保持与旧版本兼容。
参考来源
- MySQL Official Documentation, "Replication Plugins", https://dev.mysql.com/doc/refman/8.0/en/replication-plugins.html
- MySQL Official Documentation, "Semi-Synchronous Replication", https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html