インデックスレベルのシャード割り当てフィルタリング

シャード割り当てフィルタを使用して、Elasticsearchが特定のインデックスのシャードをどこに割り当てるかを制御できます。これらのインデックスごとのフィルタは、クラスター全体の割り当てフィルタリングおよび割り当ての認識と組み合わせて適用されます。

シャード割り当てフィルタは、カスタムノード属性または組み込みの_name_host_ip_publish_ip_ip_host_id_tier_tier_preference属性に基づくことができます。インデックスライフサイクル管理は、フェーズ間の移動時にシャードを再割り当てする方法を決定するために、カスタムノード属性に基づくフィルタを使用します。

  1. たとえば、カスタムノード属性を使用してノードのパフォーマンス特性を示し、シャード割り当てフィルタリングを使用して特定のインデックスのシャードを最も適切なハードウェアクラスにルーティングできます。
  2. ## インデックスレベルのシャード割り当てフィルタリングの有効化
  3. カスタムノード属性に基づいてフィルタリングするには:
  4. - 1*.* 各ノードの`````elasticsearch.yml`````設定ファイルにカスタムノード属性を指定してフィルタの特性を設定します。たとえば、`````small``````````medium``````````big`````ノードがある場合、ノードサイズに基づいてフィルタリングするために`````size`````属性を追加できます。
  5. #### Yaml
  6. ``````yaml
  7. node.attr.size: medium
  8. `

ノードを起動するときにカスタム属性を設定することもできます:

  1. ./bin/elasticsearch -Enode.attr.size=medium
  • 2. インデックスにルーティング割り当てフィルタを追加します。index.routing.allocation設定は、includeexcluderequireの3種類のフィルタをサポートしています。たとえば、Elasticsearchにtestインデックスからbigまたはmediumノードにシャードを割り当てるように指示するには、index.routing.allocation.includeを使用します:

Python

  1. resp = client.indices.put_settings(
  2. index="test",
  3. settings={
  4. "index.routing.allocation.include.size": "big,medium"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'test',
  3. body: {
  4. 'index.routing.allocation.include.size' => 'big,medium'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "test",
  3. settings: {
  4. "index.routing.allocation.include.size": "big,medium",
  5. },
  6. });
  7. console.log(response);

Console

  1. PUT test/_settings
  2. {
  3. "index.routing.allocation.include.size": "big,medium"
  4. }

複数のフィルタを指定する場合、シャードがノードに再配置されるためには、次の条件が同時に満たされる必要があります:

  • いずれかのrequireタイプの条件が指定されている場合、すべての条件が満たされなければなりません
  • いずれかのexcludeタイプの条件が指定されている場合、いずれの条件も満たされてはいけません
  • いずれかのincludeタイプの条件が指定されている場合、少なくとも1つの条件が満たされなければなりません
    たとえば、testインデックスをbigノードにrack1で移動するには、次のように指定できます:

Python

  1. resp = client.indices.put_settings(
  2. index="test",
  3. settings={
  4. "index.routing.allocation.require.size": "big",
  5. "index.routing.allocation.require.rack": "rack1"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'test',
  3. body: {
  4. 'index.routing.allocation.require.size' => 'big',
  5. 'index.routing.allocation.require.rack' => 'rack1'
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "test",
  3. settings: {
  4. "index.routing.allocation.require.size": "big",
  5. "index.routing.allocation.require.rack": "rack1",
  6. },
  7. });
  8. console.log(response);

Console

  1. PUT test/_settings
  2. {
  3. "index.routing.allocation.require.size": "big",
  4. "index.routing.allocation.require.rack": "rack1"
  5. }

インデックス割り当てフィルタ設定

  • index.routing.allocation.include.{attribute}
  • インデックスを{attribute}のカンマ区切りの値のいずれかを持つノードに割り当てます。
  • index.routing.allocation.require.{attribute}
  • インデックスを{attribute}のカンマ区切りの値をすべて持つノードに割り当てます。
  • index.routing.allocation.exclude.{attribute}
  • インデックスを{attribute}のカンマ区切りの値を持たないノードに割り当てます。

インデックス割り当て設定は、次の組み込み属性をサポートしています:

_name ノード名でノードを一致させる
_host_ip ホストIPアドレス(ホスト名に関連付けられたIP)でノードを一致させる
_publish_ip 公開IPアドレスでノードを一致させる
_ip _host_ipまたは_publish_ipのいずれかで一致させる
_host ホスト名でノードを一致させる
_id ノードIDでノードを一致させる
_tier ノードのdata tier役割でノードを一致させる。
詳細については、データティア割り当てフィルタリングを参照してください。

_tierフィルタリングはnode役割に基づいています。役割のサブセットのみがdata tier役割であり、一般的なdata roleは任意のティアフィルタリングに一致します。

属性値を指定する際にワイルドカードを使用できます。たとえば:

Python

  1. resp = client.indices.put_settings(
  2. index="test",
  3. settings={
  4. "index.routing.allocation.include._ip": "192.168.2.*"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'test',
  3. body: {
  4. 'index.routing.allocation.include._ip' => '192.168.2.*'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "test",
  3. settings: {
  4. "index.routing.allocation.include._ip": "192.168.2.*",
  5. },
  6. });
  7. console.log(response);

Console

  1. PUT test/_settings
  2. {
  3. "index.routing.allocation.include._ip": "192.168.2.*"
  4. }