Split index API
既存のインデックスを新しいインデックスに分割し、より多くのプライマリシャードを持たせます。
Python
resp = client.indices.split(
index="my-index-000001",
target="split-my-index-000001",
settings={
"index.number_of_shards": 2
},
)
print(resp)
Ruby
response = client.indices.split(
index: 'my-index-000001',
target: 'split-my-index-000001',
body: {
settings: {
'index.number_of_shards' => 2
}
}
)
puts response
Js
const response = await client.indices.split({
index: "my-index-000001",
target: "split-my-index-000001",
settings: {
"index.number_of_shards": 2,
},
});
console.log(response);
Console
POST /my-index-000001/_split/split-my-index-000001
{
"settings": {
"index.number_of_shards": 2
}
}
Request
POST /<index>/_split/<target-index>
PUT /<index>/_split/<target-index>
Prerequisites
- Elasticsearchのセキュリティ機能が有効になっている場合、インデックスに対して
manage
インデックス権限を持っている必要があります。 - インデックスを分割する前に:
- インデックスは読み取り専用でなければなりません。
- クラスタの健康状態が緑でなければなりません。
次のリクエストを使用して、インデックスを読み取り専用にすることができます。インデックスブロックの追加 APIを使用します:
Python
resp = client.indices.add_block(
index="my_source_index",
block="write",
)
print(resp)
Ruby
response = client.indices.add_block(
index: 'my_source_index',
block: 'write'
)
puts response
Js
const response = await client.indices.addBlock({
index: "my_source_index",
block: "write",
});
console.log(response);
Console
PUT /my_source_index/_block/write
データストリームの現在の書き込みインデックスは分割できません。現在の書き込みインデックスを分割するには、最初にデータストリームをロールオーバーして新しい書き込みインデックスを作成し、その後に以前の書き込みインデックスを分割する必要があります。
Description
スプリットインデックスAPIを使用すると、既存のインデックスを新しいインデックスに分割できます。この新しいインデックスでは、元の各プライマリシャードが2つ以上のプライマリシャードに分割されます。
インデックスを分割できる回数(および各元のシャードが分割できるシャードの数)は、index.number_of_routing_shards
設定によって決まります。ルーティングシャードの数は、内部でドキュメントを一貫したハッシュでシャードに分配するために使用されるハッシュ空間を指定します。たとえば、number_of_routing_shards
が30
(5 x 2 x 3
)に設定された5シャードインデックスは、2
または3
の因子で分割できます。言い換えれば、次のように分割できます:
5
→10
→30
(2で分割し、次に3で分割)5
→15
→30
(3で分割し、次に2で分割)5
→30
(6で分割)
**インデックス作成の例**
次の[インデックス作成API](/read/elasticsearch-8-15/b5c127aabf881d48.md)は、`````my-index-000001`````インデックスを`````index.number_of_routing_shards`````設定の`````30`````で作成します。
#### Python
``````python
resp = client.indices.create(
index="my-index-000001",
settings={
"index": {
"number_of_routing_shards": 30
}
},
)
print(resp)
`
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
index: {
number_of_routing_shards: 30
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
index: {
number_of_routing_shards: 30,
},
},
});
console.log(response);
Console
PUT /my-index-000001
{
"settings": {
"index": {
"number_of_routing_shards": 30
}
}
}
元のインデックスに1つのプライマリシャードが含まれている場合(またはマルチシャードインデックスが[縮小](/read/elasticsearch-8-15/b71a275dcf175740.md)されて単一のプライマリシャードになった場合)、インデックスは1より大きい任意の数のシャードに分割できます。デフォルトのルーティングシャードの数の特性は、新しく分割されたインデックスに適用されます。
### How splitting works
分割操作:
- 1*.* ソースインデックスと同じ定義を持つ新しいターゲットインデックスを作成しますが、プライマリシャードの数が多くなります。
- 2*.* ソースインデックスからターゲットインデックスにセグメントをハードリンクします。(ファイルシステムがハードリンクをサポートしていない場合、すべてのセグメントが新しいインデックスにコピーされますが、これははるかに時間がかかるプロセスです。)
- 3*.* 低レベルのファイルが作成された後、すべてのドキュメントを再ハッシュして、異なるシャードに属するドキュメントを削除します。
- 4*.* ターゲットインデックスを、ちょうど再オープンされたクローズドインデックスのように回復します。
### Why doesn’t Elasticsearch support incremental resharding?
`````N`````シャードから`````N+1`````シャードへの移行、すなわちインクリメンタルリシャーディングは、確かに多くのキー・バリュー・ストアでサポートされている機能です。新しいシャードを追加し、その新しいシャードに新しいデータをプッシュするだけではオプションではありません。これはインデックスのボトルネックになる可能性が高く、ドキュメントが`````_id`````に基づいてどのシャードに属するかを特定することが、取得、削除、更新リクエストに必要であり、非常に複雑になります。これは、異なるハッシュスキームを使用して既存のデータを再バランスする必要があることを意味します。
キー・バリュー・ストアがこれを効率的に行う最も一般的な方法は、一貫したハッシュを使用することです。一貫したハッシュは、`````N`````から`````N+1`````にシャードの数を増やすときに、`````1/N`````-分のキーを再配置するだけで済みます。しかし、Elasticsearchのストレージ単位であるシャードはLuceneインデックスです。その検索指向のデータ構造のため、Luceneインデックスのかなりの部分を取り出し、たとえそれがドキュメントの5%だけであっても、それを削除して別のシャードにインデックスすることは、キー・バリュー・ストアよりもはるかに高いコストがかかります。このコストは、上記のセクションで説明したように、乗数因子でシャードの数を増やすときに合理的に保たれます。これにより、Elasticsearchはローカルで分割を実行でき、移動する必要のあるドキュメントを再インデックスするのではなく、インデックスレベルで分割を実行できるようになります。また、効率的なファイルコピーのためにハードリンクを使用することもできます。
追加専用データの場合、新しいインデックスを作成し、新しいデータをそこにプッシュすることで、より柔軟性を得ることが可能です。その際、古いインデックスと新しいインデックスの両方をカバーするエイリアスを追加します。古いインデックスと新しいインデックスがそれぞれ`````M`````と`````N`````シャードを持っていると仮定すると、`````M+N`````シャードを持つインデックスを検索するのと比較して、オーバーヘッドはありません。
### Split an index
`````my_source_index`````を`````my_target_index`````という新しいインデックスに分割するには、次のリクエストを発行します:
#### Python
``````python
resp = client.indices.split(
index="my_source_index",
target="my_target_index",
settings={
"index.number_of_shards": 2
},
)
print(resp)
`
Ruby
response = client.indices.split(
index: 'my_source_index',
target: 'my_target_index',
body: {
settings: {
'index.number_of_shards' => 2
}
}
)
puts response
Js
const response = await client.indices.split({
index: "my_source_index",
target: "my_target_index",
settings: {
"index.number_of_shards": 2,
},
});
console.log(response);
Console
POST /my_source_index/_split/my_target_index
{
"settings": {
"index.number_of_shards": 2
}
}
上記のリクエストは、ターゲットインデックスがクラスタ状態に追加されるとすぐに返されます。分割操作が開始されるのを待ちません。
インデックスは、次の要件を満たす場合にのみ分割できます:
- ターゲットインデックスは存在してはいけません
- ソースインデックスはターゲットインデックスよりも少ないプライマリシャードを持っている必要があります。
- ターゲットインデックスのプライマリシャードの数は、ソースインデックスのプライマリシャードの数の倍数でなければなりません。
- 分割プロセスを処理するノードは、既存のインデックスの2番目のコピーを収容するのに十分な空きディスクスペースを持っている必要があります。
_split
APIは、create index
APIに似ており、ターゲットインデックスのsettings
およびaliases
パラメータを受け入れます:
Python
resp = client.indices.split(
index="my_source_index",
target="my_target_index",
settings={
"index.number_of_shards": 5
},
aliases={
"my_search_indices": {}
},
)
print(resp)
Ruby
response = client.indices.split(
index: 'my_source_index',
target: 'my_target_index',
body: {
settings: {
'index.number_of_shards' => 5
},
aliases: {
my_search_indices: {}
}
}
)
puts response
Js
const response = await client.indices.split({
index: "my_source_index",
target: "my_target_index",
settings: {
"index.number_of_shards": 5,
},
aliases: {
my_search_indices: {},
},
});
console.log(response);
Console
POST /my_source_index/_split/my_target_index
{
"settings": {
"index.number_of_shards": 5
},
"aliases": {
"my_search_indices": {}
}
}
ターゲットインデックスのシャードの数。これはソースインデックスのシャードの数の倍数でなければなりません。 |
マッピングは_split
リクエストで指定できません。
Monitor the split process
分割プロセスは、_cat recovery
APIで監視できます。また、cluster health
APIを使用して、wait_for_status
パラメータをyellow
に設定することで、すべてのプライマリシャードが割り当てられるまで待つこともできます。
_split
APIは、ターゲットインデックスがクラスタ状態に追加されるとすぐに返され、シャードが割り当てられる前に返されます。この時点で、すべてのシャードはunassigned
の状態にあります。何らかの理由でターゲットインデックスが割り当てられない場合、そのプライマリシャードはunassigned
のままで、そのノードに割り当てられるまで待機します。
プライマリシャードが割り当てられると、initializing
の状態に移行し、分割プロセスが開始されます。分割操作が完了すると、シャードはactive
になります。この時点で、Elasticsearchはレプリカを割り当てようとし、プライマリシャードを別のノードに移動することを決定する場合があります。
Wait for active shards
分割操作は新しいインデックスを作成してシャードを分割するため、インデックス作成時のアクティブシャードを待つ設定は分割インデックスアクションにも適用されます。
Path parameters
<index>
- (必須、文字列)分割するソースインデックスの名前。
<target-index>
- (必須、文字列)作成するターゲットインデックスの名前。
インデックス名は次の基準を満たす必要があります:- 小文字のみ
\
、/
、*
、?
、"
、<
、>
、|
、,
、#
を含むことはできません- 7.0以前のインデックスはコロン(
:
)を含むことができましたが、これは非推奨となり、7.0以降はサポートされません -
、_
、+
で始めることはできません.
または..
であってはなりません- 255バイトを超えてはなりません(バイト数なので、マルチバイト文字は255の制限に早くカウントされます)
.
で始まる名前は非推奨であり、隠しインデックスおよびプラグインによって管理される内部インデックスを除きます。
Query parameters
wait_for_active_shards
- (オプション、文字列)操作を進める前にアクティブでなければならないシャードのコピーの数。
all
またはインデックス内のシャードの総数(number_of_replicas+1
)までの任意の正の整数に設定します。デフォルト: 1、プライマリシャード。
アクティブシャードを参照してください。 master_timeout
- (オプション、時間単位)マスターノードを待つ期間。タイムアウトが切れる前にマスターノードが利用できない場合、リクエストは失敗し、エラーが返されます。デフォルトは
30s
です。リクエストがタイムアウトしないことを示すために-1
に設定することもできます。 timeout
- (オプション、時間単位)クラスタメタデータを更新した後、クラスタ内のすべての関連ノードからの応答を待つ期間。タイムアウトが切れる前に応答が受信されない場合、クラスタメタデータの更新は適用されますが、応答は完全に承認されなかったことを示します。デフォルトは
30s
です。リクエストがタイムアウトしないことを示すために-1
に設定することもできます。
Request body
aliases
- (オプション、オブジェクトのオブジェクト)結果インデックスのエイリアス。
- `````<alias>
- (必須、オブジェクト)キーはエイリアス名です。インデックスエイリアス名は日付数学をサポートしています。
オブジェクトボディにはエイリアスのオプションが含まれます。空のオブジェクトをサポートします。- `````filter
- (オプション、クエリDSLオブジェクト)エイリアスがアクセスできるドキュメントを制限するために使用されるクエリ。
index_routing
- (オプション、文字列)特定のシャードにインデックス操作をルーティングするために使用される値。指定された場合、これはインデックス操作の
routing
値を上書きします。 is_hidden
- (オプション、ブール値)
true
の場合、エイリアスは隠しです。デフォルトはfalse
です。エイリアスのすべてのインデックスは同じis_hidden
値を持っている必要があります。 is_write_index
- (オプション、ブール値)
true
の場合、インデックスはエイリアスの書き込みインデックスです。デフォルトはfalse
です。 routing
- (オプション、文字列)特定のシャードにインデックスおよび検索操作をルーティングするために使用される値。
search_routing
- (オプション、文字列)特定のシャードに検索操作をルーティングするために使用される値。指定された場合、これは検索操作の
routing
値を上書きします。
settings
- (オプション、インデックス設定オブジェクト)ターゲットインデックスの構成オプション。 インデックス設定を参照してください。