すべてのシャードレプリカを割り当てるためのノードが不足しています

データのコピー(インデックスシャードレプリカ)を異なるノードに分散させることで、処理リクエストを並列化し、検索クエリの速度を向上させることができます。これは、レプリカシャードの数を最大値(ノードの総数から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に移動します。
    Kibana Console

インデックスがどのティアをターゲットにしているかを確認するには、get index setting APIを使用して、index.routing.allocation.include._tier_preference設定の構成値を取得します。

Python

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.routing.allocation.include._tier_preference",
  4. flat_settings=True,
  5. )
  6. print(resp)

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. name: 'index.routing.allocation.include._tier_preference',
  4. flat_settings: true
  5. )
  6. puts response

Js

  1. const response = await client.indices.getSettings({
  2. index: "my-index-000001",
  3. name: "index.routing.allocation.include._tier_preference",
  4. flat_settings: "true",
  5. });
  6. console.log(response);

Console

  1. GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings

レスポンスは次のようになります:

Console-Result

  1. {
  2. "my-index-000001": {
  3. "settings": {
  4. "index.routing.allocation.include._tier_preference": "data_warm,data_hot"
  5. }
  6. }
  7. }
このインデックスが割り当てられることが許可されているデータティアノードロールのカンマ区切りリストを表します。リストの最初のものが優先度が高いものです。すなわち、インデックスがターゲットにしているティアです。例として、この例ではティアの優先度は data_warm,data_hot であり、インデックスは warm ティアをターゲットにしており、data_warm ロールを持つノードがElasticsearchクラスターにさらに必要です。

ティアがわかったので、そのティアのノード数を増やしてレプリカを割り当てる必要があります。これを行うには、すでに使用している可用性ゾーンのノード数を増やすためにゾーンごとのサイズを増やすか、可用性ゾーンの数を増やします。画面の左上にある3本の横線をクリックしてデプロイメントのランディングページに戻り、このデプロイメントを管理を選択します。そのページで管理ボタンをクリックし、デプロイメントを編集を選択します。これを行うには、https://cloud.elastic.co/にログインしている必要があります。Elasticsearchセクションで、レプリカシャードが割り当てられなかったティアを見つけます。

Kibana Console

  • オプション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

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.number_of_replicas",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. name: 'index.number_of_replicas'
  4. )
  5. puts response

Js

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

Console

  1. GET /my-index-000001/_settings/index.number_of_replicas

レスポンスは次のようになります:

Console-Result

  1. {
  2. "my-index-000001" : {
  3. "settings" : {
  4. "index" : {
  5. "number_of_replicas" : "2"
  6. }
  7. }
  8. }
  9. }
インデックスに必要なレプリカシャードの現在の構成値を表します
  • 3. _cat/nodes APIを使用してターゲットティアのノード数を見つけます:

Python

  1. resp = client.cat.nodes(
  2. h="node.role",
  3. )
  4. print(resp)

Ruby

  1. response = client.cat.nodes(
  2. h: 'node.role'
  3. )
  4. puts response

Js

  1. const response = await client.cat.nodes({
  2. h: "node.role",
  3. });
  4. console.log(response);

Console

  1. GET /_cat/nodes?h=node.role

レスポンスは次のようになり、ノードごとに1行が含まれます:

Console-Result

  1. himrst
  2. mv
  3. himrst

行にターゲットティアを表す文字が含まれている数を数えることで、ノードの数を知ることができます。詳細についてはQuery parametersを参照してください。上記の例では、hを含む行が2行あるため、ホットティアに2ノードがあります。

  • 4. Decrease このインデックスに必要なレプリカシャードの総数の値を減少させます。レプリカシャードは高可用性のためにプライマリシャードと同じノードに存在できないため、新しい値は上記で見つかったノード数から1を引いた数以下である必要があります。上記の例ではホットティアに2ノードが見つかったため、index.number_of_replicasの最大値は1です。

Python

  1. resp = client.indices.put_settings(
  2. index="my-index-000001",
  3. settings={
  4. "index": {
  5. "number_of_replicas": 1
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'my-index-000001',
  3. body: {
  4. index: {
  5. number_of_replicas: 1
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "my-index-000001",
  3. settings: {
  4. index: {
  5. number_of_replicas: 1,
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT /my-index-000001/_settings
  2. {
  3. "index" : {
  4. "number_of_replicas" : 1
  5. }
  6. }
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

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.routing.allocation.include._tier_preference",
  4. flat_settings=True,
  5. )
  6. print(resp)

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. name: 'index.routing.allocation.include._tier_preference',
  4. flat_settings: true
  5. )
  6. puts response

Js

  1. const response = await client.indices.getSettings({
  2. index: "my-index-000001",
  3. name: "index.routing.allocation.include._tier_preference",
  4. flat_settings: "true",
  5. });
  6. console.log(response);

Console

  1. GET /my-index-000001/_settings/index.routing.allocation.include._tier_preference?flat_settings

レスポンスは次のようになります:

Console-Result

  1. {
  2. "my-index-000001": {
  3. "settings": {
  4. "index.routing.allocation.include._tier_preference": "data_warm,data_hot"
  5. }
  6. }
  7. }
このインデックスが割り当てられることが許可されているデータティアノードロールのカンマ区切りリストを表します。リストの最初のものが優先度が高いものです。すなわち、インデックスがターゲットにしているティアです。例として、この例ではティアの優先度は data_warm,data_hot であり、インデックスは warm ティアをターゲットにしており、data_warm ロールを持つノードがElasticsearchクラスターにさらに必要です。

また、Elasticsearchクラスターにノードを追加することが望ましくない場合は、index.number_of_replicasインデックス設定を確認し、構成値を減少させます:

  • 1. レプリカシャードが割り当てられていないインデックスのindex.number_of_replicasインデックス設定を確認します:

Python

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.number_of_replicas",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. name: 'index.number_of_replicas'
  4. )
  5. puts response

Js

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

Console

  1. GET /my-index-000001/_settings/index.number_of_replicas

レスポンスは次のようになります:

Console-Result

  1. {
  2. "my-index-000001" : {
  3. "settings" : {
  4. "index" : {
  5. "number_of_replicas" : "2"
  6. }
  7. }
  8. }
  9. }
インデックスに必要なレプリカシャードの現在の構成値を表します
  • 2. _cat/nodes APIを使用してターゲットティアのノード数を見つけます:

Python

  1. resp = client.cat.nodes(
  2. h="node.role",
  3. )
  4. print(resp)

Ruby

  1. response = client.cat.nodes(
  2. h: 'node.role'
  3. )
  4. puts response

Js

  1. const response = await client.cat.nodes({
  2. h: "node.role",
  3. });
  4. console.log(response);

Console

  1. GET /_cat/nodes?h=node.role

レスポンスは次のようになり、ノードごとに1行が含まれます:

Console-Result

  1. himrst
  2. mv
  3. himrst

ターゲットティアを表す文字が含まれている行を数えることで、ノードの数を知ることができます。詳細についてはQuery parametersを参照してください。上記の例では、hを含む行が2行あるため、ホットティアに2ノードがあります。

  • 3. Decrease このインデックスに必要なレプリカシャードの総数の値を減少させます。レプリカシャードは高可用性のためにプライマリシャードと同じノードに存在できないため、新しい値は上記で見つかったノード数から1を引いた数以下である必要があります。上記の例ではホットティアに2ノードが見つかったため、index.number_of_replicasの最大値は1です。

Python

  1. resp = client.indices.put_settings(
  2. index="my-index-000001",
  3. settings={
  4. "index": {
  5. "number_of_replicas": 1
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.indices.put_settings(
  2. index: 'my-index-000001',
  3. body: {
  4. index: {
  5. number_of_replicas: 1
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.indices.putSettings({
  2. index: "my-index-000001",
  3. settings: {
  4. index: {
  5. number_of_replicas: 1,
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT /my-index-000001/_settings
  2. {
  3. "index" : {
  4. "number_of_replicas" : 1
  5. }
  6. }
index.number_of_replicasインデックス構成の新しい値は、2の前の値から1に減少します。0まで設定できますが、searchable snapshot indices以外のインデックスに対して0に設定すると、ノードの再起動中に一時的な可用性の喪失やデータ破損の場合の永続的なデータ損失が発生する可能性があります。