俺です。
Elasticsearch(ES5.0)でsprit brainな状況に遭遇したので遺書を残します。
ES古いとか言わず。
人生もsprit brainです。
ESクラスタが突然の死
- node1が高負荷になり9200portへの接続ができなくなってしまったのでEC2をstop/startした
- node2がmasterになるも高負荷のため9200portへ接続受け付けない状態になった
- node1復帰後にnode2へ接続しようとするが接続できない
- node2のElasticSearchをkill -9して停止した
ESクラスタのノードが全て停止してしまった
[YYYY-MM-DDTHH24:MI:SS][INFO ][o.e.n.Node ] [node1] started
[YYYY-MM-DDTHH24:MI:SS][DEBUG][o.e.a.a.c.s.TransportClusterStateAction] [node1] no known master node, scheduling a retry
[YYYY-MM-DDTHH24:MI:SS][INFO ][o.e.d.z.ZenDiscovery ] [node1] failed to send join request to master [{node2}{XXXXXXXXXXXXXX}{YYYYYYYYYYYY}{XX.XX.XX.XX}{XX.XX.XX.XX:9300}]
- node1復帰後に接続エラーを繰り返している状態のときのクラスタ(
master_not_discoverd_exception
)
$ curl localhost:9200/_cat/nodes
{"error":{"root_cause":[{"type":"master_not_discovered_exception","reason":null}],"type":"master_not_discovered_exception","reason":null},"status":503}
ESクラスタノードの起動と絶望
- node1を最初に起動する
- node1がmasterになる
- node2を起動するとすでにmasterへjoinされているノードとして認識されてしまう絶望
[YYYY-MM-DDTHH24:MI:SS][INFO ][o.e.d.z.ZenDiscovery ] [node2] failed to send join request to master [{node1}[internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {node2}, found existing node {node2} with the same id but is a different node instance]; ]
[YYYY-MM-DDTHH24:MI:SS][WARN ][o.e.g.MetaStateService ] [node2] [_global]: failed to write global state
- clusterの状態
- node1(masterノード)だけ起動している
- node2は接続されているけども正しい状態を保持していない
$ curl localhost:9200/_cat/nodes
node1 XX YY M XXX XXX XXXX mdi * node1
node2 **ココにナニも状態が描かれない** mdi - node2
masterへ接続できなくなったノードのnode.lockファイルを消す
- node.lock が
/var/lib/elasticsearch/nodes/<node_number>/node.lock
につくられている - masterへ接続できないnodeで該当ファイルをrmする
- データディレクトリやindexディレクトリ・ファイルは削除しなくてOK
$ ps -ef|grep elastic
<ESプロセスが止まっていること. monitなどでディスカバリしてる場合は止める>
$ rm -f /var/lib/elasticsearch/nodes/0/node.lock
$ sudo service elasticsearch start
$ curl localhost:9200/_cat/nodes
以下のようにclusterのmaster/memberが見えていればOK
node1 XX YY M XXX XXX XXXX mdi * node1
node2 XX YY M XXX XXX XXXX mdi - node2
おわり