通常どおりに Elasticsearch にドキュメントを投稿しようとすると、次のエラーが発生します。
cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];
Elasticsearch ログにも次のメッセージが表示されます:
flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
ベストアンサー1
これは、Elasticsearch がディスクの空き容量が少なくなっていると判断し、読み取り専用モードになった場合に発生します。
デフォルトでは、Elasticsearch の決定は空きディスク容量の割合に基づいて行われるため、大容量ディスクでは空き容量が数ギガバイトあってもこれが起こる可能性があります。
フラッドステージのウォーターマークはデフォルトで 95% なので、1 TB ドライブでは少なくとも 50 GB の空き容量が必要です。そうしないと、Elasticsearch は読み取り専用モードになります。
洪水ステージのウォーターマークに関するドキュメントについては、https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html。
適切なソリューションは、たとえば運用環境と開発環境などのコンテキストによって異なります。
解決策1: ディスク領域を解放する
ディスクの 5% 以上が空くように十分なディスク領域を解放すると、この問題は解決します。ただし、十分なディスク領域が空いても Elasticsearch は自動的に読み取り専用モードから解除されないため、インデックスのロックを解除するには次のような操作を行う必要があります。
$ curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
解決策2: 洪水ステージのウォーターマーク設定を変更する
設定を別のものに変更します"cluster.routing.allocation.disk.watermark.flood_stage"
。低いパーセンテージまたは絶対値に設定できます。以下は、設定を変更する方法の例です。ドキュメント:
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}
繰り返しになりますが、これを実行した後は、上記の curl コマンドを使用してインデックスのロックを解除する必要がありますが、その後はインデックスが再び読み取り専用モードになることはなくなります。