
※こちらの記事は2017年にQiitaに投稿した記事を再編集したものです
こちらの記事でElasticsearchの複数台クラスタが作れるようになりました。
せっかくなので、あとからノードを追加する検証をしてみます。
環境はこちらを再利用します。
検証手順
現状の確認をする
$ curl $(docker-machine ip elasticsearch1):9200/_cluster/health?pretty
{
"cluster_name" : "docker-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
$ curl $(docker-machine ip elasticsearch1):9200/_cat/shards?v
index shard prirep state docs store ip node
test 2 r STARTED 0 130b 192.168.99.105 bmXE705
test 2 p STARTED 0 130b 192.168.99.106 fyEAVyY
test 1 p STARTED 0 130b 192.168.99.104 efZ1klG
test 1 r STARTED 0 130b 192.168.99.106 fyEAVyY
test 4 r STARTED 0 130b 192.168.99.105 bmXE705
test 4 p STARTED 0 130b 192.168.99.104 efZ1klG
test 3 p STARTED 0 130b 192.168.99.105 bmXE705
test 3 r STARTED 0 130b 192.168.99.104 efZ1klG
test 0 p STARTED 0 130b 192.168.99.105 bmXE705
test 0 r STARTED 0 130b 192.168.99.106 fyEAVyY
インデックス作成時に特にシャーディングについての設定を実施していないので、
testインデックスのプライマリシャードは5、レプリカシャードは1でインデックスが作成されており、
各シャードは以下のように配置されています。
Trending
※プライマリシャード=PS、レプリカシャード=RS
ホスト | PS0 | PS1 | PS2 | PS3 | PS4 | RS0 | RS1 | RS2 | RS3 | RS4 |
---|---|---|---|---|---|---|---|---|---|---|
elasticsearch1 (192.168.99.104) | ○ | ○ | ○ | |||||||
elasticsearch2 (192.168.99.105) | ○ | ○ | ○ | ○ | ||||||
elasticsearch3 (192.168.99.106) | ○ | ○ | ○ |
追加のコンテナホストを起動する
それではElasticsearchクラスタにノードを追加してみます。
まずはコンテナホストを起動します。
$ docker-machine create --driver virtualbox elasticsearch4
$ docker-machine ssh elasticsearch4 sudo sysctl -w vm.max_map_count=262144
Elasticsearchコンテナを起動する
ノードが増えるので起動オプションのdiscovery.zen.ping.unicast.hosts
とdiscovery.zen.minimum_master_nodes
の値を追加します。
$ eval $(docker-machine env elasticsearch4)
$ docker run -d \
-e "network.host=_eth1:ipv4_" \
-e "discovery.zen.ping.unicast.hosts=$(docker-machine ip elasticsearch1),$(docker-machine ip elasticsearch2),$(docker-machine ip elasticsearch3)" \
-e "discovery.zen.minimum_master_nodes=3" \
-e "xpack.security.enabled=false" \
-e "xpack.monitoring.enabled=false" \
-e "xpack.watcher.enabled=false" \
-e "xpack.graph.enabled=false" \
-e "xpack.ml.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
--network="host" \
-p 9200:9200 \
-p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:5.4.0
追加結果を確認する
まずはクラスタの状態を確認します。
$ curl $(docker-machine ip elasticsearch1):9200/_cluster/health?pretty
{
"cluster_name" : "docker-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 4,
"number_of_data_nodes" : 4,
"active_primary_shards" : 5,
"active_shards" : 10,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
以下になっていれば新しいノードがクラスタに参加できています。
- statusがgreen
- ノードが3→4
- データノードが3→4
続いて作成済みのインデックスの状態を確認します。
$ curl $(docker-machine ip elasticsearch1):9200/_cat/shards?v
index shard prirep state docs store ip node
test 2 r STARTED 0 130b 192.168.99.107 TZj8_YT
test 2 p STARTED 0 130b 192.168.99.106 fyEAVyY
test 1 p STARTED 0 130b 192.168.99.104 efZ1klG
test 1 r STARTED 0 130b 192.168.99.106 fyEAVyY
test 4 r STARTED 0 130b 192.168.99.105 bmXE705
test 4 p STARTED 0 130b 192.168.99.104 efZ1klG
test 3 p STARTED 0 130b 192.168.99.105 bmXE705
test 3 r STARTED 0 130b 192.168.99.104 efZ1klG
test 0 p STARTED 0 130b 192.168.99.107 TZj8_YT
test 0 r STARTED 0 130b 192.168.99.106 fyEAVyY
以下のように再配置されていることが確認できました。
ホスト | PS0 | PS1 | PS2 | PS3 | PS4 | RS0 | RS1 | RS2 | RS3 | RS4 |
---|---|---|---|---|---|---|---|---|---|---|
elasticsearch1 (192.168.99.104) | ○ | ○ | ○ | |||||||
elasticsearch2 (192.168.99.105) | ○ | ○ | ||||||||
elasticsearch3 (192.168.99.106) | ○ | ○ | ○ | |||||||
elasticsearch4 (192.168.99.107) | ○ | ○ |
まとめ
適切にパラメータを指定して起動すれば勝手にノード追加してシャードの再配置までしてくれるのは便利です。
データの永続化をしていないので既存ノードのパラメータを修正できませんでしたが、
永続化してローリングアップデートの要領でdocker stop
とdocker run
を繰り返していけば既存コンテナのパラメータ変更もできそうです。
コメント