K8S集群中Mysql问题 Got timeout reading communication packets

K8S集群中Mysql问题 Got timeout reading communication packets

出现的一个问题,记录一下,以及给出解决方案,具体是什么导致的,暂未可知

前提:

在MYSQL的内部约束中有个表,叫做host_cache表,该表记录了连接到mysql的连接的信息,有个字段 **max_connect_errors **定义了某个ip的中断连接错误的上限,某个ip超过了这个上限就会被mysql拉入黑名单,拒绝连接。这个机制mysql用来保护自己不受攻击。

详细的表字段可以在官方文档中查看:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-host-cache-table.html

这里只说三个字段:

  • IP:每个连接的ip地址,主键
  • HOST:DNS解析后的域名或HOSTNAME
  • SUM_CONNECT_ERRORS:已经连续出现中断错误的次数,如果在 max_connect_errors以内连接成功,该字段会被清零,每个IP都有对应的错误个数,单独计数。

操作以及现象

问题发生在K8S集群中部署的mysql服务,但是该问题不局限于容器化的mysql。
现象:mysql的host_cache表中的错误链接次数会增加,然后查看mysql日志会发现有Got timeout reading communication packets 类似错误。

我们把集群中的mysql的svc类型设置为nodeport,

  1. 我们自己的容器化服务使用mysql的域名访问,解析出来的IP就是对应的服务的podIP,域名就是该服务的域名。没出现中断错误超过最大错误连接数的

  2. 我们自己的不能容器化的服务,只有keystone通过私网的节点IP+nodeport来访问数据库。阿里云的DBS备份也是通过该形式来访问。mysql将该连接解析为某张虚拟网卡的IP,没有域名,出问题的环境解析的网卡ip都是以0 结尾。该形式出现中断错误数超过最大错误连接数的情况,导致通过此种方式的连接全部被mysql拒绝。

  3. 以集群的公网IP+mysql nodeport去访问,此为navicat访问形式,mysql解析为节点的私网ip,其实也是某张网卡的IP。该连接没出现问题。

  4. 昨晚在预升级环境,我们把keystone、阿里的DBS以及我们容器化的与mysql有交互的服务全部卸载后,出现了一个现象,有一个未知服务每隔10分钟就对mysql发起tcp连接以及关闭连接。访问形式就是nodeip+port,此时mysql的错误数+1。当把mysql的svc改为clusterip时,十分钟两次的访问未出现。

探讨的一些结论

  1. MYSQL IP解析问题
    通过nodeip+mysqlport形式访问mysql,mysql反dns解析会解析成某个网卡的ip 20.201.38.0
    通过公网IP+mysqlport形式访问mysql,mysqlfan反dns解析会解析成主机的网卡ip
    原因应该是,解析的dns服务不认识,不知道最开始来源的连接ip,就将该连接的ip解析成转发到mysql服务的网卡ip
  2. mysql中断错误类型,什么时候才会+1
    网络波动;程序被突然中断,之前的连接还保留着(因为占用的文件或者连接被锁),可能会造成中断连接
  3. 十分钟两次的是什么东西,什么原因
    可以肯定是通过nodeip+mysqlport访问的形式,第一种可能是某个应用程序在循环跑,第二个可能是我们自己的某个程序没有被卸载干净,或者是卸载后某个类似读取文件建立连接的进程突然被杀死但是这个文件或者连接还是被锁着占用着,所以会定时的维护这个状态。

疑问点

  1. K8S对于服务的网络调用链路是如何转发的,在mysql svc不同形式以及外部访问的不同形式访问时,网络链路是怎么走的?
  2. K8S的DNS解析问题,对于IP是如何解析的
  3. 如何复现网络波动,以造成错误+1
  4. 我们的环境的错误连接数是什么原因造成的,是网络波动还是,某个应用程序连接总出错
  5. 预生产环境的十分钟2次,是哪个程序引起的,还是某个残余的进程,或文件,连接占用,有没有那个程序能对应上10分钟这个频率。
  6. 预生产环境如何能把十分种2次复现

相关参考

telnet ip port 可以复现mysql错误,此时的mysql错误日志是:Got timeout reading communication packets

十分钟两次的mysql错误日志: Got an error reading communication packets

  1. https://dev.mysql.com/doc/refman/8.0/en/host-cache.html#blocked-host------mysql官方解释DNS和缓存
  2. https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html-----------mysql官方解释连接状态变量
  3. https://dev.mysql.com/doc/refman/8.0/en/performance-schema-host-cache-table.html----mysql官方host_cache表
  4. https://dev.mysql.com/doc/refman/8.0/en/communication-errors.html--------------------通讯错误和连接中断

解决方案

  1. 手动刷新cache表将错误数归零
  2. 将最大错误数调到最大
  3. 跳过DNS解析的验证,此种方式也可以增强mysql性能。也就是将cache表的大小调到0 --skip-name-resovle=on
  4. 禁用最大错误数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: “Got timeout reading communication packets”是MySQL数据库错误信息的一种,意思是读取通信包时超时了。在MySQL数据库,通信包是用于传输数据的基本单位。当客户端连接到数据库服务器时,它们之间通过网络通信进行数据传输。如果客户端连接超时或者服务器没有及时响应,就会出现超时错误。 通常情况下,这种错误是由于网络连接不稳定或者服务器过载引起的。为了解决这个问题,可以尝试以下几个方法: 1.检查网络连接是否稳定并进行修复。 2.尝试重新启动数据库服务器。 3.增加服务器硬件资源,例如内存和处理器。 4.调整数据库配置参数以提高性能。 总之,如果出现“Got timeout reading communication packets”这个错误,需要观察网络连接和服务器资源,尝试从多个方面寻找问题解决方法。 ### 回答2: “got timeout reading communication packets”是MySQL数据库经常遇到的错误,意思是在读取通信数据包时发生了超时。这个错误可能由各种原因引起,比如网络传输问题MySQL服务器配置不当等。下面我将详细说明该错误的可能原因和解决方法。 1. 网络传输问题 网络传输问题是造成MySQL服务器“got timeout reading communication packets”错误的主要原因之一。网络故障可能导致MySQL长时间无法与客户端通信,从而出现超时错误。在这种情况下,可以通过检查网络连接、服务器负载和数据库配置等来解决问题。 2. MySQL服务器配置问题 另一个常见的原因是MySQL服务器配置不当。MySQL服务器在处理大量查询时,需要适当配置参数。如果参数设置不合理,就会导致“got timeout reading communication packets”错误。这种情况下,应该重新配置MySQL服务器,增加缓存和调整参数。 3. 过度使用系统资源 “got timeout reading communication packets”错误还可能是由过度使用系统资源导致的。MySQL服务器需要足够的内存和CPU资源来处理查询。如果服务器过度使用系统资源,就会导致超时错误。在这种情况下,可以尝试优化服务器或添加更多资源来解决问题。 4. 版本不兼容 MySQL客户端和服务器之间版本不兼容也可能导致“got timeout reading communication packets”错误。如果不同的MySQL版本使用不同的通信协议,则可能会导致版本不兼容。在这种情况下,升级服务器或客户端到同一版本可能会解决问题。 综上所述,“got timeout reading communication packets”错误可能由网络传输问题MySQL服务器配置、过度使用系统资源或版本不兼容导致。通过调整配置、优化服务器或升级MySQL版本等方式,我们可以解决这个问题。如果您遇到了这个错误,请根据实际情况采取相应的措施来解决。 ### 回答3: “got timeout reading communication packets”是MySQL Server一个常见的错误信息。它通常会在与MySQL服务器进行通信时发生,并表示客户端程序与服务器之间的连接已经断开或超时。 MySQL服务器的连接过程是通过传送和接收命令包(communication packets)来实现的。一旦客户端程序(如phpMyAdmin或MySQL Workbench)发送一个请求到MySQL服务器,这个请求就会被转化为一个命令包并被发送到服务器。服务器收到命令包后,会对其进行处理并将响应打包成命令包返回给客户端程序。然后客户端程序接收响应并进行处理。 如果客户端程序与服务器之间的连接断或无响应,就会出现“got timeout reading communication packets”错误信息。这通常可能由以下原因导致: 1. 网络故障:可能是客户端程序和服务器之间的网络连接出现了问题,导致命令包无法发送或响应无法接收。 2. MySQL服务器负载过重:如果MySQL服务器的负载太高,客户端程序可能无法与服务器进行通信。这可能是由于大量连接或查询请求造成的。 3. 防火墙或网络安全设置:如果有防火墙或其他网络安全设置,可能会阻止客户端程序与服务器进行通信。 要解决“got timeout reading communication packets”错误信息,可以采用以下几种方法: 1. 检查网络设置:检查客户端程序和服务器之间的网络连接是否稳定。尝试使用其他设备或连接尝试连接到MySQL服务器,以查看是否存在网络故障。 2. 优化MySQL服务器:优化MySQL服务器以解决服务器负载过重的问题,可能需要升级硬件或对服务器配置进行调整。 3. 调整防火墙或网络安全设置:检查网络安全设置或防火墙设置,以确保客户端程序可以与MySQL服务器进行通信。可以尝试禁用安全软件或调整网络设置以解决问题。 需要注意的是,虽然“got timeout reading communication packets”错误信息较为常见,但实际产生该错误的原因可能因情况而异。因此,如果以上方法无法解决问题,建议查看MySQL服务器日志文件以获取更多有关错误信息的信息,并在必要时向数据库管理员求助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值