[请教] MySQL server has gone away 与 TIME_WAIT 的关系

2017-06-17 17:53:47 +08:00
 lmfx89

在阿里云配置了 MySql(RDS) 的读写分离地址后,在 PHP 中使用该地址进行更新操作时提示如下报错:

1.提示错误

MySQL server has gone away (SQL:xxx)

此时切换回 主数据的 连接地址就恢复正常不再报错。

提交工单获得的答复是 TIME_WAIT 过多。

2.目前了解的情况

一. TIME_WAIT 连接数如下:

[root@machine ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 3
ESTABLISHED 568
TIME_WAIT 1268

二. 多数 TIME_WAIT 如下,后者( 192.168.0.10:6379 )是 Redis Docker 容器的地址、端口。

tcp        0      0 192.168.0.1:35180       192.168.0.10:6379       TIME_WAIT  
tcp        0      0 192.168.0.1:34520       192.168.0.10:6379       TIME_WAIT  
tcp        0      0 192.168.0.1:34798       192.168.0.10:6379       TIME_WAIT  
tcp        0      0 192.168.0.1:49738       192.168.0.8:9000        TIME_WAIT  
tcp        0      0 192.168.0.1:36198       192.168.0.10:6379       TIME_WAIT  
tcp        0      0 192.168.0.1:34762       192.168.0.10:6379       TIME_WAIT  

三. 本机的 PHP、Nginx、Redis 运行在不同的容器中。

google 到减少 TIME_WAIT 的方法是:

修改 /proc/sys/net/ipv4/tcp_tw_recycle 等参数

但是又有相关文献说明修改该参数会导致 NAT 网络下的客户端连不上..遂放弃修改

3.目前想请教大家的地方

1.TIME_WAIT 过多会导致上述问题吗?如果是,那么为什么通过主数据的地址连接没问题,通过读写分离地址去连接就有问题呢?(实际上在另一台服务器上连接两个地址都没有问题...)

2.修改 tcp_tw_reuse 参数是否可以减少服务器 TIME_WAIT 的数量呢,资料上讲该参数主要用于客户端,但这里的客户端指连接 Redis 的机器( 192.168.0.1 本机)还是指用户呢。

一些自造、怕大家误会的名词

主数据库:最近在原先数据库上增加了只读数据库用于分担压力。原先的可读写数据我叫它主数据库

主数据库的地址读写分离地址:通过前者连接会直接对主数据库进行读写,通过后者时在进行读操作时会优先从新增的读数据库读取。

先谢谢大家的指教。

1331 次点击
所在节点    问与答
2 条回复
billlee
2017-06-17 18:54:33 +08:00
完全没看明白你到底是哪台服务器有 TIME_WAIT
lmfx89
2017-06-17 19:09:13 +08:00
@billlee #1 实在抱歉,我先去复习一下提问的艺术.. 先不打扰大家了。

感谢回复。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX