场景
client A 和 es server 不在一个 网络里面,只开了 9200端口通信。
client A 和 es 之间ping 不通。
问题
每个一段时间,比如过了一个晚上,访问es 的时候,总有一些请求 会timeout。
但是再发几个,或者重启都没有为问题。
root cause
linux server 的tcp 默认开启 tcp_keep_alive 机制。
默认2个小时,没有连接的话,就会去 发包探测对方是否还活着。
按道理,如果keep alive 机制正确的话,是不会断开连接的。
问题出在了网络环境,也就是我们 的client 和serve 不再一个 内网,需要过 核心路由器。
核心路由器一般都会有 一个 长连接掐断功能。
我们的核心路由器设置的时间是 30mins,所有很多连接被掐断了。
解决方案
- 要么修改 tcp 的keep alive 时间,小于 30mins。
- 要么在应用层自己发送 heartbeat。
我们用的是自己发送 heartbeat。
网友评论