重要的 Elasticsearch 配置编辑

Elasticsearch 几乎不需要任何配置即可启动,但有一些项目在生产环境中使用集群之前必须考虑。

我们的 Elastic Cloud 服务会自动配置这些项目,使您的集群默认情况下即可投入生产。

路径设置编辑

Elasticsearch 将您索引的数据写入索引和数据流到 data 目录。Elasticsearch 将其自己的应用程序日志写入 logs 目录,其中包含有关集群运行状况和操作的信息。

对于 macOS .tar.gzLinux .tar.gzWindows .zip 安装,datalogs 默认情况下是 $ES_HOME 的子目录。但是,$ES_HOME 中的文件在升级期间有被删除的风险。

在生产环境中,我们强烈建议您在 elasticsearch.yml 中将 path.datapath.logs 设置为 $ES_HOME 之外的位置。 DockerDebianRPM 安装默认情况下将数据和日志写入 $ES_HOME 之外的位置。

支持的 path.datapath.logs 值因平台而异

Linux 和 macOS 安装支持 Unix 风格的路径

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

不要修改数据目录中的任何内容,也不要运行可能干扰其内容的进程。如果除 Elasticsearch 之外的其他进程修改了数据目录的内容,则 Elasticsearch 可能会失败,报告损坏或其他数据不一致,或者可能看起来工作正常,但已静默丢失了一些数据。不要尝试对数据目录进行文件系统备份;没有支持的方法可以恢复此类备份。相反,请使用 快照和恢复 安全地进行备份。不要在数据目录上运行病毒扫描程序。病毒扫描程序可能会阻止 Elasticsearch 正确工作,并可能修改数据目录的内容。数据目录不包含任何可执行文件,因此病毒扫描只会发现误报。

多个数据路径编辑

在 7.13.0 中已弃用。

如果需要,您可以在 path.data 中指定多个路径。Elasticsearch 将节点的数据存储在所有提供的路径中,但将每个分片的 数据保存在同一路径上。

Elasticsearch 不会在节点的数据路径之间平衡分片。单个路径中的磁盘使用率过高会触发节点的 高磁盘使用率水位线。如果触发,Elasticsearch 不会将分片添加到节点,即使节点的其他路径有可用磁盘空间也是如此。如果您需要额外的磁盘空间,我们建议您添加新节点而不是添加额外的 数据路径。

Linux 和 macOS 安装支持在 path.data 中使用多个 Unix 风格的路径

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

从多个数据路径迁移编辑

对多个数据路径的支持在 7.13 中已弃用,将在未来版本中删除。

作为多个数据路径的替代方案,您可以使用硬件虚拟化层(如 RAID)或软件虚拟化层(如 Linux 上的逻辑卷管理器 (LVM) 或 Windows 上的存储空间)创建跨越多个磁盘的文件系统。如果您希望在一台机器上使用多个数据路径,那么您必须为每个数据路径运行一个节点。

如果您当前在 高可用性集群 中使用多个数据路径,那么您可以使用类似于 滚动重启 的过程迁移到使用每个节点单个路径的设置,而不会出现停机:依次关闭每个节点,并用一个或多个配置为使用单个数据路径的节点替换它。更详细地说,对于当前具有多个数据路径的每个节点,您应该按照以下过程进行操作。原则上,您可以在滚动升级到 8.0 期间执行此迁移,但我们建议您在开始升级之前迁移到单个数据路径设置。

  1. 拍摄快照以防灾难保护您的数据。
  2. 可选地,通过使用 分配过滤器 将数据从目标节点迁移出去

    response = client.cluster.put_settings(
      body: {
        persistent: {
          'cluster.routing.allocation.exclude._name' => 'target-node-name'
        }
      }
    )
    puts response
    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.exclude._name": "target-node-name"
      }
    }

    您可以使用 cat 分配 API 跟踪此数据迁移的进度。如果某些分片未迁移,则 集群分配解释 API 将帮助您确定原因。

  3. 按照 滚动重启过程 中的步骤进行操作,直到并包括关闭目标节点。
  4. 确保您的集群运行状况为 yellowgreen,以便集群中至少有一个其他节点分配了每个分片的副本。
  5. 如果适用,请删除在前面步骤中应用的分配过滤器。

    response = client.cluster.put_settings(
      body: {
        persistent: {
          'cluster.routing.allocation.exclude._name' => nil
        }
      }
    )
    puts response
    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.exclude._name": null
      }
    }
  6. 通过删除其数据路径的内容来丢弃停止节点持有的数据。
  7. 重新配置您的存储。例如,使用 LVM 或存储空间将您的磁盘组合成单个文件系统。确保您重新配置的存储有足够的空间来容纳它将持有的数据。
  8. 通过调整其 elasticsearch.yml 文件中的 path.data 设置来重新配置您的节点。如果需要,请安装更多节点,每个节点都有自己的 path.data 设置,指向单独的数据路径。
  9. 启动新节点,并按照 滚动重启过程 的其余步骤进行操作。
  10. 确保您的集群运行状况为 green,以便每个分片都已分配。

您也可以选择将一些单个数据路径节点添加到您的集群中,使用 分配过滤器 将所有数据迁移到这些新节点,然后从集群中删除旧节点。这种方法会暂时使您的集群规模翻倍,因此只有在您有能力扩展集群的情况下才可以使用。

如果您当前使用多个数据路径,但您的集群不是高可用的,那么您可以通过拍摄快照、创建具有所需配置的新集群并将快照恢复到其中来迁移到非弃用配置。

集群名称设置编辑

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

cluster.name: logging-prod

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

更改集群名称需要 全集群重启

节点名称设置编辑

Elasticsearch 使用 node.name 作为 Elasticsearch 特定实例的人类可读标识符。此名称包含在许多 API 的响应中。节点名称在 Elasticsearch 启动时默认为机器的主机名,但可以在 elasticsearch.yml 中显式配置。

node.name: prod-data-2

网络主机设置编辑

默认情况下,Elasticsearch 仅绑定到环回地址,例如 127.0.0.1[::1]。这足以在单个服务器上运行一个或多个节点的集群,用于开发和测试,但 弹性生产集群 必须涉及其他服务器上的节点。有许多 网络设置,但通常您只需要配置 network.host

network.host: 192.168.1.10

当您为 network.host 提供值时,Elasticsearch 假设您正在从开发模式切换到生产模式,并将许多系统启动检查从警告升级为异常。请参阅 开发模式与生产模式 之间的区别。

发现和集群形成设置编辑

在进入生产环境之前,请配置两个重要的发现和集群形成设置,以便集群中的节点可以相互发现并选举主节点。

discovery.seed_hosts编辑

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

当您想在其他主机上的节点上形成集群时,请使用 静态 discovery.seed_hosts 设置。此设置提供集群中其他节点的列表,这些节点是主节点候选节点,并且很可能处于活动状态且可连接以播种 发现过程。此设置接受集群中所有主节点候选节点地址的 YAML 序列或数组。每个地址可以是 IP 地址或通过 DNS 解析为一个或多个 IP 地址的主机名。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
   - [0:0:0:0:0:ffff:c0a8:10c]:9301 

端口是可选的,默认为 9300,但可以 覆盖

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

IPv6 地址必须用方括号括起来。

如果您的主节点候选节点没有固定的名称或地址,请使用 备用主机提供程序 动态查找其地址。

cluster.initial_master_nodesedit

当您首次启动 Elasticsearch 集群时,集群引导 步骤将确定主节点候选节点集,这些节点的投票将在第一次选举中被计入。在 开发模式 下,如果没有配置发现设置,此步骤将由节点本身自动执行。

由于自动引导 本质上是不安全的,因此在生产模式下启动新集群时,您必须明确列出主节点候选节点,这些节点的投票应在第一次选举中被计入。您可以使用 cluster.initial_master_nodes 设置来设置此列表。

集群首次成功形成后,请从每个节点的配置中删除 cluster.initial_master_nodes 设置。在重新启动集群或将新节点添加到现有集群时,请勿使用此设置。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11
   - seeds.mydomain.com
   - [0:0:0:0:0:ffff:c0a8:10c]:9301
cluster.initial_master_nodes: 
   - master-node-a
   - master-node-b
   - master-node-c

通过其 node.name 来识别初始主节点,该节点默认为其主机名。确保 cluster.initial_master_nodes 中的值与 node.name 完全匹配。如果您使用完全限定域名 (FQDN)(例如 master-node-a.example.com)作为节点名称,那么您必须在此列表中使用 FQDN。相反,如果 node.name 是一个没有尾随限定符的裸主机名,那么您也必须在 cluster.initial_master_nodes 中省略尾随限定符。

请参阅 引导集群发现和集群形成设置

堆大小设置edit

默认情况下,Elasticsearch 会根据节点的 角色 和总内存自动设置 JVM 堆大小。我们建议在大多数生产环境中使用默认大小。

如果需要,您可以通过手动 设置 JVM 堆大小 来覆盖默认大小。

JVM 堆转储路径设置edit

默认情况下,Elasticsearch 会配置 JVM 在内存不足异常时将堆转储到默认数据目录。在 RPMDebian 包中,数据目录为 /var/lib/elasticsearch。在 Linux 和 MacOS 以及 Windows 发行版中,data 目录位于 Elasticsearch 安装的根目录下。

如果此路径不适合接收堆转储,请修改 jvm.options 中的 -XX:HeapDumpPath=... 条目。

  • 如果您指定目录,JVM 将根据运行实例的 PID 为堆转储生成文件名。
  • 如果您指定固定文件名而不是目录,则当 JVM 需要在内存不足异常时执行堆转储时,该文件必须不存在。否则,堆转储将失败。

GC 日志记录设置edit

默认情况下,Elasticsearch 会启用垃圾回收 (GC) 日志。这些日志在 jvm.options 中配置,并输出到与 Elasticsearch 日志相同的默认位置。默认配置每 64 MB 旋转一次日志,最多可以占用 2 GB 的磁盘空间。

您可以使用 JEP 158:统一 JVM 日志记录 中描述的命令行选项重新配置 JVM 日志记录。除非您直接更改默认的 jvm.options 文件,否则 Elasticsearch 默认配置将应用于您的设置之上。要禁用默认配置,首先通过提供 -Xlog:disable 选项来禁用日志记录,然后提供您自己的命令行选项。这将禁用所有 JVM 日志记录,因此请务必查看可用选项并启用您需要的所有内容。

要查看原始 JEP 中未包含的其他选项,请参阅 使用 JVM 统一日志记录框架启用日志记录

示例edit

通过创建包含一些示例选项的 $ES_HOME/config/jvm.options.d/gc.options,将默认 GC 日志输出位置更改为 /opt/my-app/gc.log

# Turn off all previous logging configuratons
-Xlog:disable

# Default settings from JEP 158, but with `utctime` instead of `uptime` to match the next line
-Xlog:all=warning:stderr:utctime,level,tags

# Enable GC logging to a custom location with a variety of options
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,level,pid,tags:filecount=32,filesize=64m

配置 Elasticsearch Docker 容器 以将 GC 调试日志发送到标准错误 (stderr)。这使容器编排器能够处理输出。如果使用 ES_JAVA_OPTS 环境变量,请指定

MY_OPTS="-Xlog:disable -Xlog:all=warning:stderr:utctime,level,tags -Xlog:gc=debug:stderr:utctime"
docker run -e ES_JAVA_OPTS="$MY_OPTS" # etc

临时目录设置edit

默认情况下,Elasticsearch 使用一个私有临时目录,该目录由启动脚本在系统临时目录的正下方创建。

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

如果您使用 .deb.rpm 包安装 Elasticsearch 并将其在 systemd 下运行,则 Elasticsearch 使用的私有临时目录将被排除在定期清理之外。

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

JVM 致命错误日志设置edit

默认情况下,Elasticsearch 会配置 JVM 将致命错误日志写入默认日志目录。在 RPMDebian 包中,此目录为 /var/log/elasticsearch。在 Linux 和 MacOS 以及 Windows 发行版中,logs 目录位于 Elasticsearch 安装的根目录下。

这些日志是由 JVM 在遇到致命错误(例如段错误)时生成的。如果此路径不适合接收日志,请修改 jvm.options 中的 -XX:ErrorFile=... 条目。

集群备份edit

在灾难中,快照 可以防止永久性数据丢失。 快照生命周期管理 是定期备份集群的最简单方法。有关更多信息,请参阅 创建快照

创建快照是备份集群的唯一可靠且受支持的方式。您不能通过复制节点的数据目录来备份 Elasticsearch 集群。没有支持的方法可以从文件系统级备份中恢复任何数据。如果您尝试从这样的备份中恢复集群,它可能会失败并报告损坏或丢失文件或其他数据不一致,或者它可能看起来已成功,但已静默丢失了一些数据。