重要的系统配置
理想情况下,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
如果你看到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安全策略来修改。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。