一、半同步复制 (Semi-Synchronous Replication)

1. 工作原理

半同步复制介于异步复制和全同步复制之间:

  • 主库:事务提交时,至少等待一个从库接收并写入relay log后才返回成功给客户端
  • 从库:不需要等待从库执行完事务,只需确认接收
ClientMasterSlave执行事务发送binlog事件确认接收(Ack)返回提交成功ClientMasterSlave

2. 配置参数

参数 作用 推荐值
rpl_semi_sync_master_enabled 主库启用半同步 ON
rpl_semi_sync_slave_enabled 从库启用半同步 ON
rpl_semi_sync_master_timeout 主库等待Ack超时(ms) 10000
rpl_semi_sync_master_wait_for_slave_count 最少确认从库数 1

3. 特性对比

复制模式 数据安全性 性能影响 适用场景
异步复制 低(可能丢数据) 无影响 非关键业务
半同步复制 中(确保到达从库) 轻微延迟 金融交易类
全同步复制 高(强一致性) 高延迟 极少使用

二、binlog_format 详解

1. 三种格式对比

格式 记录方式 特点 存储空间 适用场景
STATEMENT (SBR) 记录SQL语句 兼容性好,函数结果可能不一致 5.7以下版本
ROW (RBR) 记录行数据变更 精确,安全 生产推荐(5.7+)
MIXED 自动切换SBR/RBR 平衡安全与性能 中等 过渡方案

2. 关键参数配置

-- 查看当前格式
SHOW VARIABLES LIKE 'binlog_format';

-- 动态修改(需重启生效)
SET GLOBAL binlog_format = 'ROW';

3. 格式选择建议

  • 必须使用 ROW 格式的场景
    • 主从数据强一致需求
    • 使用UUID()、RAND()等非确定性函数
    • 涉及触发器、存储过程
  • 可以使用 STATEMENT 的场景
    • 旧版本兼容(MySQL < 5.7)
    • 明确知道无函数副作用

三、半同步与binlog_format的关系

1. 数据安全组合

组合 数据安全性 典型配置
异步复制 + STATEMENT binlog_format=STATEMENT
半同步 + ROW binlog_format=ROW + 半同步参数

2. 生产环境推荐配置

-- 主库配置
[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL  # 记录完整行数据
sync_binlog = 1          # 每次事务提交刷盘
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000

-- 从库配置
[mysqld]
server_id = 2
log_bin = mysql-bin
binlog_format = ROW
log_slave_updates = ON    # 级联复制时需要
rpl_semi_sync_slave_enabled = 1

四、故障排查技巧

1. 半同步状态监控

-- 查看主库半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync%';

-- 关键指标解释
Rpl_semi_sync_master_status      # 当前是否半同步模式
Rpl_semi_sync_master_yes_tx     # 成功通过半同步的事务数
Rpl_semi_sync_master_no_tx      # 降级为异步的事务数

2. binlog 事件分析

# 解析binlog内容(ROW格式需解码)
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000123

3. 常见问题解决

  • 半同步超时降级
    • 检查从库IO线程状态:SHOW SLAVE STATUS\G
    • 增大rpl_semi_sync_master_timeout
  • ROW格式binlog过大
    • 设置binlog_row_image=MINIMAL(只记录变更列)
    • 定期清理binlog:PURGE BINARY LOGS BEFORE '2023-01-01'

五、版本差异说明

特性 5.7及以下 8.0+
半同步 插件方式 内置支持
binlog默认格式 STATEMENT ROW
组提交优化 一般 多线程优化

最佳实践:MySQL 8.0+ 生产环境建议:
ROW格式 + 半同步 + GTID

作者:admin  创建时间:2025-06-06 11:13
最后编辑:admin  更新时间:2025-06-07 09:49