如果在Elasticsearch中出现了“所有片段均失败”的情况,请尝试怀疑max_open_files设置

最近我在开发环境的Elasticsearch中遇到了”所有分片均失败”的问题,我只是简单地认为可能是因为在没有关闭Vagrant的情况下重新启动了主机。之前我只是通过vagrant snapshot restore进行了处理,但是由于这个问题越来越频繁,所以我开始寻找解决方法。

当我查看/var/log/elasticsearch/elasticsearch.log时,发现有以下类似的日志留存:”打开文件太多”。

 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

当我尝试搜索时,我发现会出现关于受到最大文件打开限制的类似日志,因此我决定尝试提高这个限制值。

您可以通过下方内容来确认当前的设定值。

$ 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后,”所有分片失败”的问题已经解决。

广告
将在 10 秒后关闭
bannerAds