インデックスのシャードの総数が単一ノードを超えました

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**に移動します。
    Kibana Console

  • 4. 未割り当てのシャードを持つインデックスのindex.routing.allocation.total_shards_per_node インデックス設定を確認します:

Python

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.routing.allocation.total_shards_per_node",
  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.total_shards_per_node',
  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.total_shards_per_node",
  4. flat_settings: "true",
  5. });
  6. console.log(response);

コンソール

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

応答は次のようになります:

コンソール-結果

  1. {
  2. "my-index-000001": {
  3. "settings": {
  4. "index.routing.allocation.total_shards_per_node": "1"
  5. }
  6. }
  7. }
my-index-000001インデックスの1つのノードに存在できるシャードの総数の現在の設定値を示します。
  • 5. 増加させて、1つのノードに割り当てられるシャードの総数をより高い値に設定します:

Python

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

Ruby

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

Js

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

コンソール

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

  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);

コンソール

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

応答は次のようになります:

コンソール-結果

  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ティアをターゲットにしており、Elasticsearchクラスタにはdata_warmロールを持つノードがさらに必要です。

また、Elasticsearchクラスタにノードを追加することが望ましくない場合は、index.routing.allocation.total_shards_per_node インデックス設定の設定を確認し、設定値を増やすことで、同じノードにより多くのシャードを割り当てることができます。

  • 1. 未割り当てのシャードを持つインデックスのindex.routing.allocation.total_shards_per_node インデックス設定を確認します:

Python

  1. resp = client.indices.get_settings(
  2. index="my-index-000001",
  3. name="index.routing.allocation.total_shards_per_node",
  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.total_shards_per_node',
  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.total_shards_per_node",
  4. flat_settings: "true",
  5. });
  6. console.log(response);

コンソール

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

応答は次のようになります:

コンソール-結果

  1. {
  2. "my-index-000001": {
  3. "settings": {
  4. "index.routing.allocation.total_shards_per_node": "1"
  5. }
  6. }
  7. }
my-index-000001インデックスの1つのノードに存在できるシャードの総数の現在の設定値を示します。
  • 2. 増加させて、1つのノードに割り当てられるシャードの総数を増やすか、値を無制限(-1)にリセットします:

Python

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

Ruby

  1. response = client.indices.put_settings(
  2. index: 'my-index-000001',
  3. body: {
  4. index: {
  5. 'routing.allocation.total_shards_per_node' => -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. "routing.allocation.total_shards_per_node": -1,
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. PUT /my-index-000001/_settings
  2. {
  3. "index" : {
  4. "routing.allocation.total_shards_per_node" : -1
  5. }
  6. }