Elasticsearchでプライマリシャード数を増やす方法
最適なシャードスケーリングを実現するために、分割APIと再インデックスAPIを使用してElasticsearchのプライマリシャード数を増やす方法を学びます。
既存のインデックスのプライマリ シャード数を増やすことはできません。つまり、プライマリ シャード数を増やす場合は、インデックスを再作成する必要があります。このような状況で一般的に使用される方法は 2 つあります。_reindex API と _split API です。
_split API は、多くの場合、_reindex API よりも高速な方法です。両方の操作の前にインデックス作成を停止する必要があります。そうしないと、source_index と target_index のドキュメント数が異なります。

方法1 – 分割APIを使用する
分割 API は、設定をコピーし、既存のインデックスをマッピングすることで、必要な数のプライマリ シャードを持つ新しいインデックスを作成するために使用されます。作成時に必要なプライマリ シャードの数を設定できます。分割 API を実装する前に、次の設定を確認する必要があります。
ソース インデックスは読み取り専用である必要があります。これは、インデックス作成プロセスを停止する必要があることを意味します。
ターゲット インデックス内のプライマリ シャードの数は、ソース インデックス内のプライマリ シャードの数の倍数である必要があります。たとえば、ソース インデックスに 5 つのプライマリ シャードがある場合、ターゲット インデックスのプライマリ シャードを 10、15、20 などに設定できます。
注: プライマリ シャード番号のみを変更する必要がある場合は、再インデックス API よりもはるかに高速な分割 API が推奨されます。
分割APIの実装
テストインデックスを作成します。
POST test_split_source/_doc
{
"test": "test"
}分割するには、ソース インデックスが読み取り専用である必要があります。
PUT test_split_source/_settings
{
"index.blocks.write": true
}設定とマッピングはソース インデックスから自動的にコピーされます。
POST /test_split_source/_split/test_split_target
{
"settings": {
"index.number_of_shards": 3
}
}進捗状況は以下で確認できます:
GET _cat/recovery/test_split_target?v&h=index,shard,time,stage,files_percent,files_total設定とマッピングはソース インデックスからコピーされるため、ターゲット インデックスは読み取り専用になります。ターゲット インデックスへの書き込み操作を有効にしましょう。
PUT test_split_target/_settings
{
"index.blocks.write": null
}元のインデックスを削除する前に、ソース インデックスとターゲット インデックスの docs.count を確認します。
GET _cat/indices/test_split*?v&h=index,pri,rep,docs.countインデックス名とエイリアス名を同じにすることはできません。ソース インデックスを削除し、ソース インデックス名をターゲット インデックスのエイリアスとして追加する必要があります。
DELETE test_split_source
PUT /test_split_target/_alias/test_split_sourcetest_split_sourceエイリアスをtest_split_targetインデックスに追加した後、次のようにテストする必要があります。
GET test_split_source
POST test_split_source/_doc
{
"test": "test"
}方法2 – 再インデックスAPIを使用する
Reindex API を使用して新しいインデックスを作成すると、任意の数のプライマリ シャード カウントを指定できます。意図した数のプライマリ シャードで新しいインデックスを作成した後、ソース インデックス内のすべてのデータをこの新しいインデックスに再インデックスできます。
分割 API 機能に加えて、再インデックス AP の ingest_pipeline を使用してデータを操作することもできます。取り込みパイプラインでは、フィルターに適合する指定されたフィールドのみがクエリを使用してターゲット インデックスにインデックス付けされます。データの内容は簡単なスクリプトを使用して変更でき、複数のインデックスを 1 つのインデックスにマージできます。
再インデックスAPIの実装
テストの再インデックスを作成します。
POST test_reindex_source/_doc
{
"test": "test"
}ソース インデックスから設定とマッピングをコピーします。
GET test_reindex_source設定、マッピング、および必要なシャード数を使用してターゲット インデックスを作成します。
PUT test_reindex_target
{
"mappings" : {},
"settings": {
"number_of_shards": 10,
"number_of_replicas": 0,
"refresh_interval": -1
}
}*注: number_of_replicas: 0 および refresh_interval: -1 を設定すると、再インデックスの速度が向上します。
再インデックスプロセスを開始します。requests_per_second=-1 および slices=auto を設定すると、再インデックス速度が調整されます。
POST _reindex?requests_per_second=-1&slices=auto&wait_for_completion=false
{
"source": {
"index": "test_reindex_source"
},
"dest": {
"index": "test_reindex_target"
}
}再インデックス API を実行すると、task_id が表示されます。それをコピーして、_tasks API で確認します。
GET _tasks/<task_id>再インデックスが完了したら設定を更新します。
PUT test_reindex_target/_settings
{
"number_of_replicas": 1,
"refresh_interval": "1s"
}元のインデックスを削除する前に、ソース インデックスとターゲット インデックスの docs.count が同じであることを確認します。
GET _cat/indices/test_reindex_*?v&h=index,pri,rep,docs.countインデックス名とエイリアス名を同じにすることはできません。ソース インデックスを削除し、ソース インデックス名をターゲット インデックスのエイリアスとして追加します。
DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_sourcetest_split_source エイリアスを test_split_target インデックスに追加した後、次のコマンドを使用してテストします。
GET test_reindex_sourceまとめ
既存のインデックスのプライマリ シャード数を増やす場合は、新しいインデックスへの設定とマッピングを再作成する必要があります。これを行うには、主に reindex API と split API という 2 つの方法があります。どちらの方法を使用する前にも、アクティブなインデックス作成を停止する必要があります。




