Elasticsearch参考[7.5] - Elasticsearch中的重要配置

尽管Elasticsearch需要很少的配置,但是在投入生产之前,需要考虑许多设置。

进入生产之前,必须考虑以下设置:

path.data和path.logs

如果您使用的是.zip或.tar.gz存档,则数据和日志目录是$ES_HOME的子文件夹。如果这些重要文件夹保留在其默认位置,则在将Elasticsearch升级到新版本时,这些文件夹很有可能被删除。

在生产中使用时,几乎可以肯定您想更改data和log文件夹的位置:

path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

RPM和Debian发行版已经为数据和日志使用了自定义路径。
path.data设置可以设置为多个路径,在这种情况下,所有路径都将用于存储数据(尽管属于单个碎片的文件都将存储在同一个数据路径上):

path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3

cluster.name

节点只能在与群集中的所有其他节点共享其cluster.name时加入群集。默认名称是elasticsearch,但您应该将其更改为描述集群用途的适当名称。

cluster.name: logging-prod

请确保在不同的环境中不要重用相同的集群名称,否则可能会导致节点加入错误的集群。

node.name

Elasticsearch使用node.name作为Elasticsearch特定实例的可读标识符,因此它包含在许多API的响应中。它默认为机器在Elasticsearch启动时的主机名,但可以在Elasticsearch.yml中显式配置,如下所示:

node.name: prod-data-2

network.host

默认情况下,Elasticsearch仅绑定到环回地址,例如127.0.0.1 和[::1]。这足以在服务器上运行单个开发节点。

实际上,可以从单个节点上相同的$ES_HOME位置启动多个节点。这对于测试Elasticsearch形成集群的能力很有用,但它不是生产中推荐的配置。
 

为了与其他服务器上的节点形成集群,您的节点将需要绑定到非环回地址。尽管网络设置很多 ,通常您需要配置的是 network.host

network.host: 192.168.1.10

network.host设置还了解一些特殊值,如 _local__site__global_以及修改器,如:ip4和:ip6,其详细信息可以在network.host的特殊值中找到。

一旦为network.host提供了自定义设置,Elasticsearch就会假设您正在从开发模式转到生产模式,并将许多系统启动检查从警告升级到异常。有关详细信息,请参见开发模式与生产模式

重要的发现和集群的形成设置

在投入生产之前,应配置两个重要的发现和集群形成设置,以便集群中的节点可以彼此发现并选举一个主节点。

discovery.seed_hosts

开箱即用,无需任何网络配置,Elasticsearch将绑定到可用的环回地址,并将扫描本地端口9300至9305,以尝试连接到在同一服务器上运行的其他节点。这提供了自动群集体验,而无需进行任何配置。

如果要与其他主机上的节点组成集群,则必须使用该discovery.seed_hosts设置来提供集群中其他主机列表,这些主机符合主机要求,并且可能处于活动状态且可联系,以播种发现过程。此设置通常应包含集群中所有符合主机要求的节点的地址。此设置包含主机数组或逗号分隔的字符串。每个值都应采用host:porthost的形式​​​​​​(其中port默认设置为transport.profiles.default.port,如果未设置,则返回transport.port)。请注意,IPv6主机必须放在方括号中。此设置的默认值为127.0.0.1, [::1]

cluster.initial_master_nodes

当您第一次启动一个全新的Elasticsearch集群时,会有一个集群引导步骤,该步骤确定在第一次选举中计票的主合格节点集。在开发模式下,在未配置发现设置的情况下,此步骤由节点本身自动执行。由于此自动引导天生不安全,因此当您在生产模式下启动一个全新的集群时,必须显式列出在第一次选举中应计算其票数的符合主节点资格的节点。此列表是使用cluster.initial_master_nodes设置设置的。当重新启动群集或向现有群集添加新节点时,不应使用此设置。

 

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11   #1 
   - seeds.mydomain.com   #2 
cluster.initial_master_nodes:  #3  
   - master-node-a
   - master-node-b
   - master-node-c

#1 端口将默认为transport.profiles.default.port,如果未指定,则返回transport.port。

#2 如果主机名解析为多个IP地址,则节点将尝试在所有解析的地址上发现其他节点。

#3 初始主节点应该由node.name标识,该名称默认为其主机名。确保cluster.initial_master_nodes中的值与node.name完全匹配。如果使用完全限定的域名(如master-node-a.example.com)作为节点名,则必须在此列表中使用完全限定的名称;反之,如果node.name是没有任何尾随限定符的裸主机名,则还必须省略cluster.initial_master_nodes中的尾随限定符。

有关更多信息,请参阅引导集群以及 发现和集群形成设置


设置堆大小

默认情况下,ErrestTebug告诉JVM使用一个最小和最大大小为1 GB的堆。当转移到生产环境时,配置堆大小以确保Elasticsearch有足够的可用堆是很重要的。

弹性搜索将通过XMS(最小堆大小)和Xmx(最大堆大小)设置分配jvm.options中指定的整个堆。您应该将这两个设置设置为彼此相等。

这些设置的值取决于服务器上可用的RAM数量:

 

  • 将Xmx和Xms设置为不超过物理RAM的50%。Elasticsearch需要内存用于JVM堆以外的其他用途,为此留出空间非常重要。例如,Elasticsearch使用堆外缓冲区实现高效的网络通信,依赖操作系统的文件系统缓存实现对文件的高效访问,而JVM本身也需要一些内存。使用的内存超过Xmx设置配置的限制是正常的。
  • 将Xmx和Xms设置为不超过JVM用于压缩对象指针(压缩oops)的阈值;确切的阈值有所不同,但接近32gb。您可以通过在日志中查找以下行来验证是否低于阈值:

         heap size [1.9gb], compressed ordinary object pointers [true]

  • 理想情况下,将Xmx和Xms设置为不超过基于零的压缩oops的阈值;确切的阈值有所不同,但在大多数系统上,26gb是安全的,但在某些系统上可以达到30gb。您可以通过使用JVM选项 -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode启动Elasticsearch并查找如下行来验证是否低于此阈值:
    heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops

 

  • 显示已启用基于零的压缩OOP。如果未启用基于零的压缩OOP,则您将看到如下行:

        heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

Elasticsearch可用的堆越多,它可用于其内部缓存的内存就越多,但它留给操作系统用于文件系统缓存的内存就越少。同样,较大的堆可能导致较长的垃圾回收暂停。

以下是有关如何通过jvm.options文件设置堆大小的示例:

-Xms2g   #1
-Xmx2g   #2 

#1 将最小堆大小设置为2g。

#2 将最大堆大小设置为2g。

也可以通过环境变量设置堆大小。这可以通过注释jvm.options文件中的Xms和Xmx设置并通过ES_JAVA_OPTS设置这些值来完成:

ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch  #1 
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch   #2

#1 将最小和最大堆大小设置为2 GB。

#2 将最小和最大堆大小设置为4000 MB。

为Windows服务配置堆与上述不同。最初为Windows服务填充的值可以如上所述进行配置,但在安装服务后会有所不同。有关其他详细信息,请参阅Windows服务文档

JVM堆转储路径

默认情况下,Elasticsearch配置JVM将堆转储到默认数据目录(对于RPM和Debian包目录为/var/lib/Elasticsearch,tar和zip存档目录为Elasticsearch安装根目录下的data目录)。如果此路径不适合接收堆转储,则应在jvm.options中修改条目XX:HeapDumpPath=...。如果指定一个目录,JVM将根据运行实例的PID为堆转储生成一个文件名。如果您指定了一个固定的文件名而不是一个目录,当JVM需要在内存不足的异常上执行堆转储时,文件就不可能存在,否则堆转储将失败。

GC日志

默认情况下,Elasticsearch启用GC日志。它们在jvm.options中配置,默认位置与Elasticsearch日志相同。默认配置每64 MB旋转一次日志,最多可占用2 GB磁盘空间。

临时目录

默认情况下,Elasticsearch使用启动脚本在系统临时目录下创建的专用临时目录。
 

在某些Linux发行版上,如果文件和目录最近没有被访问过,系统实用程序将从/tmp中清除它们。如果长时间不使用需要临时目录的功能,这可能导致在运行Elasticsearch时删除专用临时目录。如果随后使用需要临时目录的功能,则会导致问题。


如果使用.deb或.rpm包安装Elasticsearch并在systemd下运行,则Elasticsearch使用的专用临时目录将从定期清理中排除。


但是,如果您打算在Linux上长时间运行.tar.gz发行版,那么应该考虑为Elasticsearch创建一个专用的临时目录,该目录不在将从中清除旧文件和目录的路径下。此目录应设置权限,以便只有运行Elasticsearch的用户才能访问它。然后在启动Elasticsearch之前,将$ES_TMPDIR环境变量设置为指向它。

JVM致命错误日志

默认情况下,Elasticsearch将JVM配置为将致命错误日志写入默认日志目录(RPM和Debian包是/var/log/Elasticsearch,tar和zip存档在Elasticsearch安装根目录下的logs目录)。这些是JVM遇到致命错误(例如,分段错误)时生成的日志。如果此路径不适合接收日志,则应修改条目-XX:ErrorFile=...在jvm.options中设置一个备用路径。

 

重要的系统配置

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

进入生产之前,必须考虑以下设置:

开发模式与生产模式

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

一旦您配置了类似的网络设置network.host,Elasticsearch就会假设您即将投入生产,并将上述警告升级为异常。这些异常将阻止您的Elasticsearch节点启动。这是一项重要的安全措施,可确保不会因服务器配置错误而丢失数据。

配置系统设置

在哪里配置系统设置取决于您用于安装Elasticsearch的软件包以及所使用的操作系统。

使用.zip.tar.gz软件包时,可以配置系统设置:

使用RPM或Debian软件包时,大多数系统设置是在系统配置文件中设置的 。但是,使用systemd的系统要求在systemd配置文件中指定系统限制 。

ulimit

在Linux系统上,ulimit可用于临时更改资源限制。在切换到将运行Elasticsearch的用户之前,通常需要将限制设置为根。例如,要将打开的文件句柄数(ulimit -n)设置为65536,可以执行以下操作:

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,请在limits.conf文件中添加以下行:

elasticsearch  -  nofile  65535

此更改仅在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的系统上使用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

禁用交换

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

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

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

禁用所有交换文件

通常,Elasticsearch是在盒子上运行的唯一服务,其内存使用量由JVM选项控制。无需启用交换功能。

在Linux系统上,可以通过运行以下命令暂时禁用交换:

sudo swapoff -a

这不需要重启Elasticsearch。

要永久禁用它,您将需要编辑/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

如果试图分配更多的内存,McLeMART可能会导致JVM或shell会话退出!

启动Elasticsearch后,可以通过检查此请求输出中mlockall的值来查看是否成功应用了此设置:

GET _nodes?filter_path=**.mlockall

如果看到的mlockallfalse,则表示mlockall 请求已失败。您还将在日志中看到一行,上面有更多信息Unable to lock JVM Memory

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

.zip 和 .tar.gz

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

RPM和Debian

系统配置文件中 将MAX_LOCKED_MEMORY设置为unlimited(对于使用systemd的系统,请参阅下文)。

系统使用 systemd

systemd配置中将LimitMEMLOCK设置为infinity(无穷大)。

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

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
./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/limits.conf中将nofile设置为65535。

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

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

您可以使用Nodes stats API检查为每个节点配置的max_file_描述符,方法是:

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之前将ulimit -u 4096设置为root来完成,也可以通过在/etc/security/limits.conf中将nproc设置为4096来完成。
在systemd下作为服务运行时的包分发将自动配置Elasticsearch进程的线程数。不需要其他配置。

DNS缓存设置

Elasticsearch运行时有一个安全管理器。有了安全管理器,JVM默认无限期地缓存正向主机名解析,默认情况下缓存负向主机名解析10秒。Elasticsearch使用默认值覆盖此行为,以缓存正向查找60秒,缓存负向查找10秒。这些值应该适用于大多数环境,包括DNS分辨率随时间变化的环境。否则,可以在JVM options中编辑值es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl。请注意,除非删除networkaddress.cache.ttl=<timeout> 和networkaddress.cache.negative.ttl=<timeout>的设置,否则Elasticsearch将忽略Java安全策略中的es.networkaddress.cache.ttl 和es.networkaddress.cache.negative.ttl值。

JNA临时目录未通过noexec挂载

这仅与Linux有关。

Elasticsearch使用Java Native Access(JNA)库执行一些依赖于平台的本机代码。在Linux上,支持这个库的本机代码在运行时从JNA存档中提取。默认情况下,此代码提取到Elasticsearch临时目录,该目录默认为/tmp的子目录。或者,可以使用JVM标志-Djna.tmpdir=<path>来控制这个位置。由于本机库作为可执行文件映射到JVM虚拟地址空间,因此此代码提取到的位置的底层装入点不能使用noexec装入,因为这会阻止JVM进程将此代码映射为可执行文件。在某些强化的Linux安装中,/tmp是默认装载选项。使用noexec挂载底层挂载的一个迹象是,在启动时,JNA将无法使用java.lang.UnsatisfiedLinkerError异常进行加载,并显示一条消息,“failed to map segment from shared object”。注意,异常消息在不同的JVM版本中可能有所不同。此外,Elasticsearch中依赖于通过JNA执行本机代码的组件将失败,并显示消息,because JNA is not available。如果您看到这样的错误消息,则必须重新装载用于JNA的临时目录,以使其不与noexec一起装载。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值