問題描述
公司新搭了一套ES集群,4臺機器,ES版本7.5.0,前期搭建十分順利,但集群運行一段時間后會出現問題。問題具體體現為節點間通訊異常,集群會重新選主,但選主之后只能通過新的主節點進行集群操作,其他節點無法加入主節點。
通過查詢ES的日志,我們發現如下報錯:
[WARN ][o.e.c.s.MasterService ] [node-1] failing [elected-as-master ([2] nodes joined)[{node-2}{lY51PsdiSW-kBOYQFYjQQw}{HtVGqYX2QRyEjVwQJQEVvA}{134.85.21.43}{134.85.21.43:9303}{dilmrt}{ml.machine_memory=67385552896, ml.max_open_jobs=20, xpack.installed=true, transform.node=true} elect leader, {node-1}{8hu8HMjLRJSJoDNtxtJ1LQ}{bT_S2fTXSeq8GfCwsHUsAA}{134.85.21.42}{134.85.21.42:9303}{dilmrt}{ml.machine_memory=67385552896, xpack.installed=true, transform.node=true, ml.max_open_jobs=20} elect leader, _BECOME_MASTER_TASK_, _FINISH_ELECTION_]]: failed to commit cluster state version [986]
org.elasticsearch.cluster.coordination.FailedToCommitClusterStateException: publication failedat org.elasticsearch.cluster.coordination.Coordinator$CoordinatorPublication$4.onFailure(Coordinator.java:1467) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.action.ActionRunnable.onFailure(ActionRunnable.java:88) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:39) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.common.util.concurrent.EsExecutors$DirectExecutorService.execute(EsExecutors.java:226) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.common.util.concurrent.ListenableFuture.notifyListener(ListenableFuture.java:106) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.common.util.concurrent.ListenableFuture.addListener(ListenableFuture.java:68) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.cluster.coordination.Coordinator$CoordinatorPublication.onCompletion(Coordinator.java:1390) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.cluster.coordination.Publication.onPossibleCompletion(Publication.java:125) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.cluster.coordination.Publication.onPossibleCommitFailure(Publication.java:173) ~[elasticsearch-7.9.0.jar:7.9.0]at org.elasticsearch.cluster.coordination.Publication.access$500(Publication.java:42) ~[elasticsearch-7.9.0.jar:7.9.0]
大體意思就是說node-1無法加入node-2為主節點的集群。
這里有兩個問題,首先node-1原本是主節點,為什么它要加入別人的節點?其次,為什么node-1無法加入集群?
問題分析
從現象上看,集群中原本node-1為主節點,現在node-2成了主節點,也就是說原本主節點出現了問題,導致集群重新選主。但通過對日志的觀察,我們沒有看到集群有明顯的錯誤。
通過在網絡上的搜到的解決辦法,可以調整ES集群的連接超時時間配置
cluster.publish.timeout: 15s
cluster.fault_detection.leader_check.timeout: 5s
cluster.fault_detection.follower_check.timeout: 5s
cluster.follower_lag.timeout: 10s
修改之后還是沒有效果,集群正常運行一段時間后還是會發生異常。
經過一陣研究我們發現,原來還是主機之間的通訊有些問題,我們需要修改一下主機之間的通訊保持參數。/etc/sysctl.conf
:
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 60
執行命令試配置生效:
sysctl -p