在阿里云配置了 MySql(RDS) 的读写分离地址
后,在 PHP 中使用该地址进行更新操作时提示如下报错:
MySQL server has gone away (SQL:xxx)
此时切换回 主数据的 连接地址就恢复正常不再报错。
提交工单获得的答复是 TIME_WAIT 过多。
一. 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 网络下的客户端连不上..遂放弃修改
1.TIME_WAIT 过多会导致上述问题吗?如果是,那么为什么通过主数据的地址连接没问题,通过读写分离地址去连接就有问题呢?(实际上在另一台服务器上连接两个地址都没有问题...)
2.修改 tcp_tw_reuse
参数是否可以减少服务器 TIME_WAIT 的数量呢,资料上讲该参数主要用于客户端,但这里的客户端指连接 Redis 的机器( 192.168.0.1 本机)还是指用户呢。
主数据库
:最近在原先数据库上增加了只读数据库用于分担压力。原先的可读写数据我叫它主数据库
主数据库的地址
、读写分离地址
:通过前者连接会直接对主数据库进行读写,通过后者时在进行读操作时会优先从新增的读数据库读取。
先谢谢大家的指教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.