环境
IP | 版本 | 角色 | PORT | 复制模式 |
---|---|---|---|---|
172.0.0.66 | 5.6.10 | Master | 3306 | 半同步 |
172.0.0.68 | 5.6.10 | slave | 3306 | 半同步 |
172.0.0.68 | 5.6.10 | slave | 3307 | 半同步 |
参数
Master端
mysql> show global status like '%semi%';
+--------------------------------------------+-----------+
| Variable_name | Value |
+--------------------------------------------+-----------+
| Rpl_semi_sync_master_clients | 2 |
| Rpl_semi_sync_master_net_avg_wait_time | 508 |
| Rpl_semi_sync_master_net_wait_time | 480620193 |
| Rpl_semi_sync_master_net_waits | 945539 |
| Rpl_semi_sync_master_no_times | 2 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 910 |
| Rpl_semi_sync_master_tx_wait_time | 576324352 |
| Rpl_semi_sync_master_tx_waits | 633076 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 1 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1900240 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-----------+
15 rows in set (0.00 sec)
mysql> show global variables like '%semi%';
+------------------------------------+---------+
| Variable_name | Value |
+------------------------------------+---------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+------------------------------------+---------+
6 rows in set (0.01 sec)复制
Slave端
mysql> show global variables like '%semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+------------------------------------+-------+
6 rows in set (0.00 sec)复制
注释:
本次使用的MySQL是5.6
5.7 中的show global variables like '%semi%' 会多两个参数 rpl_semi_sync_master_wait_for_slave_count: master获得ACK的数量 rpl_semi_sync_master_wait_point : master 等待ACK的位置
场景模拟
一个脚本不断往master插入数据
#!/bin/bash
for i in {1..300000}
do
#sleep 1
/mysql/bin/mysql -uroot -p'mbV' -e "insert into test_li.t1 values($i)"
/mysql/bin/mysql -uroot -p'mbV' -e "select i from test_li.t1 order by i desc limit 1;"
done复制
关闭半同步
总述:
1.调整master 参数
2.关闭slave半同步
3.关闭master半同步
操作
1.调整master参数
set global rpl_semi_sync_master_timeout=100;
set global rpl_semi_sync_master_wait_no_slave='off';复制
注 在5.7 中还可以 rpl_semi_sync_master_wait_for_slave_count
设置为下线后的slave数(最小为1,因此该参数只能平稳的缩减半同步的slave数而不能达到关闭半同步的效果)
目的:
rpl_semi_sync_master_timeout
在slave关闭半同步的时候缩短等待ACK锁的时间rpl_semi_sync_master_wait_no_slave
:设置为off,是当一个发生半同步降级后,如果slave 追上同步,MySQL不会自动升级为半同步模式
2. 关闭slave 半同步,并重启复制
重点注意:
注意 MySQL 5.6 中的master 获取ack 数量和有多少个slave无关(N>=1) 即只有当所有的半同步的slave都停了的时候才会发生ack 等待.因此只关闭1个slave 是不会发生ACK等待,不需要也不能关闭master的半同步模式
set global rpl_semi_sync_slave_enabled='off';
stop slave;
start slave;复制
3.关闭master 半同步
set global rpl_semi_sync_master_enabled='off';
复制
错误操作
如果直接关闭所有slave 导致ACK等待
mysql> show processlist;
+--------+----------+-------------------+---------+-------------+------+-----------------------------------------------------------------------+-------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+----------+-------------------+---------+-------------+------+-----------------------------------------------------------------------+-------------------------------------+
| 1 | root | localhost | test_li | Sleep | 66 | | NULL |
| 45964 | root | localhost | NULL | Query | 0 | init | show processlist |
| 755735 | rpl_user | 172.0.0.68:57061 | NULL | Binlog Dump | 441 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 764915 | root | localhost | NULL | Query | 142 | Waiting for semi-sync ACK from slave | insert into test_li.t1 values(1715) |
+--------+----------+-------------------+---------+-------------+------+-----------------------------------------------------------------------+-------------------------------------+
4 rows in set (0.00 sec)复制
解决办法: 恢复一个slave 的半同步即可恢复
错误解决发生ACK等待的操作
调整 rpl_semi_sync_master_timeout 和rpl_semi_sync_master_wait_no_slave 参数在master操作不会影响现有回话的
(可以证明关闭半同步 先调整set global rpl_semi_sync_master_timeout
set global rpl_semi_sync_master_wait_no_slave
参数的重要性)
并且线上请求很多,无法容忍通过等待频繁的降级升级半同步的方法将现有堵塞事务完成,并断开回话,除非进行kill关闭master 的半同步 set global rpl_semi_sync_master_enabled='off'; 该操作会造成数据库宕机!!!!!!!!!!!!!!!!!!!!!!!!!
文章转载自天天李拜天DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
2700次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
803次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
451次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
412次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
368次阅读
2025-04-15 14:48:05
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
263次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
242次阅读
2025-04-30 17:37:37
SQL优化 - explain查看SQL执行计划(下)
金同学
227次阅读
2025-05-06 14:40:00
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
220次阅读
2025-04-18 20:21:32
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
179次阅读
2025-04-30 12:17:54