Elasticsearchのshardとreplica
先週、箱根へ小旅行した帰りのロマンスカーでぼんやりと話したElasticsearchのshardとreplicaの話です。
どこかに書いたような気もするけど、メモごとどこかになくしたらしいので、忘れないように書きとめることにしました。
shard
elasticsearchのshardはluceneの1インスタンスで、 elasticsearchに自動管理されているワーカーと考えてよい。
shardを増やせば並列数があがって1ノードのパフォーマンスがあがるかもしれない。
デフォルトでは5つのshardを作ることになっているけど、設定によって変えることもできるし、インデックスごとにshardsの数を設定することもできる。
ただし、shardの数はインデックス生成後に変更できない。
replica
一方のreplicaはノードのコピー。マスターノードを除いたクラスタ内でのコピー数。 ノードを増やして負荷を分散したり、ノードがダウンした際に代わりに頑張らせたりする。
デフォルトは1になっているので、何も考えずにelasticsearchを立ち上げると、
cluster health: yellow
になる。(1ノードのみだとレプリカが配置されないため)
shardと同じようにreplica数もインデックスごとに設定できる。こちらは後から変更できる。
設定例
これらの設定は/etc/elasticsearch/elasticsearch.yml
に書く。
設定ファイルには書いてあるけど、開発環境での設定例は、shards: 1
とreplicas: 0
、worker 1つにコピーは作らない。(開発環境だからね)
- 開発環境での設定例
index.number_of_shards: 1 index.number_of_replicas: 0
- デフォルトの設定
index.number_of_shards: 5 index.number_of_replicas: 1
のままでインデックスを作ると、cluster health: yellow (1, 5)
になってしまい気持ち悪いので、インデックスのreplicaとshardの数を開発環境に合わせて設定し直すのがオススメ。
replicaとshardの数を変更するには update indices setting
APIを使う。
curl -XPUT 'localhost:9200/_settings' -d ' { "index" : { "number_of_replicas" : 0 } }'
上の例はreplica数を0に(コピーを作らなく)する。cluster health: green
になって幸せ。