Elasticsearchで"all shards failed"がでるようになったらmax_open_files設定をうたがってみる


最近何度か開発環境のElasticsearchで"all shards failed"が発生してたんですが、Vagrant終了させずにホストを再起動したっけ?ぐらいにしか思わず、vagrant snapshot restoreでしのいでたんですが、かなり頻発するようになってきたので対処法しらべてみました。

/var/log/elasticsearch/elasticsearch.log を確認してみると下記の様に "Too many open files" ってログが残ってました。

 at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: java.nio.file.FileSystemException: /var/lib/elasticsearch/nodes/0/indices/TQgoFaQTT3ijwfBVxYiMFA/3/translog/translog-163.ckp: Too many open files

ぐぐってみると max open filesの制限にかかるとこんなログがでるようなので、この制限値をあげてみることに。

現在の設定値の確認は下記で。

$ curl -XGET "http://localhost:9200/_nodes/stats/process?filter_path=**.max_file_descriptors"

でもってどこで設定変えればいいのかがよくわからなくて散々はまりました^^;
/etc/init.d/elasticsearch で設定って記事があったり、 /etc/security/limits.conf で設定って記事があったり…

それらを書き換えても全然反映されなかったんですが、systemctl status elasticsearch したら設定ファイルの位置がちゃんと出力されてました

$ # systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)

このファイルを直接いじって反映されたんですが、 systemd で ulimit 上げるときの推奨の方法 って記事を発見したのでこれにならって /etc/systemd/system/elasticsearch.service.d/max_open_files.conf ってファイルを作成して LimitNOFILEを設定しました。

/etc/systemd/system/elasticsearch.service.d/max_open_files.conf
[Service]
LimitNOFILE=655360

これでElasticsearchを再起動したら"all shards failed"が解消できました。