开发者社区> 摩云飞> 正文

【原创】基于 Keepalived 做主备的 MySQL 在切换时遇到的问题

简介:
+关注继续查看
问题描述 
MySQL 基于 keepalived 实现主备切换,业务 A 和业务 B (其实 A 和 B 上跑的业务是相同的 )同时使用 MySQL 做数据库查询。通过重启 keepalived 服务来测试 MySQL 主备切换后,能够为业务提供正常的服务。 

问题现象 
测试人员发现 MySQL 主从切换之后,与业务 A 相关的 TCP 连接信息已经变更为新 TCP 连接,而与业务 B 相关的 TCP 连接信息仍旧未变化。 

具体环境如下 
业务A:172.16.177.158 
业务B:172.16.177.159 

VIP:172.16.177.147 
MySQL master:172.16.177.148 
MySQL slave:172.16.177.149 

 


在业务正常运行状态下,业务A 通过 VIP 与 MySQL master(148)建立 6 条 TCP 连接(业务开发人员告知的),分别对应端口 
43666、 43668、 43669、 43670、 43673、 43674。 

当通过重启 148 机器上的 keepalived 服务来完成 VIP 切换,从而达成 MySQL 主备切换时,可以看到如下抓包信息: 

如下为 158 上的 TCP 链接信息。 
 
 
 

可以看到,上面出现了 10 个 RST ……,呃,先不管为什么多出来 4 个吧。 

下面看一下 148 (原 MySQL master)上来自 158 的连接信息。 
 
 

      从上面两个截图中,只能看到有两条 TCP 链路上出现了新的请求,并且因为重启了 keepalived 的原因,出现了 TCP 的重发。这两条 TCP 链路对应的端口分别为: 43673、43669。 
这里重发请求的端口与 158 上的抓包中显示的一致。 

再看一下 149 (原 MySQL slave)上来自 158 的连接信息。 
 
 
 

可以看到这里也出现了 10 条 TCP 链路被 RST 。与上面的 10 条 TCP 链接是对应的。 

综上,整个过程可以描述为: 
  • 最开始 158 与 148 建立了6条 OCS 业务的 TCP 连接;
  • 在重启 keepalived 的时候,恰好使用端口 43673 和 43669 的 TCP 连接正在信令交互,而此时正处于 VIP 147 从 148 向 149 漂移的过程之中,此时这两条 TCP 链路上的请求会因为得不到任何回应而触发重传;
  • 当 VIP 成功绑定到 149 上后,上述两条 TCP 链路上的重传请求会被 RST,而当其他 TCP 链路上有新的请求时,才会被 RST。被 RST 后,OSC 会重新建立 TCP 连接。
下面单独看下每条 TCP 链路的状况: 

端口 43673 的 TCP 链路。 
 
端口为 43669 的 TCP 链路。 
 
端口为 43666 的 TCP 链路。 
 
端口为 43674 的 TCP 链路。 
 
端口为 43670 的 TCP 链路。 
 
端口为 43668 的 TCP 链路。 
 
端口为 43671 的 TCP 链路。 
 
端口为 43665 的 TCP 链路。 
 
端口为 43672 的 TCP 链路。 
 
端口为 43667 的 TCP 链路。 
 


上述现象在对于 159 上的业务来说也是这样,不再重复说明。 

总结: 
      上述问题的出现值得思考的地方有,通过重启 keepalived 来促使 MySQL 主备切换这种方式对于实际应用场景是否有意义?!如果实际情况中真的出现类似于 keepalived 重启导致的 MySQL 主从切换,那么由此导致的主从不一致将如何解决 ?!业务程序通过某种保活机制触发对当前 TCP 链路是否处于“半打开”状态的检测时间间隔多少比较合适?MySQL 上的 wait_timeout 设置多少比较合适!? 
      真正让人感到不安的是,仅通过重启 keepalived 来进行主备切换,无论是 MySQL 侧还是业务侧,居然都不会收到 TCP 的 FIN 或 RST ,而只会在业务层面有“动作”时才能发现 TCP 链路的问题,这种现象对类似 MySQL 这种服务来说必然会造成一些问题。 




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux篇-mysql + keepalived高可用
Linux篇-mysql + keepalived高可用
92 0
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
608 0
使用 LVS+Keepalived 实现 MySQL 双主复制负载均衡高可用
使用 LVS+Keepalived 实现 MySQL 双主复制负载均衡高可用
187 0
MySQL + Keepalived 双主热备搭建
MySQL + Keepalived 双主热备搭建
391 0
MySQL主主模式+Keepalived高可用
先来说说背景吧,现在的项目为了高可用性,都是避免单节点的存在的,比如,我们的应用程序,都是部署多个节点,通过Nginx做负载均衡,某个节点出现问题,并不会影响整体应用。那么数据库层如何搭建高可用的架构呢?今天我们就来看看。
5515 0
Keepalived+MySQL双主配置实践
整理了近期在项目上做的一些技术研究,希望与大家共同探讨交流。 一:环境介绍 master1:10.124.151.20 master2:10.124.151.22 VIP:10.124.
1922 0
Mysql HA方案之MySQL半复制+MHA+Keepalived+Atlas+LVS(学习笔记十九)
http://hugnew.com/?p=749&utm_source=tuicool&utm_medium=referral 架构图 角色                    ip地址          主机名          M...
1214 0
Mysql +MHA+LVS+KEEPALIVED高可用,读写分离,负载均衡 搭建(学习笔记十八)
IP 主机名 角色 MHA 角色 172.16.54.226 MySQL-15.11 MySQL Master 主 Masterha-node 172.16.
1134 0
Mysql +MHA+LVS+KEEPALIVED高可用,读写分离,负载均衡(学习笔记十七)
http://blog.sina.com.cn/s/blog_166c0ec620102wz03.html 一、MHA及相关软件简介 MHA是一款MySQL高可用开源软件,实现MySQL一主多从架构下,主备的failover自动切换、手动切换、状态监控等功能,是比较常用的高可用解决方案之一。
1226 0
Mysql +keepalived+MHA高可用(学习笔记十六)
https://blog.csdn.net/yiyuf/article/details/40340895 http://www.cnblogs.com/yuanermen/p/3726572.html http://www.cnblogs.com/yuanermen/p/3726961.html http://www.cnblogs.com/yuanermen/p/3735263.html 一、MHA的简单介绍 MHA是由perl语言编写的,用外挂脚本的方式实现mysql主从复制的高可用性。
1282 0
Mysql +keepalived主从复制、主主复制(学习笔记十五)
https://www.2cto.com/database/201607/522147.html https://blog.csdn.net/ssdbbg/article/details/8205509 https://www.
1066 0
使用LVS+Keepalived实现Mysql的 负载均衡Web集群系统
目录 一、概念了解... 3 二、搭建集群... 3 2.1 集群架构设计... 3 2.2 基础准备工作... 3 2.3 配置两台Mysql服务器... 6 2.4 配置主负载服务器... 8 2.5 配置从负载服务器... 13 三、测试集群... 14   使用LVS+Keepalived实现Mysql的 负载均衡Web集群系统 一、概念了解 为了实现一个负载均衡的Web集群系统,综合比较之后,我决定选LVS+Keepalived+Mysql的方式。
3032 0
+关注
摩云飞
十年磨一剑,我还差几年~~
文章
问答
视频
相关电子书
更多
高效MySQL的N个习惯
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像