资料内容:
【缺陷分析】半同步下多从库复制异常
本文分析的缺陷是 MySQL bug#89370,其主要的现象是:配置半同步(复制)到多个从库,部分从库在一段
时间内无法复制数据,但所有复制状态均正常。
1 缺陷的复现
MySQL 版本:5.7.16,5.7.17,5.7.21
1. 配置半同步一个 master 两个 slave,设置 master 的
rpl_semi_sync_master_wait_for_slave_count=2,保持一定数据压力
2. 检查 master 的
rpl_semi_sync_master_status 状态为 ON,确保半同步没有退化为异步
3. 设置 master 的
rpl_semi_sync_master_wait_for_slave_count=1
4. 重启一个 slave “stop slave; start slave”
可以观察到步骤 4 中重启的那个 slave 长达数分钟不会有 master 的复制数据流入,但查看复制状态均正
常。
2 缺陷的原理图解
下图中按序解析了 MySQL 半同步插件在 binlog group commit 中扮演的角色:
binlog group commit 分为三个阶段:
1. Flush Phase(图中序号 2): 将一组事务写入 binlog 缓存区,向半同步插件注册事务(图中序号
2.1),更新 binlog 文件位置信息(图中序号 2.2)
2. Sync Phase(图中序号 4): 对 binlog 做 fsync 操作,将一组事务一起刷入磁盘
3. Commit Phase(图中序号 5): 等待半同步完成,在引擎层提交事务