Elasticsearch 参考指南(重要的系统配置)
重要的系统配置
理想情况下,Elasticsearch应该在服务器上单独运行,并使用所有可用的资源,为了做到这一点,你需要配置你的操作系统,以允许运行Elasticsearch的用户访问默认允许的更多资源。
在进行生产之前,必须考虑以下设置。
开发模式vs生产模式
在默认情况下,Elasticsearch假定你在开发模式下工作,如果上面的任何设置没有正确配置,警告将会写入到日志文件,但是你可以启动和运行你的Elasticsearch节点。
只要你配置一个网络设置,比如network.host,Elasticsearch假定你正在转向生产,并将上述警告升级为异常,这些异常将阻止你的Elasticsearch节点启动,这是一个重要的安全措施,以确保你不会因为配置错误的服务器而丢失数据。
配置系统设置
在哪里配置系统设置取决于你使用哪一个包来安装Elasticsearch,以及你正在使用的操作系统。
当使用.zip或.tar.gz包时,系统设置可配置为:
- 使用ulimit临时更改配置
- 在/etc/security/limits.conf中持久性更改配置
当使用RPM或Debian包时,大多数系统设置都是在系统配置文件中设置的,但是,使用systemd的系统需要在systemd配置文件中指定系统限制。
ulimit
在Linux系统上,ulimit可以用于临时更改资源限制,在切换到要运行Elasticsearch的用户之前,限制通常需要root身份设置。例如,要将打开文件句柄的数量(ulimit -n`)设置为65,536,你可以执行以下操作:
sudo su ulimit -n 65536 su elasticsearch- 切换到root身份
- 更改打开文件的最大数量
- 切换到elasticsearch用户启动Elasticsearch
新限制仅在当前会话期间适用,你可以用ulimit -a查询所有当前应用的限制。
/etc/security/limits.conf
在Linux系统上,可以通过编辑/etc/security/limits.conf文件来为特定用户设置持久性限制配置,要将用户打开的文件的最大数量设置为65,536,请在limits.conf文件中添加以下一行:
elasticsearch - nofile 65536这个更改只会在下次elasticsearch用户打开一个新会话时生效。
Ubuntu 和 limits.confUbuntu忽略了使用init.d启动的进程的limits.conf文件,为了启用limits.conf文件,编辑/etc/pam.d/su并且取消下面行的注释: # session required pam_limits.so
Sysconfig 文件
当使用RPM或Debian包时,系统设置和环境变量可以在系统配置文件中指定,它们位于:
- RPM:/etc/sysconfig/elasticsearch
- Debian:/etc/default/elasticsearch
然而,对于使用systemd的系统,系统限制需要通过systemd来指定。
Systemd 配置
当在使用systemd的系统上使用RPM或Debian包时,必须通过systemd指定系统限制。
systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认的应用限制。
要覆盖它们,添加一个名为etc/systemd/system/elasticsearch.service.d/override.conf的文件(或者,你可以运行sudo systemctl edit elasticsearch,它在默认编辑器中自动打开文件),在此文件中设置任何更改,例如:
[Service] LimitMEMLOCK=infinity完成后,运行以下命令重新加载单元:
sudo systemctl daemon-reload禁用swapping
大多数操作系统尝试使用尽可能多的内存用于文件系统缓存,并急切地交换未使用的应用程序内存,这可能导致JVM堆的某些部分甚至可执行页面被交换到磁盘。
交换对性能、节点稳定性都非常不利,应该不惜一切代价避免交换,它可以导致垃圾收集持续几分钟而不是几毫秒,还可以导致节点响应缓慢,甚至断开与集群的连接,在弹性分布式系统中,它更有效的让操作系统杀死节点。
禁用交换有三种方法,首选的选项是完全禁用交换,如果这不是一个选项,是否选择最小化的swappiness还是内存锁定取决于你的环境。
禁用所有交换文件
通常,Elasticsearch是一个容器上的唯一服务,并且它的内存使用由JVM选项控制,应该不需要启用交换。
在Linux系统上,可以运行以下命令暂时禁用交换:
sudo swapoff -a要永久禁用它,你需要编辑/etc/fstab文件,并注释掉任何包含单词swap的行。
在Windows上,可以通过完全禁用分页文件来实现等效功能,通过System Properties → Advanced → Performance → Advanced → Virtual memory。
配置 swappiness
Linux系统上的另一个可用选项是确保sysctl值vm.swappiness设置为1,这减少了内核交换的趋势,在正常情况下不应该引起交换,同时仍然允许整个系统在紧急情况下交换。
启用 bootstrap.memory_lock
另一种选择是在Linux/Unix系统上使用mlockall,或者在Windows上使用VirtualLock,尝试将进程地址空间锁定到RAM中,以防止任何Elasticsearch内存被交换出去,这可以通过向config/elasticsearch.yml文件中添加这一行来实现:
bootstrap.memory_lock: true mlockall可能会导致JVM或shell会话退出,如果它试图分配超过可用内存的内存!在启动Elasticsearch之后,通过检查该请求的输出中的mlockall的值,你可以看到是否成功应用了此设置:
GET _nodes?filter_path=**.mlockall如果你看到mlockall为false,那么这意味着mlockall请求失败了,你还将看到日志中包含更多信息Unable to lock JVM Memory词语的行。
在Linux/Unix系统上,最可能的原因是运行Elasticsearch的用户没有锁内存的权限,这可以被授予如下:
.zip和.tar.gz
- 在启动Elasticsearch之前作为root身份设置ulimit -l unlimited,或在/etc/security/limit.conf中将memlock设置为unlimited。
RPM和Debian
- 在系统配置文件中将MAX_LOCKED_MEMORY设置为unlimited(或参阅下面使用systemd的系统)。
使用systemd的系统
- 在systemd配置中将LimitMEMLOCK设置为infinity。
mlockall失败的另一个可能原因是临时目录(通常是/tmp)与noexec选项一起挂载,这可以通过使用ES_JAVA_OPTS环境变量指定一个新的临时目录来解决:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" ./bin/elasticsearch或者在jvm.options配置文件中设置这个JVM标志。
文件描述符
这只适用于Linux和macOS,如果在Windows上运行Elasticsearch,则可以被安全地忽略,在Windows上,JVM使用的API仅限于可用资源。Elasticsearch使用大量的文件描述符或文件句柄,耗尽文件描述符可能是灾难性的,并且很可能导致数据丢失,确保将运行Elasticsearch的用户打开的文件描述符的数量限制增加到65,536或更高。
对于.zip和.tar.gz包,在启动Elasticsearch之前作为root身份设置ulimit -n 65536,或在/etc/security/limits.conf中设置nofile为65536。
在macOS上,你还必须将JVM选项-XX:-MaxFDLimit传递给Elasticsearch,以便使用更高的文件描述符限制。
RPM和Debian软件包默认文件描述符的最大数量为65536,不需要进一步配置。
你可以使用节点Stats API检查为每个节点配置的max_file_descriptors,使用:
GET _nodes/stats/process?filter_path=**.max_file_descriptors虚拟内存
Elasticsearch默认使用mmapfs目录存储索引,mmap计数的默认操作系统限制可能太低,这可能导致内存不足异常。
在Linux上,可以通过以root身份运行以下命令来增加限制:
sysctl -w vm.max_map_count=262144要永久设置此值,请更新在/etc/sysctl.conf中的vm.max_map_count设置,要验证重新引导后的效果,请运行sysctl vm.max_map_count。
RPM和Debian包将自动配置此设置,不需要进一步的配置。
线程数
Elasticsearch为不同类型的操作使用许多线程池,重要的是,它能够在需要时创建新的线程,确保Elasticsearch用户能够创建的线程数至少是4096个。
这可以通过在启动Elasticsearch之前作为root身份设置ulimit -u 4096,或者在/etc/security/limit.conf中将nproc设置为4096来实现。
当作为服务在systemd下运行时,包发行版将为Elasticsearch进程自动配置线程数,不需要额外的配置。
DNS缓存设置
Elasticsearch运行时有一个安全管理器,有了安全管理器,JVM默认无限期地缓存积极的主机名解析。如果你的Elasticsearch节点在DNS解析随时间变化的环境中依赖于DNS(例如,节点到节点的发现),那么你可能需要修改默认的JVM行为,这可以通过添加networkaddress.cache.ttl=<timeout>到你的Java安全策略来修改。任何未能解析的主机将被记录,还要注意,在Java安全管理器就绪后,JVM默认缓存负主机名解析时间为10秒,这可以通过添加networkaddress.cache.ttl=<timeout>到你的Java安全策略来修改。
上一篇:重要的Elasticsearch配置
下一篇:引导检查
总结
以上是生活随笔为你收集整理的Elasticsearch 参考指南(重要的系统配置)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: mongodb系列~mongodb慢语句
- 下一篇: windows_硬盘上设置虚拟内存