インデックスレベルのシャード割り当てフィルタリング
シャード割り当てフィルタを使用して、Elasticsearchが特定のインデックスのシャードをどこに割り当てるかを制御できます。これらのインデックスごとのフィルタは、クラスター全体の割り当てフィルタリングおよび割り当ての認識と組み合わせて適用されます。
シャード割り当てフィルタは、カスタムノード属性または組み込みの_name
、_host_ip
、_publish_ip
、_ip
、_host
、_id
、_tier
、_tier_preference
属性に基づくことができます。インデックスライフサイクル管理は、フェーズ間の移動時にシャードを再割り当てする方法を決定するために、カスタムノード属性に基づくフィルタを使用します。
たとえば、カスタムノード属性を使用してノードのパフォーマンス特性を示し、シャード割り当てフィルタリングを使用して特定のインデックスのシャードを最も適切なハードウェアクラスにルーティングできます。
## インデックスレベルのシャード割り当てフィルタリングの有効化
カスタムノード属性に基づいてフィルタリングするには:
- 1*.* 各ノードの`````elasticsearch.yml`````設定ファイルにカスタムノード属性を指定してフィルタの特性を設定します。たとえば、`````small`````、`````medium`````、`````big`````ノードがある場合、ノードサイズに基づいてフィルタリングするために`````size`````属性を追加できます。
#### Yaml
``````yaml
node.attr.size: medium
`
ノードを起動するときにカスタム属性を設定することもできます:
./bin/elasticsearch -Enode.attr.size=medium
- 2. インデックスにルーティング割り当てフィルタを追加します。
index.routing.allocation
設定は、include
、exclude
、require
の3種類のフィルタをサポートしています。たとえば、Elasticsearchにtest
インデックスからbig
またはmedium
ノードにシャードを割り当てるように指示するには、index.routing.allocation.include
を使用します:
Python
resp = client.indices.put_settings(
index="test",
settings={
"index.routing.allocation.include.size": "big,medium"
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'test',
body: {
'index.routing.allocation.include.size' => 'big,medium'
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "test",
settings: {
"index.routing.allocation.include.size": "big,medium",
},
});
console.log(response);
Console
PUT test/_settings
{
"index.routing.allocation.include.size": "big,medium"
}
複数のフィルタを指定する場合、シャードがノードに再配置されるためには、次の条件が同時に満たされる必要があります:
- いずれかの
require
タイプの条件が指定されている場合、すべての条件が満たされなければなりません - いずれかの
exclude
タイプの条件が指定されている場合、いずれの条件も満たされてはいけません - いずれかの
include
タイプの条件が指定されている場合、少なくとも1つの条件が満たされなければなりません
たとえば、test
インデックスをbig
ノードにrack1
で移動するには、次のように指定できます:
Python
resp = client.indices.put_settings(
index="test",
settings={
"index.routing.allocation.require.size": "big",
"index.routing.allocation.require.rack": "rack1"
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'test',
body: {
'index.routing.allocation.require.size' => 'big',
'index.routing.allocation.require.rack' => 'rack1'
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "test",
settings: {
"index.routing.allocation.require.size": "big",
"index.routing.allocation.require.rack": "rack1",
},
});
console.log(response);
Console
PUT test/_settings
{
"index.routing.allocation.require.size": "big",
"index.routing.allocation.require.rack": "rack1"
}
インデックス割り当てフィルタ設定
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
resp = client.indices.put_settings(
index="test",
settings={
"index.routing.allocation.include._ip": "192.168.2.*"
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'test',
body: {
'index.routing.allocation.include._ip' => '192.168.2.*'
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "test",
settings: {
"index.routing.allocation.include._ip": "192.168.2.*",
},
});
console.log(response);
Console
PUT test/_settings
{
"index.routing.allocation.include._ip": "192.168.2.*"
}