设置Elasticsearch之重要的系统配置

重要的系统配置

理想情况下,Elasticsearch应该单独在一个服务器上运行,并使用所有可用的资源。为了做到这一点,您需要配置您的操作系统允许用户运行Elasticsearch比默认允许访问更多的资源。

以下设置必须在生产使用时配置:

  • 设置JVM堆大小
  • 禁用交换
  • 增加文件描述符
  • 确保足够的虚拟内存
  • 确保足够的线程

开发模式vs生产模式

默认情况下,Elasticsearch假定您在开发模式下工作。如果没有正确配置上面的任何设置,将向日志文件写入警告,但是您将能够启动并运行您的Elasticsearch节点。

只要配置了网络之类的网络设置。在主机上,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 -----1

ulimit -n 65535 -----2

su elasticsearch -----3

1.切换为root。

2.更改打开文件的最大数量。

3.切换为elasticsearch用户,以便启动elasticsearch。

新限制仅在当前会话期间应用。

您可以使用ulimit -a查询所有当前应用的限制。

/etc/security/limits.conf

在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久性限制。要将elasticsearch用户打开的文件的最大数量设置为65,536,请在limit .conf文件中添加以下行:

elasticsearch  -  nofile  65535

此更改仅在下次elasticsearch用户打开新会话时生效。

Ubuntu和limits.conf

Ubuntu忽略init.d启动进程的limit .conf文件。要启用limit .conf文件,请编辑/etc/ pamf。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/overrid .conf的文件(或者,可以运行sudo systemctl edit elasticsearch,它会在默认编辑器中自动打开文件)。设置此文件中的任何更改,例如:

[Service]

LimitMEMLOCK=infinity

完成后,运行以下命令重新加载单元:

sudo systemctl daemon-reload

禁用交换空间

大多数操作系统都试图为文件系统缓存使用尽可能多的内存,并急切地交换出未使用的应用程序内存。这可能导致JVM堆的一部分,甚至其可执行页面被交换到磁盘。

交换对性能和节点稳定性非常不利,应该不惜一切代价避免交换。它可能导致垃圾收集持续几分钟而不是几毫秒,还可能导致节点响应缓慢,甚至断开与集群的连接。在弹性分布式系统中,让操作系统杀死节点更有效。

有三种方法可以禁用交换。首选选项是完全禁用swap。如果这不是一个选项,那么是选择最小化swappiness还是选择内存锁定取决于您的环境。

禁用所有交换文件

通常,Elasticsearch是在一个框上运行的唯一服务,它的内存使用由JVM选项控制。应该不需要启用交换。

在Linux系统上,您可以通过运行:

sudo swapoff -a

这并不需要重新启动Elasticsearch。

要永久禁用它,您需要编辑/etc/fstab文件并注释掉包含单词swap的任何行。

在Windows上,可以通过系统属性→高级→性能→高级→虚拟内存完全禁用分页文件来实现相同的功能。

配置swappiness

Linux系统上的另一个可用选项是确保sysctl值vm.swappiness被设置为1。这减少了内核交换的趋势,并且在正常情况下不应该导致交换,同时仍然允许整个系统在紧急情况下交换。

开启bootstrap.memory_lock

另一种选择是在Linux/Unix系统上使用mlockall,或者在Windows上使用VirtualLock,尝试将进程地址空间锁定到RAM中,防止任何Elasticsearch内存被交换出去。这可以通过在config/elasticsearch.yml文件中添加这一行来实现:

bootstrap.memory_lock: true

警告:如果JVM或shell会话试图分配比可用内存更多的内存,那么mlockall可能会导致JVM或shell会话退出!

在开始Elasticsearch后,通过检查该请求输出的mlockall值,可以看到是否成功应用了该设置:

GET _nodes?filter_path=**.mlockall

如果您看到mlockall为false,则意味着mlockall请求已经失败。您还将在日志中看到一行包含更多信息,其中的单词无法锁定JVM内存。

在Linux/Unix系统上,最可能的原因是运行Elasticsearch的用户没有锁定内存的权限。这可以给予如下:

.zip and .tar.gz

在开始Elasticsearch之前,将ulimit -l unlimited设置为root,或者在/etc/security/limits.conf中将memlock设置为unlimited。

RPM and Debian

在系统配置文件中将MAX_LOCKED_MEMORY设置为无限制(或使用systemd的系统请参阅下面的内容)。

Systems using systemd

在systemd配置中将LimitMEMLOCK设置为无穷大。

mlockall可能失败的另一个原因是JNA临时目录(通常是/tmp的子目录)是用noexec选项挂载的。这可以通过使用ES_JAVA_OPTS环境变量为JNA指定一个新的临时目录来解决:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir="

./bin/elasticsearch

或者在jvm.options配置文件中设置这个JVM标志。

文件描述符

请注意

这只适用于Linux和macOS,如果在Windows上运行Elasticsearch,可以安全地忽略它。在Windows上,JVM只使用受可用资源限制的API。

Elasticsearch使用许多文件描述符或文件句柄。耗尽文件描述符可能是灾难性的,并且很可能导致数据丢失。确保将运行Elasticsearch的用户打开文件描述符的数量限制增加到65,536或更高。

对于.zip和.tar.gz包,在启动Elasticsearch之前将ulimit -n 65535设置为root,或者在/etc/security/limit .conf中将nofile设置为65535。

在macOS上,还必须将JVM选项-XX:-MaxFDLimit传递给Elasticsearch,以便它使用更高的文件描述符限制。

RPM和Debian包已经默认文件描述符的最大数量为65535,并且不需要进一步的配置。

您可以使用node Stats API检查为每个节点配置的max_file_descriptors,方法是:

GET _nodes/stats/process?filter_path=**.max_file_descriptors

虚拟内存

Elasticsearch默认使用mmapfs目录存储索引。默认操作系统对mmap计数的限制可能太低,这可能导致内存异常。

在Linux上,您可以通过作为根用户运行以下命令来增加限制:

sysctl -w vm.max_map_count=262144

若要永久设置此值,请更新vm。max_map_count设置在/etc/sysctl.conf中。要在重启后验证,请运行sysctl vm.max_map_count。

RPM和Debian包将自动配置此设置。不需要进一步的配置。

线程数量

Elasticsearch为不同类型的操作使用许多线程池。重要的是,它能够在需要时创建新线程。确保Elasticsearch用户可以创建的线程数至少为4096。

这可以通过在开始Elasticsearch之前将ulimit -u 4096设置为root,或者在/etc/security/limits.conf中将nproc设置为4096来实现。

在systemd下作为服务运行时,包分发包将自动配置Elasticsearch进程的线程数。不需要额外的配置。

DNS 缓存配置

         Elasticsearch在安全管理器到位的情况下运行。有了安全管理器,JVM默认无限期缓存正主机名解析,默认缓存负主机名解析10秒。Elasticsearch使用默认值覆盖此行为,将正查找缓存60秒,将负查找缓存10秒。这些值应该适用于大多数环境,包括DNS分辨率随时间变化的环境。如果没有,可以在JVM选项中编辑es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl。注意值networkaddress.cache.ttl=和networkaddress.cache.negative.ttl=在 Java安全策略被elasticsearch忽略直到你删除es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl的设置。

不使用noexec进行java进行临时目录挂载

注意

这仅适用于Linux。

Elasticsearch使用Java Native Access(JNA)库来执行一些与平台相关的本机代码。在Linux上,支持此库的本机代码在运行时从JNA存档中提取。默认情况下,此代码将解压缩到Elasticsearch临时目录,该目录默认为/ tmp的子目录。或者,可以使用JVM标志-Djna.tmpdir = 控制此位置。由于本机库作为可执行文件映射到JVM虚拟地址空间,因此不能使用noexec挂载提取此代码的位置的基础挂载点,因为这会阻止JVM进程将此代码映射为可执行文件。在某些强化的Linux安装中,这是/ tmp的默认挂载选项。使用noexec安装底层安装的一个指示是,在启动时,JNA将无法使用java.lang.UnsatisfiedLinkerError异常加载,并且出现无法从共享对象映射段的消息。请注意,异常消息可能因JVM版本而异。此外,依赖于通过JNA执行本机代码的Elasticsearch组件将失败,并显示消息表明它是因为JNA不可用。如果您看到此类错误消息,则必须重新安装用于JNA的临时目录,以便不使用noexec挂载。

启动检查

启动elasticsearch

停止elasticsearch

添加节点到你的集群

设置X-Pack

配置监控

安全设置

配置X-Pack java客户端

X-Pack启动检查

这些暂不翻译请参照官网

你可能感兴趣的:(elasticsearch,elasticsearch)