透かしエラーの修正
データノードのディスクスペースが 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
resp = client.cat.shards(
v=True,
)
print(resp)
Ruby
response = client.cat.shards(
v: true
)
puts response
Js
const response = await client.cat.shards({
v: "true",
});
console.log(response);
Console
GET _cat/shards?v=true
シャードがノードに残っている場合は、クラスタ割り当て説明 APIを使用して、その割り当て状況の説明を取得してください。
Python
resp = client.cluster.allocation_explain(
index="my-index",
shard=0,
primary=False,
)
print(resp)
Js
const response = await client.cluster.allocationExplain({
index: "my-index",
shard: 0,
primary: false,
});
console.log(response);
Console
GET _cluster/allocation/explain
{
"index": "my-index",
"shard": 0,
"primary": false
}
書き込み操作を即座に復元するには、ディスクの透かしを一時的に増加させて、書き込みブロックを解除することができます。
Python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
"cluster.routing.allocation.disk.watermark.high": "95%",
"cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
"cluster.routing.allocation.disk.watermark.flood_stage": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": "5GB"
},
)
print(resp)
resp1 = client.indices.put_settings(
index="*",
expand_wildcards="all",
settings={
"index.blocks.read_only_allow_delete": None
},
)
print(resp1)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.disk.watermark.low' => '90%',
'cluster.routing.allocation.disk.watermark.low.max_headroom' => '100GB',
'cluster.routing.allocation.disk.watermark.high' => '95%',
'cluster.routing.allocation.disk.watermark.high.max_headroom' => '20GB',
'cluster.routing.allocation.disk.watermark.flood_stage' => '97%',
'cluster.routing.allocation.disk.watermark.flood_stage.max_headroom' => '5GB',
'cluster.routing.allocation.disk.watermark.flood_stage.frozen' => '97%',
'cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom' => '5GB'
}
}
)
puts response
response = client.indices.put_settings(
index: '*',
expand_wildcards: 'all',
body: {
'index.blocks.read_only_allow_delete' => nil
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
"cluster.routing.allocation.disk.watermark.high": "95%",
"cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
"cluster.routing.allocation.disk.watermark.flood_stage": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom":
"5GB",
},
});
console.log(response);
const response1 = await client.indices.putSettings({
index: "*",
expand_wildcards: "all",
settings: {
"index.blocks.read_only_allow_delete": null,
},
});
console.log(response1);
Console
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.low.max_headroom": "100GB",
"cluster.routing.allocation.disk.watermark.high": "95%",
"cluster.routing.allocation.disk.watermark.high.max_headroom": "20GB",
"cluster.routing.allocation.disk.watermark.flood_stage": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": "5GB",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": "97%",
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": "5GB"
}
}
PUT */_settings?expand_wildcards=all
{
"index.blocks.read_only_allow_delete": null
}
長期的な解決策として、影響を受けたデータ層にノードを追加するか、既存のノードをアップグレードしてディスクスペースを増やすことをお勧めします。追加のディスクスペースを解放するには、インデックス削除 APIを使用して不要なインデックスを削除できます。
Ruby
response = client.indices.delete(
index: 'my-index'
)
puts response
Console
DELETE my-index
長期的な解決策が整ったら、ディスクの透かしをリセットまたは再構成してください。
Python
resp = client.cluster.put_settings(
persistent={
"cluster.routing.allocation.disk.watermark.low": None,
"cluster.routing.allocation.disk.watermark.low.max_headroom": None,
"cluster.routing.allocation.disk.watermark.high": None,
"cluster.routing.allocation.disk.watermark.high.max_headroom": None,
"cluster.routing.allocation.disk.watermark.flood_stage": None,
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": None,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": None,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": None
},
)
print(resp)
Ruby
response = client.cluster.put_settings(
body: {
persistent: {
'cluster.routing.allocation.disk.watermark.low' => nil,
'cluster.routing.allocation.disk.watermark.low.max_headroom' => nil,
'cluster.routing.allocation.disk.watermark.high' => nil,
'cluster.routing.allocation.disk.watermark.high.max_headroom' => nil,
'cluster.routing.allocation.disk.watermark.flood_stage' => nil,
'cluster.routing.allocation.disk.watermark.flood_stage.max_headroom' => nil,
'cluster.routing.allocation.disk.watermark.flood_stage.frozen' => nil,
'cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom' => nil
}
}
)
puts response
Js
const response = await client.cluster.putSettings({
persistent: {
"cluster.routing.allocation.disk.watermark.low": null,
"cluster.routing.allocation.disk.watermark.low.max_headroom": null,
"cluster.routing.allocation.disk.watermark.high": null,
"cluster.routing.allocation.disk.watermark.high.max_headroom": null,
"cluster.routing.allocation.disk.watermark.flood_stage": null,
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": null,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": null,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom":
null,
},
});
console.log(response);
Console
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": null,
"cluster.routing.allocation.disk.watermark.low.max_headroom": null,
"cluster.routing.allocation.disk.watermark.high": null,
"cluster.routing.allocation.disk.watermark.high.max_headroom": null,
"cluster.routing.allocation.disk.watermark.flood_stage": null,
"cluster.routing.allocation.disk.watermark.flood_stage.max_headroom": null,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen": null,
"cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom": null
}
}