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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
问题描述  
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 这种服务来说必然会造成一些问题。  




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL Shell
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
1140 0
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
|
SQL 关系型数据库 MySQL
Ruoyi从mysql切换到postgresql的几个坑
本文详细介绍基于ruoyi的数据库从mysql切换到postgresql详细步骤。
821 0
Ruoyi从mysql切换到postgresql的几个坑
|
5月前
|
负载均衡 网络协议 关系型数据库
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景 2
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景
90 2
|
5月前
|
关系型数据库 MySQL 网络安全
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景 1
rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景
69 0
|
SQL 关系型数据库 MySQL
MySQL + Keepalived 双主热备搭建
MySQL + Keepalived 双主热备搭建
781 1
MySQL + Keepalived 双主热备搭建
|
关系型数据库 MySQL Linux
Mysql主从复制与高可用主备切换搭建完整详细版
Mysql主从复制与高可用主备切换搭建完整详细版
|
Cloud Native 关系型数据库 MySQL
【阿里云镜像】切换阿里镜像,加速MySQL下载
【阿里云镜像】切换阿里镜像,加速MySQL下载
367 0
【阿里云镜像】切换阿里镜像,加速MySQL下载
|
负载均衡 Kubernetes 网络协议
三高Mysql - 搭建“三高”架构之扩展与切换(下)
三高Mysql - 搭建“三高”架构之扩展与切换(下)
703 0
|
SQL 存储 算法
三高Mysql - 搭建“三高”架构之扩展与切换(上)
三高Mysql - 搭建“三高”架构之扩展与切换(上)
171 0
|
关系型数据库 MySQL Linux
Linux篇-mysql + keepalived高可用
Linux篇-mysql + keepalived高可用
153 0
Linux篇-mysql + keepalived高可用