インデックスのシャードの総数が単一ノードを超えました
Elasticsearchは、クラスタ内のノード間でデータ(インデックスシャード)を分散させることによって、利用可能なすべてのリソースを活用しようとします。
ユーザーは、index.routing.allocation.total_shards_per_nodeインデックス設定をカスタム値(例えば、トラフィックが非常に多いインデックスの場合は1
)に設定することで、このデータ分配に影響を与えたいと考えるかもしれません。インデックスが1つのノードに配置できるシャードの数を制限するさまざまな設定により、クラスタにインデックス設定を満たすための十分なノードがないために、シャードが未割り当てになることがあります。
これを修正するためには、次の手順に従ってください:
シャードを割り当てるためには、ノード上に共存できるシャードの数を増やす必要があります。これは、index.routing.allocation.total_shards_per_node
インデックス設定の設定を確認し、未割り当てのシャードを持つインデックスの設定値を増やすことで実現します。
Kibanaを使用する
- 1. Elastic Cloudコンソールにログインします。
- 2. Elasticsearch Serviceパネルで、デプロイメントの名前をクリックします。
デプロイメントの名前が無効になっている場合、Kibanaインスタンスが正常でない可能性があります。その場合は、Elastic Supportに連絡してください。デプロイメントにKibanaが含まれていない場合は、最初に有効にするだけで済みます。 - 3. デプロイメントのサイドナビゲーションメニュー(左上隅のElasticロゴの下に配置)を開き、**Dev Tools
Console**に移動します。
- 4. 未割り当てのシャードを持つインデックスの
index.routing.allocation.total_shards_per_node
インデックス設定を確認します:
Python
resp = client.indices.get_settings(
index="my-index-000001",
name="index.routing.allocation.total_shards_per_node",
flat_settings=True,
)
print(resp)
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
name: 'index.routing.allocation.total_shards_per_node',
flat_settings: true
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.routing.allocation.total_shards_per_node",
flat_settings: "true",
});
console.log(response);
コンソール
GET /my-index-000001/_settings/index.routing.allocation.total_shards_per_node?flat_settings
コンソール-結果
{
"my-index-000001": {
"settings": {
"index.routing.allocation.total_shards_per_node": "1"
}
}
}
my-index-000001 インデックスの1つのノードに存在できるシャードの総数の現在の設定値を示します。 |
- 5. 増加させて、1つのノードに割り当てられるシャードの総数をより高い値に設定します:
Python
resp = client.indices.put_settings(
index="my-index-000001",
settings={
"index": {
"routing.allocation.total_shards_per_node": "2"
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'my-index-000001',
body: {
index: {
'routing.allocation.total_shards_per_node' => '2'
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "my-index-000001",
settings: {
index: {
"routing.allocation.total_shards_per_node": "2",
},
},
});
console.log(response);
コンソール
PUT /my-index-000001/_settings
{
"index" : {
"routing.allocation.total_shards_per_node" : "2"
}
}
total_shards_per_node インデックスのmy-index-000001 設定の新しい値は、以前の値1 から2 に増加しました。total_shards_per_node 設定は-1 に設定することもでき、これは同じインデックスのシャードが1つのノードに存在できる上限がないことを示します。 |
シャードを割り当てるためには、Elasticsearchクラスタにノードを追加し、インデックスのターゲットティアnode roleを新しいノードに割り当てることができます。
インデックスがどのティアをターゲットにしているかを確認するには、get index setting APIを使用してindex.routing.allocation.include._tier_preference
設定の設定値を取得します:
Python
resp = client.indices.get_settings(
index="my-index-000001",
name="index.routing.allocation.include._tier_preference",
flat_settings=True,
)
print(resp)
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
name: 'index.routing.allocation.include._tier_preference',
flat_settings: true
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.routing.allocation.include._tier_preference",
flat_settings: "true",
});
console.log(response);
コンソール
GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
コンソール-結果
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
}
このインデックスが割り当てられることが許可されているデータティアノードロールのカンマ区切りリストを示します。リストの最初のものが優先度が高いものです。 すなわち、インデックスがターゲットにしているティアです。 例えば、この例ではティアの優先度は data_warm,data_hot であり、インデックスはwarm ティアをターゲットにしており、Elasticsearchクラスタにはdata_warm ロールを持つノードがさらに必要です。 |
また、Elasticsearchクラスタにノードを追加することが望ましくない場合は、index.routing.allocation.total_shards_per_node
インデックス設定の設定を確認し、設定値を増やすことで、同じノードにより多くのシャードを割り当てることができます。
- 1. 未割り当てのシャードを持つインデックスの
index.routing.allocation.total_shards_per_node
インデックス設定を確認します:
Python
resp = client.indices.get_settings(
index="my-index-000001",
name="index.routing.allocation.total_shards_per_node",
flat_settings=True,
)
print(resp)
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
name: 'index.routing.allocation.total_shards_per_node',
flat_settings: true
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.routing.allocation.total_shards_per_node",
flat_settings: "true",
});
console.log(response);
コンソール
GET /my-index-000001/_settings/index.routing.allocation.total_shards_per_node?flat_settings
コンソール-結果
{
"my-index-000001": {
"settings": {
"index.routing.allocation.total_shards_per_node": "1"
}
}
}
my-index-000001 インデックスの1つのノードに存在できるシャードの総数の現在の設定値を示します。 |
- 2. 増加させて、1つのノードに割り当てられるシャードの総数を増やすか、値を無制限(
-1
)にリセットします:
Python
resp = client.indices.put_settings(
index="my-index-000001",
settings={
"index": {
"routing.allocation.total_shards_per_node": -1
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'my-index-000001',
body: {
index: {
'routing.allocation.total_shards_per_node' => -1
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "my-index-000001",
settings: {
index: {
"routing.allocation.total_shards_per_node": -1,
},
},
});
console.log(response);
コンソール
PUT /my-index-000001/_settings
{
"index" : {
"routing.allocation.total_shards_per_node" : -1
}
}