透かしエラーの修正

データノードのディスクスペースが critically low で、洪水段階のディスク使用量の透かしに達した場合、次のエラーがログに記録されます: Error: disk usage exceeded flood-stage watermark, index has read-only-allow-delete block

ディスクが満杯になるのを防ぐために、ノードがこの透かしに達すると、Elasticsearch はノード上のシャードを持つインデックスへの書き込みをブロックします。このブロックが関連するシステムインデックスに影響を与える場合、Kibana や他の Elastic Stack 機能が利用できなくなる可能性があります。

Elasticsearch は、影響を受けたノードのディスク使用量が 高ディスク透かしを下回ると、自動的に書き込みブロックを解除します。これを実現するために、Elasticsearch は影響を受けたノードの一部のシャードを同じデータ層の他のノードに自動的に移動します。

影響を受けたノードからシャードが移動していることを確認するには、cat shards APIを使用してください。

Python

  1. resp = client.cat.shards(
  2. v=True,
  3. )
  4. print(resp)

Ruby

  1. response = client.cat.shards(
  2. v: true
  3. )
  4. puts response

Js

  1. const response = await client.cat.shards({
  2. v: "true",
  3. });
  4. console.log(response);

Console

  1. GET _cat/shards?v=true

シャードがノードに残っている場合は、クラスタ割り当て説明 APIを使用して、その割り当て状況の説明を取得してください。

Python

  1. resp = client.cluster.allocation_explain(
  2. index="my-index",
  3. shard=0,
  4. primary=False,
  5. )
  6. print(resp)

Js

  1. const response = await client.cluster.allocationExplain({
  2. index: "my-index",
  3. shard: 0,
  4. primary: false,
  5. });
  6. console.log(response);

Console

  1. GET _cluster/allocation/explain
  2. {
  3. "index": "my-index",
  4. "shard": 0,
  5. "primary": false
  6. }

書き込み操作を即座に復元するには、ディスクの透かしを一時的に増加させて、書き込みブロックを解除することができます。

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster.routing.allocation.disk.watermark.low": "90%",
  4. "cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
  5. "cluster.routing.allocation.disk.watermark.high": "95%",
  6. "cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
  7. "cluster.routing.allocation.disk.watermark.flood_stage": "97%",
  8. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
  9. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": "5GB"
  11. },
  12. )
  13. print(resp)
  14. resp1 = client.indices.put_settings(
  15. index="*",
  16. expand_wildcards="all",
  17. settings={
  18. "index.blocks.read_only_allow_delete": None
  19. },
  20. )
  21. print(resp1)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'cluster.routing.allocation.disk.watermark.low' => '90%',
  5. 'cluster.routing.allocation.disk.watermark.low.max_headroom' => '100GB',
  6. 'cluster.routing.allocation.disk.watermark.high' => '95%',
  7. 'cluster.routing.allocation.disk.watermark.high.max_headroom' => '20GB',
  8. 'cluster.routing.allocation.disk.watermark.flood_stage' => '97%',
  9. 'cluster.routing.allocation.disk.watermark.flood_stage.max_headroom' => '5GB',
  10. 'cluster.routing.allocation.disk.watermark.flood_stage.frozen' => '97%',
  11. 'cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom' => '5GB'
  12. }
  13. }
  14. )
  15. puts response
  16. response = client.indices.put_settings(
  17. index: '*',
  18. expand_wildcards: 'all',
  19. body: {
  20. 'index.blocks.read_only_allow_delete' => nil
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "cluster.routing.allocation.disk.watermark.low": "90%",
  4. "cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
  5. "cluster.routing.allocation.disk.watermark.high": "95%",
  6. "cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
  7. "cluster.routing.allocation.disk.watermark.flood_stage": "97%",
  8. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
  9. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom":
  11. "5GB",
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.indices.putSettings({
  16. index: "*",
  17. expand_wildcards: "all",
  18. settings: {
  19. "index.blocks.read_only_allow_delete": null,
  20. },
  21. });
  22. console.log(response1);

Console

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.disk.watermark.low": "90%",
  5. "cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
  6. "cluster.routing.allocation.disk.watermark.high": "95%",
  7. "cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
  8. "cluster.routing.allocation.disk.watermark.flood_stage": "97%",
  9. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
  11. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": "5GB"
  12. }
  13. }
  14. PUT */_settings?expand_wildcards=all
  15. {
  16. "index.blocks.read_only_allow_delete": null
  17. }

長期的な解決策として、影響を受けたデータ層にノードを追加するか、既存のノードをアップグレードしてディスクスペースを増やすことをお勧めします。追加のディスクスペースを解放するには、インデックス削除 APIを使用して不要なインデックスを削除できます。

Ruby

  1. response = client.indices.delete(
  2. index: 'my-index'
  3. )
  4. puts response

Console

  1. DELETE my-index

長期的な解決策が整ったら、ディスクの透かしをリセットまたは再構成してください。

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster.routing.allocation.disk.watermark.low": None,
  4. "cluster.routing.allocation.disk.watermark.low.max_headroom": None,
  5. "cluster.routing.allocation.disk.watermark.high": None,
  6. "cluster.routing.allocation.disk.watermark.high.max_headroom": None,
  7. "cluster.routing.allocation.disk.watermark.flood_stage": None,
  8. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": None,
  9. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": None,
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": None
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'cluster.routing.allocation.disk.watermark.low' => nil,
  5. 'cluster.routing.allocation.disk.watermark.low.max_headroom' => nil,
  6. 'cluster.routing.allocation.disk.watermark.high' => nil,
  7. 'cluster.routing.allocation.disk.watermark.high.max_headroom' => nil,
  8. 'cluster.routing.allocation.disk.watermark.flood_stage' => nil,
  9. 'cluster.routing.allocation.disk.watermark.flood_stage.max_headroom' => nil,
  10. 'cluster.routing.allocation.disk.watermark.flood_stage.frozen' => nil,
  11. 'cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom' => nil
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "cluster.routing.allocation.disk.watermark.low": null,
  4. "cluster.routing.allocation.disk.watermark.low.max_headroom": null,
  5. "cluster.routing.allocation.disk.watermark.high": null,
  6. "cluster.routing.allocation.disk.watermark.high.max_headroom": null,
  7. "cluster.routing.allocation.disk.watermark.flood_stage": null,
  8. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": null,
  9. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": null,
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom":
  11. null,
  12. },
  13. });
  14. console.log(response);

Console

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.disk.watermark.low": null,
  5. "cluster.routing.allocation.disk.watermark.low.max_headroom": null,
  6. "cluster.routing.allocation.disk.watermark.high": null,
  7. "cluster.routing.allocation.disk.watermark.high.max_headroom": null,
  8. "cluster.routing.allocation.disk.watermark.flood_stage": null,
  9. "cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": null,
  10. "cluster.routing.allocation.disk.watermark.flood_stage.frozen": null,
  11. "cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": null
  12. }
  13. }