6.6.3 半同步与增强半同步复制

半同步与增强半同步复制#

半同步复制介于异步与全同步之间:主库提交事务时需等待至少一个从库确认收到 binlog 后再返回成功。增强半同步(MySQL 5.7+)优化了提交点与回退策略,降低长时间阻塞与回退频率,适合对一致性有更高要求且需兼顾性能的场景。

原理与流程草图#

文章图片

安装与启用(主从一致)#

说明:半同步需主库与从库都安装插件;增强半同步在 MySQL 5.7+ 默认内置逻辑。

1)检查并安装插件

-- 主库/从库均执行
SHOW PLUGINS;
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  -- 主库
INSTALL PLUGIN rpl_semi_sync_slave  SONAME 'semisync_slave.so';   -- 从库

2)配置文件(示例路径)
- /etc/my.cnf(或 /etc/mysql/my.cnf

主库配置

[mysqld]
server_id=1
log_bin=mysql-bin
binlog_format=ROW

# 半同步相关
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=1000     # 单位毫秒

从库配置

[mysqld]
server_id=2
relay_log=relay-bin
read_only=ON

# 半同步相关
rpl_semi_sync_slave_enabled=ON

3)重启与生效检查

# systemd
systemctl restart mysqld

# 检查变量生效
mysql -e "SHOW VARIABLES LIKE 'rpl_semi_sync%';"
mysql -e "SHOW STATUS LIKE 'Rpl_semi_sync%';"

预期效果
- Rpl_semi_sync_master_status=ON
- Rpl_semi_sync_master_clients>=1

关键参数与命令解释#

  • rpl_semi_sync_master_enabled: 主库启用半同步。
  • rpl_semi_sync_slave_enabled: 从库启用半同步 ACK。
  • rpl_semi_sync_master_timeout: 主库等待 ACK 超时(毫秒)。
  • Rpl_semi_sync_master_status: 当前是否处于半同步模式。
  • Rpl_semi_sync_master_clients: 参与 ACK 的从库数量。

查看状态

SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';
SHOW STATUS LIKE 'Rpl_semi_sync_master_wait_time';

复制搭建与验证示例#

1)创建复制账号(主库)

CREATE USER 'repl'@'10.%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.%';
FLUSH PRIVILEGES;

2)从库指向主库并启动

CHANGE MASTER TO
MASTER_HOST='10.0.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;

3)验证半同步 ACK

-- 主库:查看是否有ACK客户端
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';

-- 从库:查看IO/SQL线程状态
SHOW SLAVE STATUS\G

4)验证回退逻辑(模拟超时)

-- 主库临时设置极短超时,观察回退为异步
SET GLOBAL rpl_semi_sync_master_timeout=1;

-- 观察状态是否回退
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';

常见故障与排错#

1)频繁回退为异步
- 排查从库延迟与性能:

SHOW SLAVE STATUS\G
SHOW STATUS LIKE 'Seconds_Behind_Master';
  • 调整等待超时:
SET GLOBAL rpl_semi_sync_master_timeout=2000;

2)ACK 客户端为 0
- 检查从库插件启用:

SHOW PLUGINS LIKE 'rpl_semi_sync_slave';
  • 检查从库是否 read_only=ON 与线程正常:
SHOW SLAVE STATUS\G

3)写入 RT 升高
- 查看 ACK 等待时间:

SHOW STATUS LIKE 'Rpl_semi_sync_master_wait_time';
  • 网络/磁盘瓶颈排查:
iostat -x 1 5
ping -c 5 10.0.0.2

监控与运维要点#

  • 重点监控:Rpl_semi_sync_master_statusRpl_semi_sync_master_wait_timeRpl_semi_sync_master_clients
  • 配合主从延迟、IO/SQL线程状态告警联动。
  • 若跨机房复制,评估 RTT 对写入延迟影响。

练习#

  1. 在测试环境搭建一主一从半同步复制,验证 Rpl_semi_sync_master_status=ON
  2. rpl_semi_sync_master_timeout 调为 1ms,观察回退行为并记录状态变化。
  3. 模拟从库 I/O 线程停止(STOP SLAVE IO_THREAD),观察主库 ACK 数量与回退状态。
  4. 恢复从库后验证半同步是否自动恢复为 ON。