预先利其事,必先利其器,学 Elasticsearch 也同样遵循这个道理。上一篇文章,我们介绍了 Elasticsearch 的基本概念及特点,今天再介绍一下 Elasticsearch 的配置。本文将对 Elasticsearch 已有的一些配置分类地做详细描述。一起来学习复习吧!

一、Cluster

# ———————————- Cluster ———————————–

  • cluster.name:设置 Elasticsearch 集群名称,默认为 elasticsearch 。

二、Path

# ———————————– Paths ————————————

  • path.data:数据存储路径,可用逗号分隔多个位置。此目录需要先设置好,并设置好目录所有者。
  • path.logs:日志存储路径。日志文件的前缀为集群名。

三、Node

参考自:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-node.html

# ———————————— Node ————————————

  • node.name:设置 elasticsearch 节点名称。可以使用 ${HOSTNAME} 来获取当前机器主机名为 node 名称。
  • node.master:使其有资格被选作控制整个集群的主节点(主资格节点)。负责集群范围内的轻量级操作,例如创建或删除索引,更改集群状态,跟踪哪些节点是集群的一部分以及确定将哪些碎片分配给哪些节点。默认为 true 。
  • node.data:数据节点保存数据并执行与数据相关的操作,例如 CRUD,搜索和聚合。默认为 true 。
  • node.ingest:客户端节点。处理路由请求,处理搜索,分发索引操作。默认为 true 。注意:添加太多的客户端节点对集群是一种负担,因为主节点必须等待每一个节点集群状态的更新确认!客户节点的作用不应被夸大,数据节点也可以起到类似的作用。

以下为对节点角色的介绍:

  • master 节点:普通服务器即可 ( CPU 内存 消耗一般 )。
  • data 节点:主要消耗磁盘,内存,cpu 。
  • ingest 节点:普通服务器即可(如果要进行分组聚合操作的话,建议这个节点内存也分配多一点)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下: 
# 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为负载器。在集群中,需要单独设置几个这样的节点只负责存储、查询、聚合数据。
# node.master: false
# node.data: true
# node.ingest: false

# 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器
# node.master: true
# node.data: false
# node.ingest: false

# 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等
# node.master: false
# node.data: false
# node.ingest: true (可不指定,默认为开启)

# 4. 仅作为协调器
# node.master: false
# node.data: false
# node.ingest: false

# 5. 既有成为主节点的资格,又可以存储数据,还可以作为预处理节点(不建议这样,节点压力太大)
# node.master: true
# node.data: true
# node.ingest: true

建议集群中设置 3台 以上的节点作为 master 节点【node.master: true,node.data: false,node.ingest:false】,这些节点只负责成为主节点,维护整个集群的状态。

再根据数据量设置一批 data节点【node.master: false,node.data: true,node.ingest:false】,这些节点只负责存储数据,后期提供建立索引和查询索引的服务。如果用户请求比较频繁,这些节点的压力也会比较大。

所以在集群中建议再设置一批 ingest 节点也称之为 client 节点【node.master: false,node.data: false,node.ingest:true】,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。

4、Memory

# ———————————– Memory ———————————–

  • bootstrap.memory_lock:在启动时锁定内存,避免交换(swapped)带来的性能损失。当 jvm 开始 swapping 时,系统交换内存时,Elasticsearch 的性能较差。所以要保证它不 swap,这对节点健康极其重要。

5、Network

参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-network.html

# ———————————- Network ———————————–

  • network.host:绑定所在机器的ip或主机名。
  • http.port:http 请求的端口号,默认为 9200 。
  • transport.tcp.port:es 节点之间通信的端口,默认为 9300。

6、Index

1
2
3
4
5
# 设置索引的分片数,默认为 5 
index.number_of_shards: 5

# 设置索引的副本数,默认为 1: (该参数至少在5.6.16版本已废弃。如果非要设置默认值,可通过添加索引模板来实现,索引正则表达式为*)
index.number_of_replicas: 1

7、Discovery

# ——————————— Discovery ———————————-

  • discovery.zen.ping.unicast.hosts:提供其他 Elasticsearch 服务节点的单点广播发现功能。配置集群中基于主机 TCP 端口的其他 Elasticsearch 服务的逗号分隔列表。比如:[“node205.data:9300”,”node205.data:9301”,”node205.data:9302”]。如不指定端口号,则默认为 9300 。
  • discovery.zen.minimum_master_nodes:主资格节点参与选主的最小数量,该配置能有效地防止其发生脑裂现象。缺省配置是 1 。一个基本的原则是这里需要设置成 N / 2 + 1 , N 是 node.master=true 的节点个数,也就是 主资格节点 个数。例如在一个三节点的集群中, minimum_master_nodes 应该被设为 3 / 2 + 1 = 2 (四舍五入) 。
  • discovery.zen.ping.timeout:各 Elasticsearch 节点通信响应时间。

8、Gateway

参考自:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-gateway.html#modules-gateway

# ———————————- Gateway ———————————–

# 整个集群重新启动时,集群恢复的设置(避免前期执行大量不必要的重新均衡):

  • gateway.recover_after_nodes:只要集群中有该数量的节点(包括master主资格节点和data数据节点),Elasticsearch 就可以执行重新均衡操作。
  • gateway.expected_nodes:预期在集群中的节点(data或master)数。预期数量的节点加入集群后,将开始恢复本地分片。默认为 0 。
  • gateway.recover_after_time:如果未达到预期的节点数,则恢复过程将等待配置的时间,然后再尝试恢复。如果配置了expected_(xxx_)nodes,则默认为 5m 。

假如某配置文件有上述三配置,则上述设置的组合意味着 Elasticsearch 等待至 gateway.recover_after_nodes 所表示的节点数量存在后,在 gateway.recover_after_time 所表示的分钟数 或者 在 gateway.expected_nodes 所表示的节点数连接到集群(以先满足任一条件为准)后再开始恢复。

9、Various

# ———————————- Various ———————————–

  • action.destructive_requires_name: true 这个设置使删除只限于特定名称指向的数据, 而不允许通过指定 _all 或 通配符 来删除指定索引。

10、总结

Elasticsearch 已经为大多数参数设置合理的默认值,该文档对配置文件已有的一些配置做了详细描述。请注意,配置文件为 yml 格式的文件,书写请参考以下标准:

  • 属性顶格写,不能有空格。
  • 缩进一定不能使用 tab 制表符。
  • 属性和值之间的 “:” 后面需要有一个空格。