经常需要搭建 Elasticsearch 群集,以下整理一些在搭建 Elasticsearch 集群时需要注意的一些配置及检查项。
注:本文基于 Elasticsearch 版本 v7.6。
注:本文基于 Linux 操作系统。
Elasticsearch 分 3 个配置文件,均位于 configs/
目录下:
- elasticsearch.yml 用于配置 Elasticsearch
- jvm.options 用于配置 JVM 配置选项,比如内存
- log4j2.properties 用于配置日志
Elasticsearch 配置
数据目录和日志目录
1 2 3 |
|
注意,如果在容器中运行,记得把这两个目录从外部挂载进去。
集群名与节点名
1
|
|
以上是默认的集群名,建议根据实际用途修改。
只有拥有相同集群名的节点才可能加入到一起成为一个集群。
1
|
|
以上配置节点名。
每台机器上可以运行任意多个节点,每个节点应具有不同的节点名。
为了方便定位,节点名应至少包含:节点角色(master、data、ingest、coordinator),节点 IP,节点上的实例 ID。
不建议使用自动生成的节点名,虽然唯一,但辨识度极低。
节点的角色
正式环境里面,master 节点一般会和 data 节点分开。
1 2 3 4 5 6 7 |
|
网络发现
注:旧版本(特指 v5)的集群配置方式有所不同,下面的配置可能不适用。
默认情况下,Elasticsearch 绑定到本地环回地址上(如:127.0.0.1)。这种配置一般仅用于开发环境。 对于开发环境这种配置,ES 会默认扫描端口范围为 9300~9305 的端口并尝试连接,并加入成为集群。无需额外配置。
对于线上正式环境(也即生产环境),节点一般分布于各个机器上,所以应该绑定在能被其它机器访问得到的网卡 IP 地址上。
1 2 |
|
这个 IP 应该是被作用默认网关的那张网卡的 IP 地址,一般即路由表第一条路由的那张网卡。
注意:当此配置被改变后,Elasticsearch 会认为你已经从开发环境切换到正式环境,所以会进行很多额外的安全检查。不正确的配置可能会导致集群无法正确启动。
为了加入集群并发现集群内的其它节点,应当设置配置中的 discovery.seed_hosts
配置。
这有点类似于种子下载中的种子服务器(Tracker),当我们打开下载软件的时候,下载软件向种子服务器查询哪些节点有我们需要的资源。
1 2 3 4 |
|
注意:这里应当填写所有 master 节点的 transport 地址,不是 HTTP 那个(本文中 master 节点指可以被选举作为 master 的所有节点)。
注意:最好以 IP(或域名):端口
的形式填写,不要省略端口号。官方文档的说明会让人误解:
Each address can be either an IP address or a hostname which resolves to one or more IP addresses via DNS.
然后,还需要配置集群的初始 master 节点名列表:
1 2 3 4 |
|
注意:填写的是 master 节点的 节点名。
远程集群访问
远程集群用于提供跨集群副本和跨集群搜索功能。如果确实不需要,可以考虑关闭(为了增加安全性),默认为打开。
1
|
|
JVM 设置
堆内存设置
默认配置下,Elasticsearch 使用最小 1G、最大 1G 的堆内存。生产环境肯定不合适,需要按需调整。比如:
-Xms30g
-Xmx30g
注意:
-
这两个值应该设置成相同大小
Elasticsearch will assign the entire heap specified in
jvm.options
via the Xms (minimum heap size) and Xmx (maximum heap size) settings. You should set these two settings to be equal to each other. -
它们的值不应超过物理内存的一半
Elasticsearch requires memory for purposes other than the JVM heap and it is important to leave space for this. For instance, Elasticsearch uses off-heap buffers for efficient network communication, relies on the operating system’s filesystem cache for efficient access to files, and the JVM itself requires some memory too. It is normal to observe the Elasticsearch process using more memory than the limit configured with the Xmx setting.
-
它们的值不应超过 JVM 压缩对象指针(compressed object pointers) 的阈值 —— 这个值通常是 32GB
-
堆内存越大,垃圾回收的时间通常会越长
系统设置
理想情况下,Elasticsearch 应该独占机器运行,使用所有能使用的资源。
最大句柄数、最大打开文件数
如果是以命令的方式临时修改,用 ulimit 即可:
1 2 3 |
|
也可以修改系统设置一直生效:
1 2 3 |
|
如果是使用的 systemd,在 service 文件中增加:
1 2 |
|
然后 reload:
1
|
|
可以在 Kibana 执行以下查询查看是否生效:
1
|
|
会看到类似下面的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
关闭 swap 内存
Swap 可以增加内存的大小,但是会严重影响被 swap 出去的应用的性能,在此强烈建议关闭:
1
|
|
以上命令会关闭所有的 swap 文件。
然后观察 free
有没有 swap。
开启内存锁定
1
|
|
可以在 Kibana 中用以下方式查看是否已全部开启:
1
|
|
输出应该类似下面这样(全部为 true):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
虚拟内存
Elasticsearch 默认使用 mmapfs 映射索引文件,所以 mmap 的数量需要很大。
临时设置:
1
|
|
永久设置:
在 /etc/sysctl.conf
文件中修改 vm.max_map_count
的值。
观察设置:
1
|
|
最大线程数
类似前面设置最大打开文件数的方式:
1
|
|
或在 /etc/security/limits.conf
设置 nproc
为 4096。
索引相关的一些设置
默认模板
默认应该有一个 order 值为 0 的模板(order 值越低,越先被应用,高 order 值覆盖低 order 值的模板设置)。
这个模板会设置所有 index 的默认配置,至少应包含:
- 分片数量设置:
number_of_shards
- 副本数量设置:
number_of_replicas
TODO 增加默认模板
关闭自动索引创建
正常情况下有哪些索引应该是已知的,所以不需要开启自动创建功能。
1 2 3 4 5 6 |
|
下面是针对集群的整体配置,也可以设置部分索引的自动创建功能。参见官方文档。
群集设置
- 单节点某索引最大的分片数量:
max_shards_per_node
- 单节点总分片数量:
total_shards_per_node
TODO 增加示例配置