シュリンクインデックスAPI

既存のインデックスをプライマリシャードが少ない新しいインデックスに縮小します。

Python

  1. resp = client.indices.shrink(
  2. index="my-index-000001",
  3. target="shrunk-my-index-000001",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.shrink(
  2. index: 'my-index-000001',
  3. target: 'shrunk-my-index-000001'
  4. )
  5. puts response

Js

  1. const response = await client.indices.shrink({
  2. index: "my-index-000001",
  3. target: "shrunk-my-index-000001",
  4. });
  5. console.log(response);

Console

  1. POST /my-index-000001/_shrink/shrunk-my-index-000001

Request

POST /<index>/_shrink/<target-index>

PUT /<index>/_shrink/<target-index>

前提条件

  • Elasticsearchのセキュリティ機能が有効になっている場合、インデックスに対してmanage インデックス権限を持っている必要があります。
  • インデックスを縮小する前に:
    • インデックスは読み取り専用でなければなりません。
    • インデックス内のすべてのシャードのコピーは同じノードに存在する必要があります。
    • インデックスはgreen ヘルスステータスを持っている必要があります。

シャードの割り当てを容易にするために、インデックスのレプリカシャードも削除することをお勧めします。後で縮小操作の一部としてレプリカシャードを再追加できます。

次のインデックス設定更新APIリクエストを使用して、インデックスのレプリカシャードを削除し、インデックスの残りのシャードを同じノードに移動できます。

Python

  1. resp = client.indices.put_settings(
  2. index="my_source_index",
  3. settings={
  4. "settings": {
  5. "index.number_of_replicas": 0,
  6. "index.routing.allocation.require._name": "shrink_node_name"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'my_source_index',
  3. body: {
  4. settings: {
  5. 'index.number_of_replicas' => 0,
  6. 'index.routing.allocation.require._name' => 'shrink_node_name'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "my_source_index",
  3. settings: {
  4. settings: {
  5. "index.number_of_replicas": 0,
  6. "index.routing.allocation.require._name": "shrink_node_name",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT /my_source_index/_settings
  2. {
  3. "settings": {
  4. "index.number_of_replicas": 0,
  5. "index.routing.allocation.require._name": "shrink_node_name"
  6. }
  7. }
インデックスのレプリカシャードを削除します。
インデックスのシャードをshrink_node_nameノードに移動します。

インデックスレベルのシャード割り当てフィルタリングを参照してください。

ソースインデックスの移動には時間がかかる場合があります。進行状況は_cat recovery APIで追跡できるか、cluster health APIを使用してすべてのシャードがwait_for_no_relocating_shardsパラメータで移動するまで待つことができます。

次に、shrink_node_nameブロック追加APIを使用して、インデックスを読み取り専用にするリクエストを行うことができます:

Python

  1. resp = client.indices.add_block(
  2. index="my_source_index",
  3. block="write",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.add_block(
  2. index: 'my_source_index',
  3. block: 'write'
  4. )
  5. puts response

Js

  1. const response = await client.indices.addBlock({
  2. index: "my_source_index",
  3. block: "write",
  4. });
  5. console.log(response);

Console

  1. PUT /my_source_index/_block/write

説明

シュリンクインデックスAPIを使用すると、既存のインデックスをプライマリシャードが少ない新しいインデックスに縮小できます。ターゲットインデックスの要求されるプライマリシャードの数は、ソースインデックスのシャード数の因数でなければなりません。たとえば、8プライマリシャードを持つインデックスは、42、または1プライマリシャードに縮小できます。また、15プライマリシャードを持つインデックスは、53、または1に縮小できます。インデックス内のシャード数が素数の場合、単一のプライマリシャードにしか縮小できません。縮小する前に、インデックス内のすべてのシャードの(プライマリまたはレプリカ)コピーが同じノードに存在する必要があります。

データストリームの現在の書き込みインデックスは縮小できません。現在の書き込みインデックスを縮小するには、最初にデータストリームをロールオーバーして新しい書き込みインデックスを作成し、その後、以前の書き込みインデックスを縮小する必要があります。

縮小の仕組み

縮小操作:

  • 1. ソースインデックスと同じ定義を持つ新しいターゲットインデックスを作成しますが、プライマリシャードの数は少なくなります。
  • 2. ソースインデックスからターゲットインデックスにセグメントをハードリンクします。(ファイルシステムがハードリンクをサポートしていない場合、すべてのセグメントが新しいインデックスにコピーされます。これははるかに時間がかかるプロセスです。また、複数のデータパスを使用している場合、異なるデータパスのシャードは、同じディスク上にない場合、セグメントファイルの完全なコピーが必要です。ハードリンクはディスク間で機能しません。)
  • 3. ターゲットインデックスを、ちょうど再オープンされた閉じたインデックスのように回復します。.routing.allocation.initial_recovery._id インデックス設定にシャードを回復します。

インデックスを縮小する

  1. #### Python
  2. ``````python
  3. resp = client.indices.shrink(
  4. index="my_source_index",
  5. target="my_target_index",
  6. settings={
  7. "index.routing.allocation.require._name": None,
  8. "index.blocks.write": None
  9. },
  10. )
  11. print(resp)
  12. `

Ruby

  1. response = client.indices.shrink(
  2. index: 'my_source_index',
  3. target: 'my_target_index',
  4. body: {
  5. settings: {
  6. 'index.routing.allocation.require._name' => nil,
  7. 'index.blocks.write' => nil
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.indices.shrink({
  2. index: "my_source_index",
  3. target: "my_target_index",
  4. settings: {
  5. "index.routing.allocation.require._name": null,
  6. "index.blocks.write": null,
  7. },
  8. });
  9. console.log(response);

Console

  1. POST /my_source_index/_shrink/my_target_index
  2. {
  3. "settings": {
  4. "index.routing.allocation.require._name": null,
  5. "index.blocks.write": null
  6. }
  7. }
ソースインデックスからコピーされた割り当て要件をクリアします。
ソースインデックスからコピーされたインデックス書き込みブロックをクリアします。

上記のリクエストは、ターゲットインデックスがクラスター状態に追加されるとすぐに返されます。縮小操作が開始されるのを待ちません。

インデックスは、次の要件を満たす場合にのみ縮小できます:

  • ターゲットインデックスは存在してはいけません。
  • ソースインデックスはターゲットインデックスよりも多くのプライマリシャードを持っている必要があります。
  • ターゲットインデックスのプライマリシャードの数は、ソースインデックスのプライマリシャードの数の因数でなければなりません。ソースインデックスはターゲットインデックスよりも多くのプライマリシャードを持っている必要があります。
  • インデックスは、ターゲットインデックスの単一のシャードに縮小されるすべてのシャードで合計2,147,483,519ドキュメントを超えてはなりません。これは、単一のシャードに収まることができる最大のドキュメント数です。
  • 縮小プロセスを処理するノードは、既存のインデックスの2番目のコピーを収容するのに十分な空きディスクスペースを持っている必要があります。

_shrink APIは、create index APIに似ており、ターゲットインデックスのsettingsおよびaliasesパラメータを受け入れます:

Python

  1. resp = client.indices.shrink(
  2. index="my_source_index",
  3. target="my_target_index",
  4. settings={
  5. "index.number_of_replicas": 1,
  6. "index.number_of_shards": 1,
  7. "index.codec": "best_compression"
  8. },
  9. aliases={
  10. "my_search_indices": {}
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.indices.shrink(
  2. index: 'my_source_index',
  3. target: 'my_target_index',
  4. body: {
  5. settings: {
  6. 'index.number_of_replicas' => 1,
  7. 'index.number_of_shards' => 1,
  8. 'index.codec' => 'best_compression'
  9. },
  10. aliases: {
  11. my_search_indices: {}
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.indices.shrink({
  2. index: "my_source_index",
  3. target: "my_target_index",
  4. settings: {
  5. "index.number_of_replicas": 1,
  6. "index.number_of_shards": 1,
  7. "index.codec": "best_compression",
  8. },
  9. aliases: {
  10. my_search_indices: {},
  11. },
  12. });
  13. console.log(response);

Console

  1. POST /my_source_index/_shrink/my_target_index
  2. {
  3. "settings": {
  4. "index.number_of_replicas": 1,
  5. "index.number_of_shards": 1,
  6. "index.codec": "best_compression"
  7. },
  8. "aliases": {
  9. "my_search_indices": {}
  10. }
  11. }
ターゲットインデックスのシャード数。これはソースインデックスのシャード数の因数でなければなりません。
新しい書き込みがインデックスに行われるときにのみ、最適な圧縮が適用されます。たとえば、シャードを単一のセグメントに強制マージする場合などです。
  1. ### 縮小プロセスの監視
  2. 縮小プロセスは、[`````_cat recovery````` API](/read/elasticsearch-8-15/0ae9a86e684df31b.md)で監視できるか、[`````cluster health````` API](/read/elasticsearch-8-15/f5a22e73b1d30cf1.md)を使用して、`````wait_for_status`````パラメータを`````yellow`````に設定することで、すべてのプライマリシャードが割り当てられるまで待つことができます。
  3. `````_shrink````` APIは、ターゲットインデックスがクラスター状態に追加されるとすぐに返され、シャードが割り当てられる前に返されます。この時点で、すべてのシャードは`````unassigned`````の状態にあります。何らかの理由で、ターゲットインデックスが縮小ノードに割り当てられない場合、そのプライマリシャードは`````unassigned`````のままとなり、そのノードに割り当てられるまで待機します。
  4. プライマリシャードが割り当てられると、`````initializing`````の状態に移動し、縮小プロセスが開始されます。縮小操作が完了すると、シャードは`````active`````になります。その時点で、Elasticsearchはレプリカを割り当てようとし、プライマリシャードを別のノードに移動することを決定する場合があります。
  5. ### アクティブシャードの待機
  6. 縮小操作はシャードを縮小するために新しいインデックスを作成するため、インデックス作成時の[アクティブシャードの待機](b5c127aabf881d48.md#create-index-wait-for-active-shards)設定は、縮小インデックスアクションにも適用されます。
  7. ## パスパラメータ
  8. - `````<index>
  • (必須、文字列)縮小するソースインデックスの名前。
  • <target-index>
  • (必須、文字列)作成するターゲットインデックスの名前。
    インデックス名は次の基準を満たす必要があります:
    • 小文字のみ
    • \/*?"<>| (スペース文字)、,#を含むことはできません。
    • 7.0以前のインデックスはコロン(:)を含むことができましたが、これは非推奨となり、7.0以降はサポートされません。
    • -_+で始まることはできません。
    • .または..であってはなりません。
    • 255バイトを超えてはなりません(バイトであるため、マルチバイト文字は255の制限に早くカウントされます)。
    • .で始まる名前は非推奨ですが、隠しインデックスやプラグインによって管理される内部インデックスは除きます。

クエリパラメータ

  • wait_for_active_shards
  • (オプション、文字列)操作を進める前にアクティブでなければならないシャードのコピーの数。allまたはインデックス内のシャードの総数(number_of_replicas+1)までの任意の正の整数に設定します。デフォルト: 1、プライマリシャード。
    アクティブシャードを参照してください。
  • master_timeout
  • (オプション、時間単位)マスターノードを待機する期間。タイムアウトが切れる前にマスターノードが利用できない場合、リクエストは失敗し、エラーが返されます。デフォルトは30sです。リクエストがタイムアウトしないことを示すために-1に設定することもできます。
  • timeout
  • (オプション、時間単位)クラスターのメタデータを更新した後、クラスター内のすべての関連ノードからの応答を待機する期間。タイムアウトが切れる前に応答が受信されない場合、クラスターのメタデータ更新は適用されますが、応答は完全に承認されなかったことを示します。デフォルトは30sです。リクエストがタイムアウトしないことを示すために-1に設定することもできます。

リクエストボディ

  • aliases
  • (オプション、オブジェクトのオブジェクト)結果インデックスのエイリアス。
    1. - `````<alias>
    • (必須、オブジェクト)キーはエイリアス名です。インデックスエイリアス名は日付数学をサポートしています。
      オブジェクトボディにはエイリアスのオプションが含まれます。空のオブジェクトをサポートします。
      1. - `````filter
      • (オプション、クエリDSLオブジェクト)エイリアスがアクセスできるドキュメントを制限するために使用されるクエリ。
      • index_routing
      • (オプション、文字列)特定のシャードにインデックス操作をルーティングするために使用される値。指定された場合、これはインデックス操作のrouting値を上書きします。
      • is_hidden
      • (オプション、ブール値)trueの場合、エイリアスは隠しです。デフォルトはfalseです。エイリアスのすべてのインデックスは同じis_hidden値を持っている必要があります。
      • is_write_index
      • (オプション、ブール値)trueの場合、インデックスはエイリアスの書き込みインデックスです。デフォルトはfalseです。
      • routing
      • (オプション、文字列)特定のシャードにインデックスおよび検索操作をルーティングするために使用される値。
      • search_routing
      • (オプション、文字列)特定のシャードに検索操作をルーティングするために使用される値。指定された場合、これは検索操作のrouting値を上書きします。
  • settings
  • (オプション、インデックス設定オブジェクト)ターゲットインデックスの構成オプション。 インデックス設定を参照してください。
  • max_primary_shard_size
  • (オプション、バイト単位)ターゲットインデックスの最大プライマリシャードサイズ。ターゲットインデックスの最適なシャード数を見つけるために使用されます。このパラメータが設定されると、ターゲットインデックス内の各シャードのストレージはこのパラメータを超えないようになります。ターゲットインデックスのシャード数は、ソースインデックスのシャード数の因数であり続けますが、このパラメータがソースインデックスの単一シャードサイズよりも小さい場合、ターゲットインデックスのシャード数はソースインデックスのシャード数と等しくなります。たとえば、このパラメータが50GBに設定されている場合、ソースインデックスが60プライマリシャードで合計100GBの場合、ターゲットインデックスは2プライマリシャードを持ち、各シャードサイズは50GBになります。ソースインデックスが60プライマリシャードで合計1000GBの場合、ターゲットインデックスは20プライマリシャードを持ちます。ソースインデックスが60プライマリシャードで合計4000GBの場合、ターゲットインデックスは60プライマリシャードを持ち続けます。このパラメータは、number_of_shardssettingsの間で競合し、どちらか一方のみが設定できます。