故障分析

2023-11-06

作者:杨际宁

爱可生 DBA 团队成员,主要负责 MySQL 日常维护、故障处理和性能优化。对技术执着,为客户负责。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、背景说明

开发反馈连 router 报错:‘ERROR 1040 (HY000): Too many connections to MySQL Router’,

而后端 mysqlserver 上的连接却只有几个。经排查发现,当连接时间超过 wait_timeout 设定的值后,8.0.29 版本 router 的 TCP 连接并不会释放,且 8.0.30 版本的 router 依旧存在这个问题,因此采用降级的方式进行处理。

二、问题复现

mysqlserver 版本

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.28    |
+-----------+
1 row in set (0.01 sec)

router 版本

shell> ./mysqlrouter -V
MySQL Router  Ver 8.0.30 for Linux on x86_64 (MySQL Community - GPL)

router 端口设置为 8030 和设置最大连接数 max_connections = 3 方便复现

shell> egrep 'max|port' mysqlrouter.conf 
max_connections = 3
bind_port = 8030

开启 3 个会话

mysql> show processlist;
+-----+-----------------+---------------------+------+---------+--------+------------------------+------------------+
| Id  | User            | Host                | db   | Command | Time   | State                  | Info             |
+-----+-----------------+---------------------+------+---------+--------+------------------------+------------------+
|   5 | event_scheduler | localhost           | NULL | Daemon  | 427243 | Waiting on empty queue | NULL             |
| 146 | haha            | 10.186.65.132:33324 | NULL | Sleep   |    184 |                        | NULL             |
| 147 | haha            | 10.186.65.132:33326 | NULL | Sleep   |     14 |                        | NULL             |
| 148 | haha            | 10.186.65.132:33328 | NULL | Sleep   |      9 |                        | NULL             |
| 149 | root            | localhost           | NULL | Query   |      0 | init                   | show processlist |
+-----+-----------------+---------------------+------+---------+--------+------------------------+------------------+
5 rows in set (0.00 sec)

所有会话设置 wait_timeout = 10,超时断开连接

MySQL [(none)]> show databases; set wait_timeout=10;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> 

查看会话( 客户端已经断开连接,但不做任何操作将占有 router 的连接 )

mysql> show processlist;
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
| Id  | User            | Host      | db   | Command | Time   | State                  | Info             |
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
|   5 | event_scheduler | localhost | NULL | Daemon  | 427509 | Waiting on empty queue | NULL             |
| 157 | root            | localhost | NULL | Query   |      0 | init                   | show processlist |
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
2 rows in set (0.00 sec)

新建连接报错

shell> mysql -uhaha -p1 -h10.186.65.132 -P8030
ERROR 1040 (HY000): Too many connections to MySQL Router

查看 router 和 mysqlclient 的连接,并未释放

[root@router ~]# netstat  -lntpa |grep 8030
tcp        0      0 0.0.0.0:8030            0.0.0.0:*               LISTEN      15045/./mysqlrouter 
tcp        0      0 10.186.65.132:8030      10.186.65.137:56308     ESTABLISHED 15045/./mysqlrouter 
tcp        0      0 10.186.65.132:8030      10.186.65.137:56312     ESTABLISHED 15045/./mysqlrouter 
tcp        0      0 10.186.65.132:8030      10.186.65.137:56310     ESTABLISHED 15045/./mysqlrouter 


[root@mysql ~]# netstat  -lntpa |grep 8030
tcp        0      0 10.186.65.137:56308     10.186.65.132:8030      ESTABLISHED 3992/mysql          
tcp        0      0 10.186.65.137:56310     10.186.65.132:8030      ESTABLISHED 3990/mysql          
tcp        0      0 10.186.65.137:56312     10.186.65.132:8030      ESTABLISHED 3935/mysql 

三、抓包分析

先看看 mysqlserver端的包有没有什么异常

三次握手

超时断开连接

进行四次挥手,发现没有收到 router 说拜拜的信号

看下 router 端的抓包,可以看到的确没有说拜拜

没有收到 router 说拜拜的信号,router 的连接应该为 close_wait 的状态

那么 mysqlserver 端没有收到 router 回复的 [FIN, ACK],是不是只能一直在 FIN_WAIT2 的状态呢? TCP 没有对这个状态的处理,但是Linux 可以调整 tcp_fin_timeout 参数来设置一个超时时间。

那么 router 和 mysql_client 的连接呢?可以看到没有任何一方发送断开的请求

因此就会产生 mysqlserver 端已经断开了所有会话,但是 router 和 mysqlclient 并未断开,导致新建连接无法通过router 连接后端的 mysqlserver

8.0.28 版本的 router 并不会出现上述问题,可以看到 mysqlserver 端发送断开连接请求的时候,router 回复了[FIN, ACK],看一下 router 端的抓包

至于为什么四次挥手只抓到3个包,是因为把第2,3个包合并一起发送了,具体可以参考 RFC793 的3.5小节。

来看一下 mysqlserver 端的抓包

怎么 mysqlserver 端抓了4个包? 别被迷惑,其实 643 的包是 641 的回包

到这里, router 到 mysqlserver 端的连接是可以正常关闭的。

再看一下 8.0.28 版本的 router 和 mysqlclient 的连接呢, mysqlclient 端的抓包 (测试端口:6446)

可以看到 router 主动发送了断开的请求。

四、总结

测试发现 8.0.29 和 8.0.30 版本的 router 都会有此问题。

8.0.28 和 8.0.21 版本的 router 经过测试是不存在此问题的,其他版本有兴趣的可以测试一下。

可能和 router 8.0.29 版本的新功能 ‘Added connection pooling functionality to reuse server-side connections’ 有关系。

最后,因个人能力有限,如有错漏之处,敬请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

故障分析 的相关文章

随机推荐

  • MYSQL:事务

    事务 理解事务 事务操作 案例 事务的特性 事务的隔离级别 事务的隔离级别 操作 在MySQL中的事务 Transaction 是由存储引擎实现的 在MySQL中 只有InnoDB存储引擎才支持事务 事务处理可以用来维护数据库的完整性 保证
  • 大中型企业网项目实战2021-10-07

    1 问答题 大中型企业网项目实战 实验作业 一 安全管理 1 依据图中拓扑 为全网设备定义主机名 关闭域名解析 并在 Console 和VTY 线路下关闭线路超时并开启输出同步 依据图中拓扑在GNS3 IOU中搭建企业网 外链图片转存失败
  • 小程序封装form表单

    小程序封装form表单 在小程序中 表单是开发中最常用的组件之一 表单可以接收用户的输入数据 并提交给服务器进行处理 为了提高表单的复用性和减少代码重复 我们可以考虑对表单进行封装 使得表单可以在不同的页面中进行复用 本文将分享如何在小程序
  • 查看Linux系统信息

    1 登录到linux服务器执行 lsb release a 命令 即可查看所有版本信息 这个命令适用于所有的linux 包括Redhat SuSE Debian等发行版 注意 centos需要安准lsb LSB是一套核心标准 它保证了LIN
  • dubbo源码实践-serialize层的例子

    目录 1 serialize层概述 2 序列化的简单例子 2 1 项目截图 2 2 三个类的源码 2 2 1 ABC是实体类 2 2 2 TestSeriarsWrite把ABC对象序列化到文件中 2 2 3 TestSeriarsRead
  • Linux内核——cli()和sti()——标志寄存器的中断标志

    cli 和sti 有点类似于汇编指令中的CLI和STL 当某个任务在执行的过程中不想被中断 则可以在任务的开始出执行cli 在任务的结束处执行sti 恢复中断的执行 为了避免竞争条件和中断对临界代码区的干扰 在Linux 0 12内核代码中
  • IDEA中使用Junit测试

    文章目录 一 创建一个Maven项目 二 在Maven项目中添加JUnit依赖 三 创建测试类 一 创建一个Maven项目 二 在Maven项目中添加JUnit依赖 在pom xml中添加JUnit依赖
  • 【图解】用虚拟机做服务器

    最近在学nodejs 不知道有没有人跟我有一样的困惑 每次学新东西配置实验环境都是个麻烦事 其实也没那么麻烦 主要是当自己的电脑装了一堆环境 一堆IDE后 总会变得臃肿不堪 而且经常遇到莫名其妙的问题 解决麻烦 还容易造成系统的不稳定 而且
  • 支付宝支付回调代码(验签,订单状态,金额,appid等校验),支付, 提现相关demo

    1 支付回调 注意金额 用字符串 否则容易失真 验证失败 RequestMapping callBack public JSONMessage payCheck HttpServletRequest request HttpServletR
  • hadoop-3.0.0完整版HA部署

    一 环境准备 Linux7 2 hadoop 3 0 0 tar gz JDK1 8 二 下载源 hadoop3 0 0下载地址 https archive apache org dist hadoop common zookeeper 3
  • java ssh 密钥方式上传和操作远程服务器

    使用ssh公共密钥身份验证连接到远程系统是一种健壮 安全的替代使用帐户密码或密码登录方法 ssh公钥认证依赖于生成一对单独的密钥 即密钥对 一个 私有 和另一个 公共 的非对称密码算法 将私钥保密并将其存储在用来连接远程系统的计算机上 公钥
  • CSDN第一篇博客,找工作日记第一篇

    今天结束了UC公司的几轮面试 不确定能否拿到offer 但回顾近几天的校招情况 比起十一之前不顺利的过程来说的确让人欣慰了很多 最近考了很多公司的笔试 也面过4399 UC TP LINK等等 峰回路转地明天还要参加百度的面试 当然还有菲音
  • Virtual Box配置虚拟机网络

    简介 Virtual Box提供了多种网络模式 如图所示 但是我们常用的一般就三种 可以通过以下表格来了解三者区别 虚拟机 gt 主机 主机 gt 虚拟机 虚拟机 gt 其他主机 网络中 Bridged 桥接模式 Y Y Y NAT 网络地
  • MySQL锁机制和锁算法

    文章目录 MyISAM和InnoDB存储引擎锁区别 InnoDB锁机制 InnoDB 表级锁的锁模式 InnoDB 行锁模式及加锁方法 InnoDB 行锁实现方式 乐观锁和悲观锁 悲观锁 乐观锁 间隙锁 gap 锁 恢复和复制的需要 对In
  • 16种重要编程语言概览

    1 LISP 作者 麻省理工学院的人工智能研究先驱约翰 麦卡锡 John McCarthy 发明年代 1958年 应用领域 长期以来垄断人工智能领域的应用 Lisp 最初是作为展示程序的实用模型发布的 在 20 世纪 70 年代和 80 年
  • 黄金交易所可能采用自主监管模型

    点击上方 蓝色字 可关注我们 暴走时评 黄金现货交易涉及面广 因此相关监管一直是重大问题 印度政府已经决定对现货黄金交易所采取自主监管模式 利用区块链技术进行交易记录和黄金交接 而且交易信息加密之后 只有监管机构可以确定访问权 每笔交易有独
  • 脚本定时从服务器上拿文件,shell定时去指定服务器上取日志

    bin bash 生成昨天数字日期 dt date d last day Y m d dat date Y m d H M xg file brcb edp data public edp file ITMS dt 修改脚本 sed i 6
  • cudaEncode编码详细过程

    cudaEncode编码详细过程如下 一 ParseInputParams argc argv sEncoderParams 配置参数 输入 输出文件 配置文件 基本的参数 二 pCudaEncoder new VideoEncoder s
  • 浓缩就是精华

    凡人牧场 人生启示录 被称为世上最经典的25句话 转载 作者 晶晶鱼 提交日期 2003 12 31 15 32 40 记住该记住的 忘记该忘记的 改变能改变的 接受不能改变的 能冲刷一切的除了眼泪 就是时间 以时间来推移感情 时间越长 冲
  • 故障分析

    作者 杨际宁 爱可生 DBA 团队成员 主要负责 MySQL 日常维护 故障处理和性能优化 对技术执着 为客户负责 本文来源 原创投稿 爱可生开源社区出品 原创内容未经授权不得随意使用 转载请联系小编并注明来源 一 背景说明 开发反馈连 r