環境
Elasticsearch6.7
事象
Elasticsearchのデータを定期的に追加・更新するシステムを開発中、ログにこのようなエラーが出ていました。
FORBIDDEN/12/index read-only / allow delete(api)
原因
Elasticsearchはディスクの容量が少なくなると、インデックスを保護するためにもディスク領域を使い果たさないよう自動的にロックをかける設定をします。
追加・更新させない代わりに、読み取りだけは保護されるのでシステム全体が落ちたりすることはなくなります。
ありがたや。ありがたや。。
公式にもちゃんと書いてありました。
https://www.elastic.co/guide/en/elasticsearch/reference/6.7/disk-allocator.html
確認方法
エラーを吐いていたインデックスを見てみましょう。
インデックス内に"read_only_allow_delete": "true"
となっているとロックがかかっていることになります。
すでにロックがかかっている場合、ノードに格納された全てのインデックスにロックがかかっている可能性がありますので注意してみてあげましょう。
# インデックスの確認 by Kibana DevTools Console
GET [index_name]/_settings
{
"[index_name]": {
"settings": {
"index": {
"number_of_shards": "1",
"blocks": {
"read_only_allow_delete": "true" >> コイツ!!!
},
"provided_name": "[index_name]",
"creation_date": "1573398000",
"number_of_replicas": "0",
"uuid": "e9USqJjwv4mbAzRFWG8dRFM",
"version": {
"created": "6000000"
}
}
}
}
}
対応策
まずは、暫定的な対応として不要なインデックスなどを削除する。
削除できない場合は、ディスク容量を増やすなどの恒久対応も検討してみてください。
空き容量が確保できたら、インデックスのロックを解除する必要があります。
# インデックスのロック解除 by Kibana DevTools Console
PUT [index_name]/_settings
{
"index.blocks.read_only_allow_delete": null
}
対応後の確認
blocks
ごとごっそりなくなっているのが分かります。
これでデータの追加・更新ができるようになりました。
# インデックスの確認 by Kibana DevTools Console
GET [index_name]/_settings
{
"[index_name]": {
"settings": {
"index": {
"number_of_shards": "1",
"provided_name": "[index_name]",
"creation_date": "1573398000",
"number_of_replicas": "0",
"uuid": "e9USqJjwv4mbAzRFWG8dRFM",
"version": {
"created": "6000000"
}
}
}
}
}
さいごに
今回は、データを大量投入するなどのテストを実施しているときに見つけたエラーでした。
十分な容量計算をせずにディスク設定していたのと、想定を上回るデータを入れてみたため気づいたところもあります。
商用で動かすサービスは、事前に十分な容量の確保・データの増加を計算するようにすれば今回のエラーは起こらないと思います。
一つ勉強になってよかった。ありがたや。