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_nodes
は5 / 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ごとに設定をすることもできる。