0%

elasticsearch重要配置详解

Elasticsearch基础配置

elasticsearch的配置信息在elasticsearch.yml中,下面列出一些重要的配置:

集群名称

默认情况下es的集群名称是elasticsearch,在实际应用中应该设置一个有意义的集群名称:

1
cluster.name: elasticsearch-cluster-demo

节点信息

es节点是es集群中的某一个节点,可由基本的三个信息描述,节点名称(node.name),是否为主节点(node.master),是否为数据节点(node.data)。默认情况下,节点名称在每次启动的时候会随机生成,所以应该为节点设置一个有意义的名称,以方便排查问题。而节点又分为主节点、数据节点、客户端节点、部落节点,下面是一个节点(只为主节点)的配置样例:

1
2
3
node.name: node-master-one
node.master: true
node.data: false

数据存储路径/日志路径

默认情况下,es数据和日志的存储路径是在安装目录下,为了防止被误删掉,应该重新设置路径。配置样例如下:

1
2
3
4
5
6
7
# Path to directory where to store the data (separate multiple locations by comma):
# es data 存储路径(多个路径可用','隔开)
path.data: /home/environment/elasticsearch-cluster/elasticsearch-master-one/data
#
# Path to log files:
# log存储路径
path.logs: /home/environment/elasticsearch-cluster/elasticsearch-master-one/logs

网络绑定监听

在搭建es的时候,也应该去修改其监听的主机IP,至于端口可以用默认的:

1
2
3
4
5
# Set the bind address to a specific IP (IPv4 or IPv6):
# 网路监听
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

最小主节点数

如果是搭建es集群,那么应该设置最小主节点这个设置,以便防止脑裂现象:多个主节点同时存在与一个集群(一个集群只允许有一个主节点)。集群的主节点是集群的最高统治者,控制着索引的创建和分片的移动策略等;如果一个集群出现多个主节点,那么就好比一个团队出现两个leader一样,原本的一个整体被划分,对于es集群来讲就是原本的分片(数据)被分开,这样数据就可能出现不完整性。

集群的主节点是靠所有有资格竞选主节点的节点(即节点信息设置node.master为true)投票选举出来的,所以现在获得的投票数量应该大于总票数半。所以在es中,是设定当候选的master节点达到设定的法定个数的时候才进行主节点选举:法定个数 = master-eligible nodes / 2 + 1

1
2
3
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
# 最小主节点个数
discovery.zen.minimum_master_nodes: 2

因为es节点是可以动态删除和添加的,所以这个设置是可以通过API动态设置的。

集群恢复

es集群在启动的时候,会做数据平衡操作。比如,一个10个节点5/1分片策略(5个分片,5个副本分片)的集群,平衡下来是每个节点一个分片,如果集群在重启的时候,有5个节点因为网络原因一段时间内未启动成功,可能会出现一种情况:启动的5个节点中有3个主分片,2个副分片。这时候就会出现主分片数据不完整和不均匀分布,此时集群会自动做数据的平衡操作。若一段时间后,另外的5个节点重新上线了,发现本身的数据在集群中已存在,则又会做平衡操作。这样,两次数据平衡移动操作,会占用磁盘和带宽,若数据量大则影响可想而知。所以可以做如下控制,来保障集群重启时数据恢复花费时间尽可能短:

  1. 设置集群可提供服务的条件:最小上线节点数

    1
    gateway.recover_after_nodes: 8
  2. 设置集群数据恢复条件:等待多少分钟,或这有多少个节点上线(具体取决与条件的先达性)

    1
    2
    gateway.expected_nodes: 10
    gateway.recover_after_time: 5m

集群节点发现

使用单播方式,为节点提供其应该去尝试连接的节点列表,连接成功,得到集群的状态信息,便加入集群。节点列表中可以不是全部节点,只要能保障能进入集群即可(可以选用部分候选主节点)。

1
2
3
4
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
# 候选主节点ip:port
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"]

推迟分片分配

es集群在运行的时候,当有节点加入或离开的时候,会进行分片均衡操作,这个过程有些像集群重启时的数据恢复过程,可能会导致出现多次分片在均衡的过程,所以需要设置延迟分片分配,以尽量避免该情形出现。

1
2
# 延迟5min
delayed_timeout: 5m

该设置同样可以通过API的形式动态设置。

禁止内存交换

内存交换会影响性能,es官方推荐允许JVM锁住内存,禁止出现内存交换的情况:

1
bootstrap.mlockall: true

其他配置

Elasticsearch JVM内存

es默认的安装内存是1g,这个可以根据需要来设置,在es的config目录中的jvm.options中:

1
2
3
4
5
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1g
-Xmx1g

当然,这个内存不是随便设置的,推荐的是最大值和最小值一样,以避免堆内存改变时浪费系统资源。其次是即便硬件资源足购大,也不要分配超过32g(具体原因可以详见Elasticsearch权威指南),可以多给底层lucenen多分点。

文件描述符和MMap内存映射

es在节点在通信时会产生大量套接字,以及es底层的lucene使用了大量文件,所以需要足够的文件描述符,而linux中一般都是做有限制的,所以应该修改为大一点的值。

可以修改文件/etc/security/limits.conf

1
vim /etc/security/limits.conf

添加如下配置,配置值设为需要的值即可:

1
2
3
4
#<domain>   <type>  <item>  <value>
#四个元素的意义在该文件中均有详细描述
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536

es对文件混合使用了NioFs(非阻塞文件系统)和 MMapFs ( 内存映射文件系统),所以要保障有足够的虚拟内存用于映射。

可以直接修改/etc/sysctl.conf文件添加如下配置,配置值设为需要的值即可

1
vm.max_map_count=655360

然后执行如下命令

1
sysctl -p

这两项如果在启动elasticsearch之前不进行设置的话,在启动es的时候也可能会直接报相关的error以致无法启动成功。

GC配置和线程池

这两个配置,es官方强烈建议不要做修改,具体原因可参考 Elasticsearch权威指南: 不要触碰这些配置

参考资料

  1. Elasticsearch权威指南
  2. 《Elasticsearch技术解析与实战》