一、集群现象
集群大概每隔2小时左右崩溃一次 ,崩溃的持续时间为10分钟左右 ,日志表现形式如下
[2018-09-18T01:37:43,071][WARN ][o.e.d.z.UnicastZenPing ] [node-1] failed to send ping to [{node-3}{3i0mQX2yRqyD5oqMny5srw}{aVphjfqBQ7mHpi5EncF8tg}{xxx.xxx.32}{xxxxxx:9300}{ml.machine_memory=16657965056, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}]
org.elasticsearch.transport.ReceiveTimeoutTransportException: [node-3][10.112.188.32:9300][internal:discovery/zen/unicast] request_id [59813] timed out after [3750ms]
at org.elasticsearch.transport.TransportService$TimeoutHandler.run(TransportService.java:987) [elasticsearch-6.3.2.jar:6.3.2]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:626) [elasticsearch-6.3.2.jar:6.3.2]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
二、解决方案
先说方案:修改tcp_keepalive的配置 以下为默认配置
# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
深入的原理请参考这篇文章
https://blog.trifork.com/2015/04/08/dealing-with-nodenotavailableexceptions-in-elasticsearch/
了解到Es集群和系统防火墙的设置有关系。(在排查问题过程中 本地集群没有开启防火墙,导致问题没有复现)如果开启了防火墙,并且没有调整系统关于tcp keepalive的参数时就会出现该问题,调整的配置如下,默认系统的配置为 7200 (2小时) 每次重试间隔75s 重试 9次 后 ,系统才会报告该tcp已经断开连接。 和Es集群崩溃的现象时间间隔吻合。
通过查找官网资料发现也有相关的说明。
Es官网中也有给出相关的警告 不过没有仔细阅读导致花费大量的时间去排查问题。
如下图所示 明确要求 保持空闲的长连接的重要性。
网友评论