すずけんメモ

技術メモです

Elasticsearchのクラスタにノードを追加するときにやっていること

Elasticsearchのクラスタにノードを追加するのは簡単にできる。しかし、インデックスを盛々積んだクラスタにノードをカジュアルに追加すると、一気にシャードのアロケーションが走って負荷があがる。また、何の設定もせずに追加するとsplit brainを起こしやすくなる。適切に設定すれば大丈夫なので、それをまとめておく。

結論

安全にやるなら、

  • ノード追加前に全shardの移動を止める。
  • split brainを避けるために、最小のマスターノード数を設定しておく。

ということをしておくとよい。

クラスタ設定はリアルタイムに変更できるので活用しよう。

Cluster Update Settings http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-update-settings.html

ノード追加前の準備

シャードの移動をとめておく。また、最小のマスターノード数を普段よりちょっと多めに設定しておく。こうしておけばsplit brainを防げる。なお、discovery.zen.minimum_master_nodesの設定はノード数 / 2 + 1にしておく。ノードを追加するときは追加したあとのノード数に合わせて設定しておくとよい。

例えば、3ノードのクラスタに2ノード追加するとする。その場合、discovery.zen.minimum_master_nodes5 / 2 + 1 = 3.5なので、3か4にしておく。

$ curl -XPUT http://es1:9200/_cluster/settings -d '{
"persistent": {"cluster.routing.allocation.enable": "none"}
}'
{"acknowledged":true,"persistent":{"cluster":{"routing":{"allocation":{"enable":"none"}}}},"transient":{}}%

$ curl -XPUT http://es1:9200/_cluster/settings -d '{
"persistent": {"discovery.zen.minimum_master_nodes": 3}
}'
{"acknowledged":true,"persistent":{"discovery":{"zen":{"minimum_master_nodes":"3"}}},"transient":{}}%

実際にノードを追加する。ノードを追加した際にclusterに追加されている様子はelasticsearch-headなどでみるのがよい。

mobz/elasticsearch-head https://github.com/mobz/elasticsearch-head

split brainしていないか観察しておく。もしsplit brainしてしまったら、discoveryをもう一度走らせる必要があるので気をつけよう。

無事ノードがクラスタに追加されたことを確認したら、シャード移動を許可するようにする。

$ curl -XPUT http://es1:9200/_cluster/settings -d '{
"persistent": {"cluster.routing.allocation.enable": "all"}
}'
{"acknowledged":true,"persistent":{"cluster":{"routing":{"allocation":{"enable":"none"}}}},"transient":{}}%

するとシャードが各ノードに移っていくことが確認できる。なお、デフォルトだと1インデックスにつき2シャードずつしか移動が行われないようになっている。cluster.routing.allocation.cluster_concurrent_rebalanceを調整することでこれを変更することもできる。1インデックスあたりのシャード数を多めに設定している場合には、この設定を増やすことによって、シャードの移動を早くすることができる。ただし、当然シャード移動のためのトラフィックも増えるので、そこはモニタリングしつつ行うようにする。

Cluster http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-cluster.html

他にも、もしDCが分かれているなどの場合にはそれぞれのrackごとに設定をすることもできる。