关于以haproxy作为中间层的mongodb连接定时断开问题

ipkfc 2016-06-17 04:35:57
加精
使用mongoose连接mongodb数据库,以haproxy作为中间层,配置:
defaults
log global
option dontlognull
option tcplog
option clitcpka
option tcpka
option srvtcpka
maxconn 2000
retries 3
timeout queue 5m
timeout connect 30s
timeout client 5m
timeout server 5m
timeout http-keep-alive 10s
timeout check 10s
timeout client-fin 30s
timeout server-fin 30s
stats enable
balance roundrobin

frontend mongodb
bind x.x.x.x:port
mode tcp
bind localhost:port
default_backend mongodb
...
连接建立后,5分钟断开,查看log信息显示状态码为cD,如果client timeout时间调大,则是sD;

如果将 timeout client,timeout server去掉,程序会恢复正常,但haproxy会报warning,建议将加上;

有没有哪位大神碰到过,求指导下,多谢!!!急
...全文
5446 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chyanch 2016-06-22
  • 打赏
  • 举报
回复
HAproxy 重启自然会使用定义的各参数 timeout client/server, 所以当client,server http process idle超过 5m 后自然会中断. HAproxy 建议将timeout client/server 的值能统一,一般3m or 5m 都是比较常用的值。 如果要将设置为不timeout 则给一个较大的值: 如 timeout client/server 365d (365 天) --但要和操作系统的tcp/http timeout 值匹配。 - s : seconds. 1s = 1000ms - m : minutes. 1m = 60s = 60000ms - h : hours. 1h = 60m = 3600s = 3600000ms - d : days. 1d = 24h = 1440m = 86400s = 86400000ms 如果要将这两个值设为不timeout,下面有个官方说明可以看看。 This parameter is specific to backends, but can be specified once for all in "defaults" sections. This is in fact one of the easiest solutions not to forget about it. An unspecified timeout results in an infinite timeout, which is not recommended. Such a usage is accepted and works but reports a warning during startup because it may results in accumulation of expired sessions in the system if the system's timeouts are not configured either. 补充说明一下 如果是linux 的话 tcp keep live 的时间为 7200s = 2hours $cat /proc/sys/net/ipv4/tcp_keepalive_time 7200
ipkfc 2016-06-22
  • 打赏
  • 举报
回复
调整不timeout的确不会有问题,因为haproxy不会主动断连接了,那么mongodb的连接就不会断开重连了,但是这种方法会导致连接不被释放问题,也就是haproxy根本不知道客户端已经断开连接了,之前也怀疑是这个配置的问题,但是官方也说了不建议不配置timeout的,所以还得从其它地方入手解决。 修改超时时间也测过,一样的效果 另外就是我前面说的50s以下的保活定时器能够解决这个问题,这个是很奇怪的现象,如果说保活能有效果,那么在5min以内只要保活一次就够了,但事实却不是;当然这个也侧面排除了你说的端口阻塞的情况,不过我找个时间看下,很感谢你的建议。
chyanch 2016-06-22
  • 打赏
  • 举报
回复
先不考虑第二点短时间大量客户端连接断开的情况,调整不timeout后如果问题消失,是否可以定位为timeout时间配置的问题,连接时查看端口状态是否有阻塞导致。缩小timeout (比5m小)时间,仅供参考。
ipkfc 2016-06-22
  • 打赏
  • 举报
回复
你好,谢谢chyanch的回复,不过你这个解决不了问题的! 你说的第一点是haproxy发现客户端处于非活跃状态时会5分钟超时,但是我在2楼中说过,使用保活定时器定时查找数据库,实际就是向haproxy发送请求并转发给mongodb的,结果还是会5分钟断开连接,所以想知道为何会这样,怎么解决? 第二点设置值改大或者不配置(不超时主动断连接,即英文部分,会有告警),这些都会导致一个问题,如果短时间内有大量客户端连接并断开,会导致连接资源耗尽,haproxy最大连接数是有限制的,这样就得不到及时释放。 至于系统tcp参数,这个本来就很大了,2个小时跟5分钟超时貌似不沾边,我也尝试过修改,并没有用。
ipkfc 2016-06-18
  • 打赏
  • 举报
回复
竟然沉了。。。 经过测试发现加个保活定时器,时间间隔50s以下,能够保证连接不断,原因未知; 原来测试60s时连接也未出现断开重连,但是重启haproxy后就出现5分钟断开重连现象了,原因未知; 因此,经过长时间测试结果,目前使用50s定时器保活方案解决该问题。 期待有大神能提供此问题的原因,然后从根本上解决!!!

742

社区成员

发帖
与我相关
我的任务
社区描述
该论坛主要探讨Linux系统在IBM Power平台的安装、部署、应用开发等话题,并为网友们提供自由交流的平台。
社区管理员
  • Power Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧