最近何度か開発環境の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
を設定しました。
[Service]
LimitNOFILE=655360
これでElasticsearchを再起動したら"all shards failed"が解消できました。