社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Elasticsearch における Sharding

Sharding とは
1. Sharding とは、インデックスを小さなピースに分割するための手段
2. それぞれのピースは Shard として扱われる
3, Sharding はインデックスレベルで行われる(クラスタやノードレベルではない)
4. Sharding によってデータが均等にノードに分けられる
⇒1つのノードに収まらない大きなサイズのインデックスを複数のノードに分けて格納することが可能になる

Shard とは
1. インデックス単位で独立している(厳密には違うらしいが、そのように捉えても差し支えない)
2. Shard は Apache Lucene index である
3. 即ち、Elasticsearch のインデックスは複数の Lucene indices で構成されている
4. Shard はサイズは固定されておらず、ドキュメントの増加に伴い増加する
5. Shard は20億ものドキュメントを保持するケースもある

Sharding する目的
1. Sharding することで、数十億ものドキュメントを1インデックスに保持することがある
2. Sharding することで、データをノードに合わせたサイズにすることができる
3. Sharding することで、検索時のクエリが並行処理することが可能となり、パフォーマンスの向上
⇒複数のシャード上で並行処理が行われる

pri とは primary shard のことで、もし複数の Shard が存在している場合、ここに複数の番号が付与される。
f:id:blueskyarea:20200621223625p:plain

Elasticsearch バージョン7未満まではデフォルトで5つの Shard が生成されていた。
しかしながら、小さなインデックスに対して Shard を作成することは問題(over-sharding)が起こることがあった。

そのため、バージョン7からはデフォルトで1つのShard が生成される。
Shard を増やすためには、Split API を使用する。
Shard を減らすためには、Shrink API を使用する。
⇒どれくらいのドキュメントを格納するかによって、Shardの数を見積する必要がある。

最適な shard の数は?
求めるための公式はない。
⇒多くの要素に依存する
⇒ノードの数やキャパシティ、インデックスの数やサイズ、クエリの数など
もし1インデックスに対して、数百万のドキュメントが予想されるのであれば、5つのShardで様子を見てみるとよいかもしれない。