Elasticsearch重要的配置

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

生产前必须考虑以下设置:

path.data and path.logs

如果使用.zip或.tar.gz归档文件,则数据和日志目录是$ES_HOME的子文件夹。如果这些重要的文件夹保留在它们的默认位置,则在将Elasticsearch升级到新版本时,删除它们的风险很高。

在生产使用中,你几乎肯定会想要更改数据和日志文件夹的位置:

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设置来提供群集中其他节点的列表,这些节点是master-eligible并需要是实时的且可联系的,以便散播发现过程。此设置通常应包含集群中所有符合主节点条件的节点的地址。此设置包含主机数组或逗号分隔的字符串。每个值的形式应该是host:port或host(其中port默认设置transport.profile .default.port返回到trans.port如果没有设置)。注意IPv6主机必须括起来。这个设置的默认值是127.0.0.1,[::1]。

cluster.initial_master_nodes

当您第一次启动一个全新的Elasticsearch集群时,会有一个集群引导步骤,该步骤在第一次选举计票决定master-eligible节点集。在开发模式中,没有配置发现设置,此步骤由节点本身自动执行。由于这种自动引导本质上是不安全的,所以当您在生产模式中启动一个全新的集群时,必须显式地列出在第一次选举中应该计算其选票的符合主资格的节点。这个列表是使用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.profile.default.port并回退到transport.port

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

3.初始主节点应该由它们的node.name来标识,默认情况下是它们的主机名。确保cluster.initial_master_nodes中的值与node.name完全匹配。如果您使用一个完全限定域名,如master- nodes -a.example.com作为您的节点名,那么您必须使用此列表中的完全限定域名;相反,如果node.name是一个没有任何尾随限定符的裸主机名,那么还必须省略cluster.initial_master_nodes中的尾随限定符。

设置堆大小

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

Elasticsearch将分配jvm中指定的整个堆。通过Xms(最小堆大小)和Xmx(最大堆大小)设置的选项。您应该将这两个设置设置为相等。

这些设置的值取决于服务器上可用的内存大小:

将Xmx和Xms设置为不超过物理RAM的50%。除了JVM堆之外,Elasticsearch还需要内存,为它留出空间很重要。例如,Elasticsearch使用堆外缓冲区来进行有效的网络通信,依赖于操作系统的文件系统缓存来有效地访问文件,JVM本身也需要一些内存。使用比Xmx设置配置的限制更多的内存来观察Elasticsearch过程是正常的。

将Xmx和Xms设置为不超过JVM用于压缩对象指针的阈值(压缩的oops);确切的阈值有所不同,但接近32 GB。您可以通过在日志中查找如下一行来验证您是否在阈值以下:

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

理想情况下,将Xmx和Xms设置为不超过基于0的压缩oops的阈值;确切的阈值有所不同,但是26gb在大多数系统上是安全的,但是在某些系统上可能高达30gb。您可以通过使用JVM选项-XX:+ unlockvmoptions -XX:+PrintCompressedOopsMode启动Elasticsearch来验证您是否处于这个阈值以下,并寻找如下行:

heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops

显示启用了从零开始的压缩oops。如果没有启用从零开始的压缩oops,那么您将看到如下一行:

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

对Elasticsearch可用的堆越多,它可以为其内部缓存使用的内存就越多,但是留给操作系统用于文件系统缓存的可用内存就越少。此外,较大的堆可能导致更长时间的垃圾收集暂停。

下面是如何通过jvm设置堆大小的示例。选择文件:

-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 heap dump path

默认情况下,Elasticsearch配置JVM堆转储内存溢出异常的默认数据目录(/var/lib/elasticsearch是 RPM和Debian软件包所分布和elasticsearch根目录下的数据目录安装为这tar和zip档分布)。如果此路径不适合接收堆转储,则应修改条目-XX:HeapDumpPath=…在jvm.options。如果指定一个目录,JVM将根据运行实例的PID为堆转储生成一个文件名。如果指定一个固定的文件名而不是目录,那么当JVM需要对内存不足异常执行堆转储时,该文件必须不存在,否则堆转储将失败。

GC logging

默认情况下,Elasticsearch启用GC日志。这些都是在jvm中配置的。选项并默认为与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.option到一个可选路径。