重要的系统配置

理想情况下,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.conf
Ubuntu忽略了使用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

如果你看到mlockallfalse,那么这意味着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中设置nofile65536

在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配置
下一篇:引导检查

博弈
2.5k 声望1.5k 粉丝

态度决定一切