重要的 Elasticsearch 配置
编辑重要的 Elasticsearch 配置
编辑Elasticsearch 启动时需要极少的配置,但是在生产环境中使用集群之前,有许多项是必须考虑的。
我们的 Elastic Cloud 服务会自动配置这些项,使您的集群在默认情况下即可用于生产环境。
路径设置
编辑Elasticsearch 将您索引的数据写入到索引和数据流的 data
目录中。Elasticsearch 将其自己的应用程序日志(其中包含有关集群健康状况和操作的信息)写入到 logs
目录中。
对于 macOS .tar.gz
、 Linux .tar.gz
和 Windows .zip
安装,默认情况下 data
和 logs
是 $ES_HOME
的子目录。但是,$ES_HOME
中的文件在升级期间有被删除的风险。
在生产环境中,我们强烈建议您在 elasticsearch.yml
中将 path.data
和 path.logs
设置为 $ES_HOME
之外的位置。默认情况下,Docker、Debian 和 RPM 安装会将数据和日志写入到 $ES_HOME
之外的位置。
支持的 path.data
和 path.logs
值因平台而异
Linux 和 macOS 安装支持 Unix 风格的路径
path: data: /var/data/elasticsearch logs: /var/log/elasticsearch
Windows 安装支持带有转义反斜杠的 DOS 路径
path: data: "C:\\Elastic\\Elasticsearch\\data" logs: "C:\\Elastic\\Elasticsearch\\logs"
不要修改数据目录中的任何内容或运行可能干扰其内容的过程。如果 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
Windows 安装支持 path.data
中的多个 DOS 路径
path: data: - "C:\\Elastic\\Elasticsearch_1" - "E:\\Elastic\\Elasticsearch_1" - "F:\\Elastic\\Elasticsearch_3"
从多个数据路径迁移
编辑对多个数据路径的支持已在 7.13 中弃用,并将在未来的版本中删除。
作为多个数据路径的替代方案,您可以使用硬件虚拟化层(如 RAID)或软件虚拟化层(如 Linux 上的逻辑卷管理器 (LVM) 或 Windows 上的存储空间)创建一个跨多个磁盘的文件系统。如果希望在单个计算机上使用多个数据路径,则必须为每个数据路径运行一个节点。
如果您当前在高可用集群中使用多个数据路径,则可以使用类似于滚动重启的过程,在不中断服务的情况下迁移到为每个节点使用单个路径的设置:依次关闭每个节点,并将其替换为一个或多个配置为使用单个数据路径的节点。更详细地说,对于当前具有多个数据路径的每个节点,您应该遵循以下过程。原则上,您可以在滚动升级到 8.0 期间执行此迁移,但我们建议在开始升级之前迁移到单数据路径设置。
- 拍摄快照以保护您的数据,以防发生灾难。
-
可选地,使用分配过滤器将数据从目标节点迁移出去
resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.exclude._name": "target-node-name" }, ) print(resp)
response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.exclude._name' => 'target-node-name' } } ) puts response
const response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.exclude._name": "target-node-name", }, }); console.log(response);
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.exclude._name": "target-node-name" } }
您可以使用cat 分配 API来跟踪此数据迁移的进度。如果某些分片未迁移,则集群分配解释 API 将帮助您确定原因。
- 按照滚动重启过程中的步骤,直到并包括关闭目标节点。
- 确保您的集群健康状况为
yellow
或green
,以便每个分片的副本都已分配给集群中的至少一个其他节点。 -
如果适用,请删除在先前步骤中应用的分配过滤器。
resp = client.cluster.put_settings( persistent={ "cluster.routing.allocation.exclude._name": None }, ) print(resp)
response = client.cluster.put_settings( body: { persistent: { 'cluster.routing.allocation.exclude._name' => nil } } ) puts response
const response = await client.cluster.putSettings({ persistent: { "cluster.routing.allocation.exclude._name": null, }, }); console.log(response);
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.exclude._name": null } }
- 通过删除其数据路径的内容来丢弃停止的节点持有的数据。
- 重新配置您的存储。例如,使用 LVM 或存储空间将您的磁盘组合成一个文件系统。确保重新配置的存储空间有足够的空间来存储它将保存的数据。
- 通过调整其
elasticsearch.yml
文件中的path.data
设置来重新配置您的节点。如果需要,请安装更多节点,每个节点都有自己的path.data
设置,指向单独的数据路径。 - 启动新节点并为其执行其余的滚动重启过程。
- 确保您的集群健康状况为
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 将绑定到可用的环回地址并扫描本地端口 9300
到 9305
,以便与在同一服务器上运行的其他节点连接。此行为提供自动集群体验,而无需进行任何配置。
当您想与其他主机上的节点组成集群时,请使用静态 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
端口是可选的,默认为 |
|
如果主机名解析为多个 IP 地址,则节点将尝试在所有已解析的地址处发现其他节点。 |
|
IPv6 地址必须用方括号括起来。 |
如果您的符合主节点资格的节点没有固定的名称或地址,请使用替代主机提供程序来动态查找其地址。
cluster.initial_master_nodes
编辑当您首次启动 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
通过它们的 |
堆大小设置
编辑默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置 JVM 堆大小。我们建议大多数生产环境使用默认大小。
如果需要,您可以通过手动设置 JVM 堆大小来覆盖默认大小。
JVM 堆转储路径设置
编辑默认情况下,Elasticsearch 配置 JVM 在内存不足异常时将堆转储到默认数据目录。在RPM和Debian软件包上,数据目录是 /var/lib/elasticsearch
。在Linux 和 MacOS以及Windows发行版中,data
目录位于 Elasticsearch 安装的根目录下。
如果此路径不适合接收堆转储,请修改 jvm.options
中的 -XX:HeapDumpPath=...
条目。
- 如果您指定一个目录,JVM 将根据正在运行的实例的 PID 为堆转储生成文件名。
- 如果您指定一个固定文件名而不是目录,则当 JVM 需要在内存不足异常时执行堆转储时,该文件必须不存在。否则,堆转储将失败。
GC 日志设置
编辑默认情况下,Elasticsearch 启用垃圾收集 (GC) 日志。这些日志在 jvm.options
中配置,并输出到与 Elasticsearch 日志相同的默认位置。默认配置每 64 MB 轮换日志,最多可占用 2 GB 的磁盘空间。
您可以使用 JEP 158:统一 JVM 日志记录中描述的命令行选项重新配置 JVM 日志记录。除非您直接更改默认的 jvm.options
文件,否则 Elasticsearch 默认配置将添加到您自己的设置中。要禁用默认配置,请首先通过提供 -Xlog:disable
选项来禁用日志记录,然后提供您自己的命令行选项。这将禁用所有 JVM 日志记录,因此请务必查看可用选项并启用您需要的所有内容。
要查看原始 JEP 中未包含的更多选项,请参阅使用 JVM 统一日志记录框架启用日志记录。
示例
编辑通过创建包含一些示例选项的 $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
临时目录设置
编辑默认情况下,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发行版中,logs
目录位于 Elasticsearch 安装的根目录下。
这些是 JVM 在遇到致命错误(例如分段错误)时生成的日志。如果此路径不适合接收日志,请修改 jvm.options
中的 -XX:ErrorFile=...
条目。
集群备份
编辑在灾难中,快照可以防止永久数据丢失。快照生命周期管理是定期备份集群的最简单方法。有关更多信息,请参阅创建快照。
拍摄快照是备份集群的唯一可靠且受支持的方式。您不能通过复制其节点的数据目录来备份 Elasticsearch 集群。没有任何受支持的方法可以从文件系统级别的备份还原任何数据。如果您尝试从此类备份中还原集群,则可能会失败并报告损坏或缺少文件或其他数据不一致的情况,或者它可能看起来已成功,但默默丢失了一些数据。