Elasticsearch 一些重要的配置检查项

经常需要搭建 Elasticsearch 群集,以下整理一些在搭建 Elasticsearch 集群时需要注意的一些配置及检查项。

注:本文基于 Elasticsearch 版本 v7.6。

注:本文基于 Linux 操作系统。

Elasticsearch 分 3 个配置文件,均位于 configs/ 目录下:

  • elasticsearch.yml 用于配置 Elasticsearch
  • jvm.options 用于配置 JVM 配置选项,比如内存
  • log4j2.properties 用于配置日志

Elasticsearch 配置

数据目录和日志目录

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

注意,如果在容器中运行,记得把这两个目录从外部挂载进去。

集群名与节点名

cluster.name: elasticsearch

以上是默认的集群名,建议根据实际用途修改。

只有拥有相同集群名的节点才可能加入到一起成为一个集群。

node.name: es-master-10.70.52.43-1

以上配置节点名。

每台机器上可以运行任意多个节点,每个节点应具有不同的节点名。

为了方便定位,节点名应至少包含:节点角色(master、data、ingest、coordinator),节点 IP,节点上的实例 ID。

不建议使用自动生成的节点名,虽然唯一,但辨识度极低。

节点的角色

正式环境里面,master 节点一般会和 data 节点分开。

node.master = true
node.data = false

# 或

node.master = false
node.data = true

网络发现

注:旧版本(特指 v5)的集群配置方式有所不同,下面的配置可能不适用。

默认情况下,Elasticsearch 绑定到本地环回地址上(如:127.0.0.1)。这种配置一般仅用于开发环境。 对于开发环境这种配置,ES 会默认扫描端口范围为 9300~9305 的端口并尝试连接,并加入成为集群。无需额外配置。

对于线上正式环境(也即生产环境),节点一般分布于各个机器上,所以应该绑定在能被其它机器访问得到的网卡 IP 地址上。

# 配置节点绑定的 IP
network.host: 192.168.1.10

这个 IP 应该是被作用默认网关的那张网卡的 IP 地址,一般即路由表第一条路由的那张网卡。

注意:当此配置被改变后,Elasticsearch 会认为你已经从开发环境切换到正式环境,所以会进行很多额外的安全检查。不正确的配置可能会导致集群无法正确启动。

为了加入集群并发现集群内的其它节点,应当设置配置中的 discovery.seed_hosts 配置。 这有点类似于种子下载中的种子服务器(Tracker),当我们打开下载软件的时候,下载软件向种子服务器查询哪些节点有我们需要的资源。

# 配置种子节点
discovery.seed_hosts:
  - 192.168.1.10:9300
  - 192.168.1.11:9300

注意:这里应当填写所有 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 节点名列表:

cluster.initial_master_nodes:
  - master-node-a
  - master-node-b
  - master-node-c

注意:填写的是 master 节点的 节点名

远程集群访问

远程集群用于提供跨集群副本和跨集群搜索功能。如果确实不需要,可以考虑关闭(为了增加安全性),默认为打开。

cluster.remote.connect: false

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 即可:

$ sudo su
$ ulimit -n 65535
$ su elasticsearch

也可以修改系统设置一直生效:

# 文件:/etc/security/limits.conf
# 对 elasticsearch 用户设置
elasticsearch  -  nofile  65535

如果是使用的 systemd,在 service 文件中增加:

[Service]
LimitMEMLOCK=infinity

然后 reload:

$ sudo systemctl daemon-reload

可以在 Kibana 执行以下查询查看是否生效:

GET _nodes/stats/process?filter_path=**.max_file_descriptors

会看到类似下面的输出:

{
  "nodes": {
    "dyAfvEPQRPmfIAzEQwfEmw": {
      "process": {
        "max_file_descriptors": 1048576
      }
    },
    "vgXic_WqRWGYFRvTCdBiWg": {
      "process": {
        "max_file_descriptors": 1048576
      }
    },
    "t9gT5bRDTWKL0-cEYV9IZQ": {
      "process": {
        "max_file_descriptors": 1048576
      }
    }
  }
}

关闭 swap 内存

Swap 可以增加内存的大小,但是会严重影响被 swap 出去的应用的性能,在此强烈建议关闭:

$ sudo swapoff -a

以上命令会关闭所有的 swap 文件。

然后观察 free 有没有 swap。

开启内存锁定

bootstrap.memory_lock: true

可以在 Kibana 中用以下方式查看是否已全部开启:

GET _nodes?filter_path=**.mlockall

输出应该类似下面这样(全部为 true):

{
  "nodes": {
    "dyAfvEPQRPmfIAzEQwfEmw": {
      "process": {
        "mlockall": true
      }
    },
    "vgXic_WqRWGYFRvTCdBiWg": {
      "process": {
        "mlockall": true
      }
    },
    "t9gT5bRDTWKL0-cEYV9IZQ": {
      "process": {
        "mlockall": true
      }
    }
  }
}

虚拟内存

Elasticsearch 默认使用 mmapfs 映射索引文件,所以 mmap 的数量需要很大。

临时设置:

$ sysctl -w vm.max_map_count=262144

永久设置:

/etc/sysctl.conf 文件中修改 vm.max_map_count 的值。

观察设置:

$ sysctl vm.max_map_count

最大线程数

类似前面设置最大打开文件数的方式:

$ ulimit -u 4096

或在 /etc/security/limits.conf 设置 nproc 为 4096。

索引相关的一些设置

默认模板

默认应该有一个 order 值为 0 的模板(order 值越低,越先被应用,高 order 值覆盖低 order 值的模板设置)。

这个模板会设置所有 index 的默认配置,至少应包含:

  • 分片数量设置:number_of_shards
  • 副本数量设置:number_of_replicas

TODO 增加默认模板

关闭自动索引创建

正常情况下有哪些索引应该是已知的,所以不需要开启自动创建功能。

PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "false"
    }
}

下面是针对集群的整体配置,也可以设置部分索引的自动创建功能。参见官方文档。

群集设置

  • 单节点某索引最大的分片数量:max_shards_per_node
  • 单节点总分片数量:total_shards_per_node

TODO 增加示例配置

如果文章有帮助到你,请我喝杯冰可乐吧~

发表于:2020年5月5日 ,阅读量:301 ,标签:ElasticSearch