最近需要对项目依赖的ElasticSearch进行升级工作,升级之前已经对ES6、ES7等版本做过了测试,所以本次升级也是本着用新不用旧的原则,直接用上了当前最新稳定版ElasticSearch7.8.0。下面就记录下搭建ElasticSearch7.8.0集群的过程。

集群规模

IP Host master.node data.node node-name cluster-name
10.10.100.50 es01 true true node-1 es-cluster
10.10.100.51 es02 true true node-2 es-cluster
10.10.100.52 es03 true true node-3 es-cluster
10.10.100.53 es04 false true node-4 es-cluster
10.10.100.54 es05 false true node-5 es-cluster

安装ES

环境说明

  • CentOS 6.5
  • OpenJDK14(使用的是ES自带的OpenJDK14)

下载ElasticSearch的RPM包

本次通过rpm包的方式进行安装,所以提前准备好:elasticsearch-7.8.0-x86_64.rpm

1
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm

安装ElasticSearch

1
rpm -ivh elasticsearch-7.8.0-x86_64.rpm

安装后的目录信息

Type Description Default Location Setting
es home ES的安装路径 /usr/share/elasticsearch
bin ES命令所在的路径 /usr/share/elasticsearch/bin
conf ES配置文件 /etc/elasticsearch ES_PATH_CONF
conf ES环境变量 /etc/sysconfig/elasticsearch
jdk ES内置JDK路径 /usr/share/elasticsearch/jdk
plugins ES插件所在路径 /usr/share/elasticsearch/plugins

配置ES

修改elasticsearch.yml

1
vim /etc/elasticsearch/elasticsearch.yml

cluster.name

集群名称

1
cluster.name: es-cluster

node.name

节点名称

1
node.name: node-1

path.data

数据所在路径,可以设置多个,按照如下两种方式设置

1
path.data: /mnt/disk1/es7/data,/mnt/disk2/es7/data,/mnt/disk3/es7/data,/mnt/disk4/es7/data,/mnt/disk5/es7/data,/mnt/disk6/es7/data,/mnt/disk7/es7/data,/mnt/disk8/es7/data

或者:

1
2
3
4
5
6
7
8
9
10
path:
data:
- /mnt/disk1/es7/data
- /mnt/disk2/es7/data
- /mnt/disk3/es7/data
- /mnt/disk4/es7/data
- /mnt/disk5/es7/data
- /mnt/disk6/es7/data
- /mnt/disk7/es7/data
- /mnt/disk8/es7/data

path.logs

ES运行日志所在路径,只需要设置几个即可。

1
path.logs: /mnt/disk1/es7/logs     # 我用的这一种

或者

1
2
3
4
5
6
7
8
9
10
11
path:
logs: /mnt/disk1/es7/logs
data:
- /mnt/disk1/es7/data
- /mnt/disk2/es7/data
- /mnt/disk3/es7/data
- /mnt/disk4/es7/data
- /mnt/disk5/es7/data
- /mnt/disk6/es7/data
- /mnt/disk7/es7/data
- /mnt/disk8/es7/data

bootstrap.memory_lock

是否锁定内存,默认是false,但是在生产环境建议设置为true。由于当jvm开始swapping时es的效率会降低,所以要保证它不swap,这对节点健康极其重要。解决方法就是设置 bootstrap.memory_lock: true,并且需要让操作系统也支持,还需要修改/etc/security/limits.conf配置文件。

1
bootstrap.memory_lock: true

修改/etc/security/limits.conf

1
2
3
4
5
vim /etc/security/limits.conf

# 新增如下内容
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

/etc/systemd/system/elasticsearch.service.d目录下创建override.conf。并填入如下内容:

1
2
[Service]
LimitMEMLOCK=infinity

可参考Configuring system settings | Elasticsearch Reference 7.9 | Elastic

network.host

ES 绑定的IP地址,通常图省事都是0.0.0.0(多网卡会绑定其网卡所有的IP),也可以指定该服务器上网卡的IP

1
network.host: 0.0.0.0

http.port

ES的HTTP端口,默认是9200,如果被占用了可以在这里进行修改

1
http.port: 9200

transport.tcp.port

ES集群间通信的端口,默认9300,且该配置项不存在,如需修改需要手动添加,通常为了方便还是将其加上吧,难免会遇到一台机器多个不同版本ES的存在。

1
transport.tcp.port: 9300

discovery.seed_hosts

如果要与其他主机上的节点组成集群,则必须设置 discovery.seed_hosts,提供集群中其他主机的列表,这些节点都具备主机资格,并且可能在其中处于活动状态并可以联系,以便为发现过程。此设置通常应包含群集中所有符合主机条件的节点的地址,是主机地址数组或逗号分隔的字符串。每个值都采用 host:port 或者 host 形式。注意,IPV6 主机放在方括号里。默认值是: 127.0.0.1, [::1].

1
discovery.seed_hosts: ["es01:9300", "es02:9300", "es03:9300", "es04", "es05"]

或者

1
2
3
4
discovery.seed_hosts:
- es01:9300
- 10.10.100.51:9300
- es03

cluster.initial_master_nodes

首次启动ES时参与集群选主的节点,对于生产环境的集群来说,必须配置上。不配置也不会造成错误,但是自动引导是不安全的。这里配置的一定是node.name的值,大多数人推荐单数节点,不知道是不是受Zookeeper影响,实际上双数也没遇到过脑裂的情况。

1
cluster.initial_master_nodes: ["node-1","node-2","node-3"]

或者

1
2
3
4
cluster.initial_master_nodes: 
- node-1
- node-2
- node-3

discovery.zen.minimum_master_nodes

最小主节点数,这对你的集群的稳定极其重要,当你的集群中有两个 masters(注:主节点)的时候,这个配置有助于防止 脑裂 ,一种两个主节点同时存在于一个集群的现象。官方对这个值的设定公式为:( master 候选节点个数 / 2) + 1,比如本次有三个master,那么我们需要将其设置为2,除不尽的向下取整。

1
discovery.zen.minimum_master_nodes: 2

node.max_local_storage_nodes

一台服务器最多能启动的ES节点数,如果是rpm安装的那只能启动一台,如果是压缩包方式安装的,这里可以根据实际情况设置。通常如果专用服务器的内存很大(128G),但是ES官方推荐最大堆不超过32G,所以这台机器上可以部署2-3个节点。

1
node.max_local_storage_nodes: 2 # 即使设置了2,你启动一个也没问题

action.auto_create_index

自动创建索引,默认也是true

1
action.auto_create_index: true

xpack.monitoring.collection.enabled

开启x-pack监控

1
xpack.monitoring.collection.enabled: true

bootstrap.system_call_filter

是否支持过滤掉系统调用,在bootstrap的时候check是否支持seccomp

1
bootstrap.system_call_filter: false

xpack.security.enabled

是否开启x-pack的安全认证,有需要的人开启即可

1
xpack.security.enabled: false

node.master

是否允许该节点可以选举为master,该配置默认为true,而且这个配置项也不存在,如果需严格区分master节点、data节点、负载均衡节点的话需要加上。按照node.master和node.data的组合来区分节点角色。

1
node.master: true

node.data

该节点是否是数据节点

1
node.data: true

如果node.masternode.data都是false,那么该节点就是负载均衡节点。

最终配置文件elasticsearch.yml:

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
26
27
28
29
30
31
32
33
34
35
# 集群名称
cluster.name: es-cluster
# 节点名称
node.name: node-1
# 数据路径
path.data: /mnt/disk1/es7/data,/mnt/disk2/es7/data,/mnt/disk3/es7/data,/mnt/disk4/es7/data,/mnt/disk5/es7/data,/mnt/disk6/es7/data,/mnt/disk7/es7/data,/mnt/disk8/es7/data
#
# Path to log files:
# 日志路径
path.logs: /mnt/disk1/es7/logs

bootstrap.memory_lock: true

network.host: 0.0.0.0
# http 端口
http.port: 9200
# transport端口
transport.tcp.port: 9300
# 集群中所有主机
discovery.seed_hosts: ["es01:9300", "es02:9300", "es03:9300", "es04", "es05"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
# 第一次参与选举的主机列表
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
discovery.zen.minimum_master_nodes: 2
node.max_local_storage_nodes: 2
action.auto_create_index: true
xpack.monitoring.collection.enabled: true
bootstrap.system_call_filter: false
xpack.security.enabled: false
# 允许为主节点 node-1\node-2\node-3是true
node.master: true
# 允许为数据节点
node.data: true

修改jvm.options

如果需要配置JVM相关的参数,需要修改这里:

1
2
-Xms10g
-Xmx10g

该节点最大堆和最小堆都是10g,这里推荐两个值设置为相同的值。

修改ES的JAVA_HOME

1
vi /etc/sysconfig/elasticsearch

将其注释打开,将值设置为ES自带的JDK版本。不要使用JDK1.8及以下的版本。

1
JAVA_HOME=/usr/share/elasticsearch/jdk

修改系统参数

光修改ES的配置还是不够的,还需要系统参数的支持。

最大进程数

1
2
3
4
5
6
vi /etc/security/limits.d/90-nproc.conf
# 或者
vi /etc/security/limits.d/20-nproc.conf

# 修改为
* soft nproc 65535

进程可以拥有的VMA(虚拟内存区域)的数量

1
2
3
4
5
6
vi /etc/sysctl.conf

# 修改或新增
vm.max_map_count=655360
# 使其生效
sysctl -p

最大打开文件数

1
2
3
4
5
6
7
8
9
10
vi /etc/security/limits.conf

* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 131072

# 锁定内存
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

最大文件打开数一定是超过65535的。

启动ES集群

将配置文件分发到其他机器上,并且只需要修改如下内容即可:

  • node.name

  • path.data

  • node.master

  • node.data

修改完成后,启动ES

1
service elasticsearch start

打开其中一个节点http://10.10.100.50:9200/_cat/nodes 即可看到类似如下内容:

1
2
3
4
5
10.10.100.52 41 74 -1 1.14 1.95 2.57 dilmrt - node-3
10.10.100.53 46 94 -1 7.27 4.09 5.40 dilrt - node-4
10.10.100.54 70 92 -1 0.50 5.74 8.10 dilrt - node-5
10.10.100.50 65 92 -1 4.36 7.20 9.63 dilmrt * node-1
10.10.100.51 41 74 -1 1.14 1.95 2.57 dilmrt - node-2