tjinjin's blog

インフラ要素多めの個人メモ

AmazonESのスケールアウト・スケールインを検証した

About

🎄「Amazon Web Services Advent Calendar 2017」8日目の記事です 🎄

よくわかってなかったので試しました。

qiita.com

スケールイン・アウトの検証

  • Amazon ES 2.3
  • master 3
  • datanode 2

初期設定

primary shardを指定

$ curl -XPUT $ES/bank -d '{"settings":{ "number_of_shards": 1,"number_of_replicas":1}}'
$ curl -XPUT $ES/ldgourmet -d '{"settings":{ "number_of_shards": 1,"number_of_replicas":1}}'

sampleデータの登録

$ curl $ES/bank/account/_bulk --data-binary "@accounts.json"
$ cat restaurants.simple.json | ./stream2es stdin --target $ES/ldgourmet/restaurant
$ curl $ES/_cat/indices
green open ldgourmet 1 1 214236 0 420.4mb 189.6mb
green open bank      1 1   1000 0 748.5kb 374.2kb

スケールアウト

data nodeをコンソールから 2 -> 6にします。blue greenのような動きをするので、台数が一時的に14台になります(旧node 5台 + 新node 9台)

$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 14,
  "number_of_data_nodes": 8,
  "active_primary_shards": 2,
  "active_shards": 4,
  "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
}
# shardの移行が起きている(起こるタイミングは不明)
$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 14,
  "number_of_data_nodes": 8,
  "active_primary_shards": 2,
  "active_shards": 4,
  "relocating_shards": 1,
  "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
}

relocationg_shardsが終わったら、replica shard の数を変更をします。

$ curl -XPUT $ES/ldgourmet,bank/_settings -d '{"number_of_replicas": 5}'
$ curl $ES/_cat/indices
green open ldgourmet 1 5 214236 0   1gb 183.2mb
green open bank      1 5   1000 0 2.1mb 374.2kb

f:id:cross_black777:20171203011407p:plain

スケールイン

次にスケールインを試します。気になったので2パターンで実行します。

1. data node数を先に変更する

data node 6 -> 4にコンソールから変更します。

$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 16,
  "number_of_data_nodes": 10,
  "active_primary_shards": 2,
  "active_shards": 12,
  "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
}
$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "yellow",
  "timed_out": false,
  "number_of_nodes": 7,
  "number_of_data_nodes": 4,
  "active_primary_shards": 2,
  "active_shards": 8,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 4,
  "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": 66.66666666666666
}

割当できないreplica shardがある状態になってしまっているので、replica shard数を変更します。

$ curl -XPUT $ES/ldgourmet,bank/_settings -d '{"number_of_replicas": 3}'
$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 7,
  "number_of_data_nodes": 4,
  "active_primary_shards": 2,
  "active_shards": 8,
  "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
}

statusもgreenになってますね。

$ curl -s $ES/_cat/indices
green open ldgourmet 1 3 214236 0 733mb 183.2mb
green open bank      1 3   1000 0 1.4mb 374.2kb

f:id:cross_black777:20171203013925p:plain

2. replica shard数を先に減らす

$ curl -XPUT $ES/ldgourmet,bank/_settings -d '{"number_of_replicas": 1}'
$ curl -s $ES/_cat/indices
green open ldgourmet 1 1 214236 0 366.5mb 183.2mb
green open bank      1 1   1000 0 748.5kb 374.2kb
$ curl -s $ES/_cluster/health | jq .
{
  "cluster_name": "hogehoge:tjinjin-test",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 12,
  "number_of_data_nodes": 6,
  "active_primary_shards": 2,
  "active_shards": 4,
  "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
}
$ curl -s $ES/_cat/indices
green open ldgourmet 1 1 214236 0 366.5mb 183.2mb
green open bank      1 1   1000 0 748.5kb 374.2kb

特に問題なくスケールインできました。

f:id:cross_black777:20171203015616p:plain

まとめ

スケールアウトとスケールインを試しました。Amazon ESの変更はBlue−greenでおこなれているため、10分前後はかかる印象です。データ量とかによると思うので長めに見積もったほうがいいかもしれないです。