11. 重要的Elasticsearch配置

Elasticsearch 在开始时需要很少的配置,但在将集群用于生产环境之前,必须考虑一些事项:

  • 路径设置
  • 集群名称设置
  • 节点名称设置
  • 网络主机设置
  • 发现设置
  • 堆大小设置
  • JVM 堆转储路径设置
  • GC 日志设置
  • 临时目录设置
  • JVM 致命错误日志设置
  • 集群备份

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

路径设置

Elasticsearch 将您索引的数据写入索引和数据流到数据目录。Elasticsearch 还会将其自己的应用程序日志(其中包含有关集群健康和操作的信息)写入日志目录。

对于 macOS 的 .tar.gz、Linux 的 .tar.gz 和 Windows 的 .zip 安装,默认情况下,数据和日志是ES_HOME 中的文件有被删除的风险。

在生产环境中,强烈建议您在 elasticsearch.yml 中将 path.data 和 path.logs 设置为 <math xmlns="http://www.w3.org/1998/Math/MathML"> E S H O M E 之外的位置。 D o c k e r 、 D e b i a n 和 R P M 安装默认将数据和日志写入 ES_HOME 之外的位置。Docker、Debian 和 RPM 安装默认将数据和日志写入 </math>ESHOME之外的位置。Docker、Debian和RPM安装默认将数据和日志写入ES_HOME 之外的位置。

支持的 path.data 和 path.logs 值因平台而异:

Unix-like 系统 Windows Linux 和 macOS 安装支持 Unix 风格的路径:

yaml 复制代码
path:
  data: /var/data/elasticsearch
  logs: /var/log/elasticsearch

请不要修改数据目录中的任何内容,也不要运行可能干扰其内容的进程。如果除 Elasticsearch 之外的其他内容修改了数据目录的内容,那么 Elasticsearch 可能会失败,报告损坏或其他数据不一致,或者可能会正确运行,但悄无声息地丢失了部分数据。请不要尝试对数据目录进行文件系统备份;没有支持的方法来还原这样的备份。相反,请使用"快照和还原"来安全地进行备份。请不要在数据目录上运行病毒扫描器。病毒扫描器可能会阻止 Elasticsearch 正常工作,并可能修改数据目录的内容。数据目录不包含可执行文件,因此病毒扫描将只能找到错误的阳性结果。

多路径设置

在 7.13.0 版本中已弃用。

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

Elasticsearch 不会在节点的数据路径之间平衡分片。单个路径中的高磁盘使用量可能会触发整个节点的高磁盘使用量水位线。如果触发了该水位线,即使节点的其他路径有可用的磁盘空间,Elasticsearch 也不会向节点添加分片。如果需要额外的磁盘空间,建议您添加一个新节点,而不是添加额外的数据路径。

Unix-like 系统 Windows Linux 和 macOS 安装支持在 path.data 中使用多个 Unix 风格路径:

yaml 复制代码
path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3
从多个数据路径迁移

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

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

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

  1. 创建一个快照以保护您的数据免受灾难的影响。
  2. 可选地,通过使用分配过滤器将数据迁移到目标节点之外:
json 复制代码
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._name": "target-node-name"
  }
}

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

  1. 按照滚动重启过程中的步骤,包括关闭目标节点。
  2. 确保您的集群健康状态为黄色或绿色,以便每个分片都分配给集群中至少一个其他节点的副本。
  3. 如果适用,移除先前步骤中应用的分配过滤器。
json 复制代码
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._name": null
  }
}
  1. 删除已停止节点的数据路径内容,以丢弃其持有的数据。
  2. 重新配置您的存储。例如,使用 LVM 或 Storage Spaces 将磁盘组合成一个单一的文件系统。确保重新配置的存储具有足够的空间来存储它将持有的数据。
  3. 通过调整其 elasticsearch.yml 文件中的 path.data 设置,重新配置您的节点。如果需要,安装更多的节点,每个节点都有自己的 path.data 设置,指向一个单独的数据路径。
  4. 启动新节点,并为它们执行其余的滚动重启过程。
  5. 确保您的集群健康状态为绿色,以便每个分片都已分配。

您还可以通过向集群添加一些具有单一数据路径的节点,使用分配过滤器将所有数据迁移到这些新节点,然后从集群中移除旧节点,来实现迁移。这种方法将临时将集群的大小翻倍,因此只有在有能力扩展集群的情况下才能正常工作。

如果您目前使用多个数据路径,但您的集群不是高度可用的,那么可以通过创建一个快照,使用所需的配置创建一个新集群,并将快照还原到其中,以将其迁移到不再被弃用的配置。

集群名称设置

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

yaml 复制代码
cluster.name: logging-prod

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

更改集群名称需要进行完整的集群重启。

节点名称设置

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

yaml 复制代码
node.name: prod-data-2
网络主机设置

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

yaml 复制代码
network.host: 192.168.1.10

当您为 network.host 提供一个值时,Elasticsearch 假定您正在从开发模式切换到生产模式,并将一些系统启动检查从警告升级为异常。查看开发和生产模式之间的差异。

发现和集群形成设置

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

discovery.seed_hosts

默认情况下,没有任何网络配置,Elasticsearch 将绑定到可用的回环地址并扫描本地端口 9300 到 9305,以与运行在同一服务器上的其他节点连接。这种行为提供了一种自动集群的体验,无需进行任何配置。

当您想要与其他主机上的节点形成集群时,请使用静态 discovery.seed_hosts 设置。此设置提供了集群中所有主节点的地址列表,这些节点是主资格的,并且可能是活动的和可联系的,以启动发现过程。此设置接受一个 YAML 序列或数组,其中包含集群中所有主资格节点的地址。每个地址可以是 IP 地址,也可以是通过 DNS 解析为一个或多个 IP 地址的主机名。

yaml 复制代码
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_nodes

当您首次启动 Elasticsearch 集群时,集群引导步骤确定应在第一次选举中计算其投票的主资格节点集。在开发模式下,没有配置发现设置时,节点本身会自动执行此步骤。

由于自动引导是不安全的,因此在生产模式下启动新集群时,必须显式列出应在第一次选举中计算其投票的主资格节点。您可以使用 cluster.initial_master_nodes 设置来设置此列表。

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

yaml 复制代码
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

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

有关引导集群、发现和集群形成设置的详细信息,请参阅此处

堆大小设置

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

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

JVM堆转储路径设置

默认情况下,Elasticsearch配置JVM在发生内存不足异常时将堆转储到默认数据目录。在RPM和Debian软件包中,数据目录为/var/lib/elasticsearch。在Linux、MacOS和Windows分发版中,数据目录位于Elasticsearch安装的根目录下。

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

  • 如果指定目录,JVM将根据正在运行的实例的PID生成堆转储的文件名。
  • 如果指定固定的文件名而不是目录,则在JVM需要在内存不足异常时执行堆转储时,文件不能存在。否则,堆转储将失败。
GC日志设置

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

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

有关在JVM统一日志框架中启用日志的更多选项,请参见此处

示例

将默认的GC日志输出位置更改为/opt/my-app/gc.log,方法是创建$ES_HOME/config/jvm.options.d/gc.options并添加一些示例选项:

properties 复制代码
# 关闭所有先前的日志配置
-Xlog:disable

# JEP 158的默认设置,但使用`utctime`代替`uptime`以匹配下一行
-Xlog:all=warning:stderr:utctime,level,tags

# 启用GC日志记录到自定义位置,包含各种选项
-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环境变量,请指定:

bash 复制代码
MY_OPTS="-Xlog:disable -Xlog:all=warning:stderr:utctime,level,tags -Xlog:gc=debug:stderr:utctime"
docker run -e ES_JAVA_OPTS="$MY_OPTS" # 等等
临时目录设置

默认情况下,Elasticsearch使用一个私有临时目录,启动脚本会在系统临时目录的直接下面立即创建。

在一些Linux发行版中,系统实用程序会从/tmp中清除文件和目录,如果长时间不使用需要临时目录的功能,这种行为可能导致私有临时目录在Elasticsearch运行时被删除。如果在稍后使用需要此目录的功能,则删除私有临时目录会导致问题。如果使用.deb.rpm软件包安装Elasticsearch并在systemd下运行它,则Elasticsearch使用的私有临时目录会被排除在周期性清理之外。

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

JVM致命错误日志设置

默认情况下,Elasticsearch配置JVM将致命错误日志写入默认的日志目录。在RPM和Debian软件包中,此目录为/var/log/elasticsearch。在Linux、MacOS和Windows分发版中,日志目录位于Elasticsearch安装的根目录下。

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

集群备份

在灾难中,

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

拍摄快照是备份集群的唯一可靠和受支持的方式。您不能通过复制其节点的数据目录来备份Elasticsearch集群。没有受支持的方法可以从文件系统级别的备份中还原任何数据。如果尝试从这样的备份中还原集群,则可能失败,并报告损坏、丢失文件或其他数据不一致,或者可能似乎成功,实际上默默丢失了部分数据。

相关推荐
hummhumm15 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
java1234_小锋4 小时前
Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?
大数据·elasticsearch·jenkins
Elastic 中国社区官方博客4 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
我的运维人生4 小时前
Elasticsearch实战应用:构建高效搜索与分析平台
大数据·elasticsearch·jenkins·运维开发·技术共享
Mephisto.java8 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
mqiqe8 小时前
Elasticsearch 分词器
python·elasticsearch
小马爱打代码8 小时前
Elasticsearch简介与实操
大数据·elasticsearch·搜索引擎
java1234_小锋17 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
梦幻通灵1 天前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索