LoginSignup
4
8

More than 5 years have passed since last update.

Elasticsearchクラスタにノードを追加してみる

Posted at

こちらの記事で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でインデックスが作成されており、
各シャードは以下のように配置されています。

※プライマリシャード=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.hostsdiscovery.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 stopdocker runを繰り返していけば既存コンテナのパラメータ変更もできそうです。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8