すべてのシャードレプリカを割り当てるためのノードが不足しています
データのコピー(インデックスシャードレプリカ)を異なるノードに分散させることで、処理リクエストを並列化し、検索クエリの速度を向上させることができます。これは、レプリカシャードの数を最大値(ノードの総数から1を引いた値)まで増やすことで実現でき、ハードウェアの故障から保護する目的も果たします。インデックスに優先ティアがある場合、Elasticsearchはそのインデックスのデータのコピーをターゲットティアのノードにのみ配置します。
すべてのシャードレプリカを割り当てるためのノードが不足しているという警告が表示された場合、この動作に影響を与えるには、クラスターにノードを追加するか(ティアが使用されている場合はティアに)、または index.number_of_replicas
インデックス設定を減らすことができます。
これを修正するために、次の手順に従ってください:
レプリカシャードを割り当てる方法の1つは、可用性ゾーンを追加することです。これにより、Elasticsearchクラスター内のデータノードの数が増加し、レプリカシャードを割り当てることができるようになります。これは、デプロイメントを編集することで行えます。しかし、まずインデックスがどのティアをターゲットにしているかを確認する必要があります。これをKibanaを使用して行います。
Kibanaを使用する
- 1. Elastic Cloudコンソールにログインします。
- 2. Elasticsearch Serviceパネルで、デプロイメントの名前をクリックします。
デプロイメントの名前が無効になっている場合、Kibanaインスタンスが正常でない可能性があります。その場合は、Elastic Supportに連絡してください。デプロイメントにKibanaが含まれていない場合は、最初に有効にするだけで済みます。 - 3. デプロイメントのサイドナビゲーションメニュー(左上隅のElasticロゴの下に配置)を開き、Dev Tools > Consoleに移動します。
インデックスがどのティアをターゲットにしているかを確認するには、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);
Console
GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
Console-Result
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
}
このインデックスが割り当てられることが許可されているデータティアノードロールのカンマ区切りリストを表します。リストの最初のものが優先度が高いものです。すなわち、インデックスがターゲットにしているティアです。例として、この例ではティアの優先度は data_warm,data_hot であり、インデックスは warm ティアをターゲットにしており、data_warm ロールを持つノードがElasticsearchクラスターにさらに必要です。 |
ティアがわかったので、そのティアのノード数を増やしてレプリカを割り当てる必要があります。これを行うには、すでに使用している可用性ゾーンのノード数を増やすためにゾーンごとのサイズを増やすか、可用性ゾーンの数を増やします。画面の左上にある3本の横線をクリックしてデプロイメントのランディングページに戻り、このデプロイメントを管理を選択します。そのページで管理ボタンをクリックし、デプロイメントを編集を選択します。これを行うには、https://cloud.elastic.co/にログインしている必要があります。Elasticsearchセクションで、レプリカシャードが割り当てられなかったティアを見つけます。
- オプション1:ゾーンごとのサイズを増やす
- Size per zoneドロップダウンの値を確認します。ここで選択した64 GBのRAMごとに、各ゾーンに1ノードが作成されます。現在64 GB RAM以下を選択している場合、各ゾーンに1ノードがあります。128 GB RAMを選択すると、ゾーンごとに2ノードが得られます。192 GB RAMを選択すると、ゾーンごとに3ノードが得られます。最大可能値未満の場合、そのティアのノードを追加するためにより高い値を選択できます。
- オプション2:可用性ゾーンの数を増やす
- Availability zonesの選択を見つけます。3未満の場合、そのティアのためにより高い数の可用性ゾーンを選択できます。
ゾーンごとのサイズや可用性ゾーンの数を増やすことができない場合、インデックスデータのレプリカ数を減らすことができます。これは、index.number_of_replicas
インデックス設定を確認し、構成値を減少させることで実現します。
- 1. 上記のようにKibanaにアクセスします。
- 2.
index.number_of_replicas
インデックス設定を確認します。
Python
resp = client.indices.get_settings(
index="my-index-000001",
name="index.number_of_replicas",
)
print(resp)
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
name: 'index.number_of_replicas'
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.number_of_replicas",
});
console.log(response);
Console
GET /my-index-000001/_settings/index.number_of_replicas
Console-Result
{
"my-index-000001" : {
"settings" : {
"index" : {
"number_of_replicas" : "2"
}
}
}
}
インデックスに必要なレプリカシャードの現在の構成値を表します |
- 3.
_cat/nodes
APIを使用してターゲットティアのノード数を見つけます:
Python
resp = client.cat.nodes(
h="node.role",
)
print(resp)
Ruby
response = client.cat.nodes(
h: 'node.role'
)
puts response
Js
const response = await client.cat.nodes({
h: "node.role",
});
console.log(response);
Console
GET /_cat/nodes?h=node.role
Console-Result
himrst
mv
himrst
行にターゲットティアを表す文字が含まれている数を数えることで、ノードの数を知ることができます。詳細についてはQuery parametersを参照してください。上記の例では、h
を含む行が2行あるため、ホットティアに2ノードがあります。
- 4. Decrease このインデックスに必要なレプリカシャードの総数の値を減少させます。レプリカシャードは高可用性のためにプライマリシャードと同じノードに存在できないため、新しい値は上記で見つかったノード数から1を引いた数以下である必要があります。上記の例ではホットティアに2ノードが見つかったため、
index.number_of_replicas
の最大値は1です。
Python
resp = client.indices.put_settings(
index="my-index-000001",
settings={
"index": {
"number_of_replicas": 1
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'my-index-000001',
body: {
index: {
number_of_replicas: 1
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "my-index-000001",
settings: {
index: {
number_of_replicas: 1,
},
},
});
console.log(response);
Console
PUT /my-index-000001/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
index.number_of_replicas インデックス構成の新しい値は、2 の前の値から1 に減少します。0まで設定できますが、searchable snapshot indices以外のインデックスに対して0に設定すると、ノードの再起動中に一時的な可用性の喪失やデータ破損の場合の永続的なデータ損失が発生する可能性があります。 |
レプリカシャードを割り当てるために、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);
Console
GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings
Console-Result
{
"my-index-000001": {
"settings": {
"index.routing.allocation.include._tier_preference": "data_warm,data_hot"
}
}
}
このインデックスが割り当てられることが許可されているデータティアノードロールのカンマ区切りリストを表します。リストの最初のものが優先度が高いものです。すなわち、インデックスがターゲットにしているティアです。例として、この例ではティアの優先度は data_warm,data_hot であり、インデックスは warm ティアをターゲットにしており、data_warm ロールを持つノードがElasticsearchクラスターにさらに必要です。 |
また、Elasticsearchクラスターにノードを追加することが望ましくない場合は、index.number_of_replicas
インデックス設定を確認し、構成値を減少させます:
- 1. レプリカシャードが割り当てられていないインデックスの
index.number_of_replicas
インデックス設定を確認します:
Python
resp = client.indices.get_settings(
index="my-index-000001",
name="index.number_of_replicas",
)
print(resp)
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
name: 'index.number_of_replicas'
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
name: "index.number_of_replicas",
});
console.log(response);
Console
GET /my-index-000001/_settings/index.number_of_replicas
Console-Result
{
"my-index-000001" : {
"settings" : {
"index" : {
"number_of_replicas" : "2"
}
}
}
}
インデックスに必要なレプリカシャードの現在の構成値を表します |
- 2.
_cat/nodes
APIを使用してターゲットティアのノード数を見つけます:
Python
resp = client.cat.nodes(
h="node.role",
)
print(resp)
Ruby
response = client.cat.nodes(
h: 'node.role'
)
puts response
Js
const response = await client.cat.nodes({
h: "node.role",
});
console.log(response);
Console
GET /_cat/nodes?h=node.role
Console-Result
himrst
mv
himrst
ターゲットティアを表す文字が含まれている行を数えることで、ノードの数を知ることができます。詳細についてはQuery parametersを参照してください。上記の例では、h
を含む行が2行あるため、ホットティアに2ノードがあります。
- 3. Decrease このインデックスに必要なレプリカシャードの総数の値を減少させます。レプリカシャードは高可用性のためにプライマリシャードと同じノードに存在できないため、新しい値は上記で見つかったノード数から1を引いた数以下である必要があります。上記の例ではホットティアに2ノードが見つかったため、
index.number_of_replicas
の最大値は1です。
Python
resp = client.indices.put_settings(
index="my-index-000001",
settings={
"index": {
"number_of_replicas": 1
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'my-index-000001',
body: {
index: {
number_of_replicas: 1
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "my-index-000001",
settings: {
index: {
number_of_replicas: 1,
},
},
});
console.log(response);
Console
PUT /my-index-000001/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
index.number_of_replicas インデックス構成の新しい値は、2 の前の値から1 に減少します。0まで設定できますが、searchable snapshot indices以外のインデックスに対して0に設定すると、ノードの再起動中に一時的な可用性の喪失やデータ破損の場合の永続的なデータ損失が発生する可能性があります。 |