一、半同步复制 (Semi-Synchronous Replication)
1. 工作原理
半同步复制介于异步复制和全同步复制之间:
- 主库:事务提交时,至少等待一个从库接收并写入relay log后才返回成功给客户端
- 从库:不需要等待从库执行完事务,只需确认接收
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 事件分析
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