場景
client A 和 es server 不在一個(gè) 網(wǎng)絡(luò)里面,只開了 9200端口通信。
client A 和 es 之間ping 不通。
問題
每個(gè)一段時(shí)間,比如過了一個(gè)晚上,訪問es 的時(shí)候,總有一些請求 會timeout。
但是再發(fā)幾個(gè),或者重啟都沒有為問題。
root cause
linux server 的tcp 默認(rèn)開啟 tcp_keep_alive 機(jī)制。
默認(rèn)2個(gè)小時(shí),沒有連接的話,就會去 發(fā)包探測對方是否還活著。
按道理,如果keep alive 機(jī)制正確的話,是不會斷開連接的。
問題出在了網(wǎng)絡(luò)環(huán)境,也就是我們 的client 和serve 不再一個(gè) 內(nèi)網(wǎng),需要過 核心路由器。
核心路由器一般都會有 一個(gè) 長連接掐斷功能。
我們的核心路由器設(shè)置的時(shí)間是 30mins,所有很多連接被掐斷了。
解決方案
- 要么修改 tcp 的keep alive 時(shí)間,小于 30mins。
- 要么在應(yīng)用層自己發(fā)送 heartbeat。
我們用的是自己發(fā)送 heartbeat。