目录
重要的 Elasticsearch 配置
虽然 Elasticsearch 需要很少的配置,但在投入生产之前需要考虑许多设置。
在投入生产之前,必须考虑以下设置:
path.data
和path.logs
如果使用.zip
或.tar.gz包
,则data
和logs
目录是$ES_HOME
. 如果这些重要文件夹保留在其默认位置,则在将 Elasticsearch 升级到新版本时它们被删除的风险很高。
在生产使用中,常规都会更改数据和日志文件夹的位置:
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
RPM 和 Debian 发行版已经为data
和logs
使用自定义路径。
这些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]
。这足以在服务器上运行单个开发节点。
TIPS
实际上,可以从$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
设置来提供集群中其他节点的列表,这些节点是符合主节点的并且可能处于活动状态且可通信的,以便为发现过程提供种子。此设置应该是集群中所有符合主节点条件的节点的地址列表。每个地址可以是 IP 地址或主机名,通过 DNS 解析为一个或多个 IP 地址。
如果符合主节点的节点没有固定的名称或地址,请使用 替代主机提供程序来动态查找它们的地址。
cluster.initial_master_nodes
当你第一次启动一个全新的 Elasticsearch 集群时,有一个集群引导步骤,它决定了在第一次选举中投票的主合格节点集。在开发模式下,没有配置发现设置,这一步由节点自己自动执行。由于这种自动引导本质上是不安全的,当在生产模式下启动一个全新的集群时,必须明确列出在第一次选举中应计算其选票的合格主节点。该列表是使用 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
- 端口是可选的,通常默认为
9300
,但此默认值可以被某些设置覆盖。 - 如果主机名解析为多个 IP 地址,则该节点将尝试在所有解析地址处发现其他节点。
- IPv6 地址必须用方括号括起来。
- 初始主节点应由它们的
node.name
标识 ,默认为它们的主机名。确保中cluster.initial_master_nodes
的值完全匹配node.name
。如果使用完全限定域名,例如master-node-a.example.com
作为节点名称,那么列表中也必须使用此完全限定名称;相反,如果node.name
是一个没有任何尾随限定符的裸主机名,那么cluster.initial_master_nodes
还必须省略限定符
设置堆大小
默认情况下,Elasticsearch 告诉 JVM 使用最小和最大大小为 1 GB 的堆。迁移到生产环境时,重要的是配置堆大小以确保 Elasticsearch 有足够的可用堆。
Elasticsearch 通过在jvm.options 中设置Xms
(最小堆大小)和Xmx
(最大堆大小)分配指定的整个堆 。应该将这两个设置设置为彼此相等。
这些设置的值取决于服务器上可用的 RAM 量:
- 设置
Xmx
和Xms
不超过物理内存的50%。Elasticsearch 需要内存用于 JVM 堆以外的用途,为此留出空间很重要。例如,Elasticsearch 使用堆外缓冲区来实现高效的网络通信,依靠操作系统的文件系统缓存来高效访问文件,并且 JVM 本身也需要一些内存。所以 Elasticsearch 进程使用的内存超过Xmx
设置配置的限制是正常的。 -
设置
Xmx,
Xms
不超过 JVM 用于压缩对象指针(压缩 oops)的阈值;确切的阈值有所不同,但接近 32 GB。可以通过在日志中查找如下一行来验证当前是否低于阈值:heap size [1.9gb], compressed ordinary object pointers [true]
-
合理地设置
Xmx,
Xms
不超过基于零的oops压缩阈值; 确切的阈值各不相同,但 26 GB 在大多数系统上是安全的,在某些系统上可能高达 30 GB。可以通过使用 JVM 选项启动 Elasticsearch-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode
并查找如下所示的行来验证是否低于此阈值 :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.options 文件设置堆大小的示例:
-Xms2g
-Xmx2g
也可以通过环境变量设置堆大小。在 jvm.options
文件中注释掉Xms,Xmx
设置,通过ES_JAVA_OPTS
设置这些值:
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
重要
为Windows 服务配置堆与上述不同。最初为 Windows 服务填充的值可以按上述方式配置,但在安装服务后会有所不同。有关其他详细信息,请参阅Windows 服务文档。
JVM 堆dump路径
默认情况下,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 的磁盘空间。
可以使用JEP 158: Unified JVM Logging 中描述的命令行选项重新配置 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,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 上长时间运行.tar.gz
发行版,应该考虑为 Elasticsearch 创建一个专用的不会被清理的临时目录。此目录应设置权限,以便只有运行 Elasticsearch 的用户才能访问它。在启动 Elasticsearch 之前通过$ES_TMPDIR
环境变量设置为指向该目录。
JVM 致命错误日志
默认情况下,Elasticsearch 将 JVM 配置为将致命错误日志写入默认日志目录(RPM和Debian包发行版为 /var/log/elasticsearch
,tar和zip存档发行版为 Elasticsearch 安装根目录下的logs
目录)。这些是 JVM 在遇到致命错误(例如,分段错误)时生成的日志。如果该路径不适合于接收的日志,则应修改中 jvm.options
中的-XX:ErrorFile=...
条目到备用路径。