Elasticsearch集群搭建手册及配置详情(基于elasticsearch-8.5.2版本)
0 安装前准备工作
0.1 安装包下载
组件 | 安装包 | 下载地址 |
---|---|---|
es | elasticsearch-8.5.2-linux-x86_64.tar.gz | elastic官网:https://www.elastic.co/cn/downloads/past-releases#elasticsearch elastic中文社区:https://elasticsearch.cn/download/ |
java | openjdk-17.0.1_linux-x64_bin.tar.gz | https://www.injdk.cn/ |
0.2 自定义部署标准
自定义部署标准 | 标准描述 |
---|---|
es | elasticsearch不允许使用root账号启动服务,如果你当前账号是root,则需要创建一个专有账户。本文档使用es作为专有用户。 |
/home/es/software | 用于解压安装elasticsearch和java的软件安装包和相关配置文件 |
/data00,/data01,/data02 | 1、raid0数据盘,用于存放节点、分片、索引、文档的所有数据。2、目前elastic社区计划删除MDP多数据路径方案,在8.x权威指南已经警告 在 7.13.0 中弃用(https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html#path-settings)。可能是因为遭受到用户的强烈反对,issues从最初的弃用调整到了最后的告警(https://github.com/elastic/elasticsearch/issues/71205)。如果你配置了MDP多路径方案,可能会像我一样在*_server.json日志中收到如下WAIN内容“Configuring [path.data] with a list is deprecated. Instead specify as a string value.”。不过我还是建议用户放弃多数据库路径,在文件系统层面使用raid方案。 |
/home/es/logs | 用于存放elasticsearch输出的日志,有条件的建议目录单独挂盘使用。 |
/home/es/software/elasticsearch | elasticsearch-8.5.2的软连接 |
/home/es/software/java | jdk-17.0.1的软连接 |
/home/es/.bashrc | 用于存放elasticsearch、java和logs相关的用户环境变量 |
0.3 节点角色划分
IP | node.name | cluster.initial_master_nodes |
---|---|---|
192.168.168.1 | node-1 | true |
192.168.168.2 | node-2 | true |
192.168.168.3 | node-3 | true |
192.168.168.4 | node-4 | false |
192.168.168.5 | node-5 | false |
0.4 elasticsearch目录介绍
elasticsearch目录 | 描述 |
---|---|
bin | 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等。 |
config | 配置文件目录,如elasticsearch配置、角色配置、jvm配置等。 |
jdk | elasticsearch7.x 以后特有,自带的 java 环境,8.x版本自带 jdk17或jdk19 |
lib | elasticsearch所依赖的java库。 |
modules | 包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。 |
plugins | 插件安装后会自动解压安装在此目录下 |
0.5 系统重要配置介绍
文件 | 配置 | 描述 |
---|---|---|
/etc/security/limits.d/90-nproc.conf(或/etc/security/limits.conf) | es - nproc 4096 | 确保 es 用户可以创建的线程数至少为 4096 |
同上 | es - nofile 65535 | Elasticsearch 使用大量文件描述符或文件句柄。 用完文件描述符可能是灾难性的,很可能会导致数据丢失。 确保将运行 es 的用户的打开文件描述符数量限制增加到 65536 或更高。 |
同上 | es soft memlock unlimited | allow user ‘elasticsearch’ mlockall |
同上 | es hard memlock unlimited | 同上 |
/etc/sysctl.conf | vm.max_map_count=262144 | 限制虚拟内存 |
同上 | vm.swappiness=0 | 1、Linux系统上可用的另一个选项是确保sysctl值vm.swappiness设置为1。这减少了内核的交换倾向,在正常情况下不会导致交换,同时仍允许整个系统在紧急情况下交换。2、以上是elsatic官网的建议,但是我们一般都是禁止使用swappiness,所以直接将vm.swappiness设置为0。 |
同上 | vm.overcommit_memory=1 | 内存分配控制 |
同上 | vm.zone_reclaim_mode=0 | 这个参数可以取值0/1/3/4。其中0表示在local内存不够用的情况下可以去其他的内存区域分配内存;1表示在local内存不够用的情况下本地先回收再分配;3表示本地回收尽可能先回收文件缓存对象;4表示本地回收优先使用swap回收匿名内存。由此可见,将其设为0可以降低swap发生的概率。 |
同上 | net.ipv4.tcp_retries2=5 | TCP重传超时。(此设置适用于所有TCP连接,也会影响与Elasticsearch集群以外的系统的通信可靠性。如果集群通过低质量网络与外部系统通信,则可能需要为net.ipv4.tcp_retrys2选择更高的值。) |
0.6 elasticsearch重要配置项介绍
文件 | 配置项 | 配置内容样例 | 描述 |
---|---|---|---|
elasticsearch.yml | cluster.name: | es-v8.5.2 | 集群名称。一个节点只有在与集群中的所有其他节点共享其 cluster.name 时才能加入集群。 默认名称是 elasticsearch,但您应该将其更改为描述集群用途的适当名称。 |
同上 | node.name: | node-1 | 节点名称。Elasticsearch使用node.name作为集群特定实例的可读标识符。该名称包含在许多API的响应中。当Elasticsearch启动时,节点名默认为机器的主机名,但可以在elasticsearch.yml中显式配置为指定的名称。节点名称之前应该有一定的规则,且唯一。 |
同上 | node.roles: | [ master, data ] | node.roles您可以通过在 中设置来定义节点的角色elasticsearch.yml。如果设置node.roles,则仅向节点分配您指定的角色。如果您不设置node.roles,节点将分配以下角色:master,data,data_content,data_hot,data_warm,data_cold,data_frozen,ingest,ml,remote_cluster_client,transform。本文档暂不做解释,后面会单独写一篇介绍node.roles,需要了解的可以阅读如下链接内容(https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#node-roles) |
同上 | path.data: | /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2 | 数据路径,包含节点、分片、索引、文档的所有数据。 |
同上 | path.logs: | /home/es/logs | 日志路径 |
同上 | bootstrap.memory_lock: | true | linux在使用内存锁时仍会交换堆外内存。要防止堆外内存交换,请禁用所有交换文件。 |
同上 | network.host: | 192.168.168.1 | (静态,字符串)为 HTTP 和传输流量设置此节点的地址。 该节点将绑定到该地址,并将其用作其发布地址。 接受 IP 地址、主机名或特殊值。默认为 local。例如127.0.0.1。需要搭建集群,此处需要修改为本机ip或hostname。 |
同上 | http.port: | 默认值为:9200-9300,使用默认值,不需要再配置。 | (静态,整数)为 HTTP 客户端通信绑定的端口。接受单个值或范围。如果指定了一个范围,节点将绑定到该范围内的第一个可用端口。 |
同上 | transport.port: | 默认值为:9300-9400,使用默认值,不需要再配置。 | 静态,整数)为节点之间的通信绑定的端口。接受单个值或范围。如果指定了一个范围,节点将绑定到该范围内的第一个可用端口。在每个符合主节点条件的节点上将此设置设置为单个端口,而不是一个范围。 |
同上 | discovery.seed_hosts: | [“192.168.168.1”,“192.168.168.2”,“192.168.168.3”] | 要将新节点添加到现有集群中,请配置 discovery.seed_hosts 或其他相关发现设置,以便新节点可以发现集群中现有的 master-eligible 节点。 要引导新的多节点集群,请按照集群引导部分中的描述配置 cluster.initial_master_nodes 以及 discovery.seed_hosts 或其他相关发现设置。 |
同上 | cluster.initial_master_nodes: | [“192.168.168.1”,“192.168.168.2”,“192.168.168.3”] | 当您启动符合主节点资格的节点时,您可以在命令行或 elasticsearch.yml 文件中提供此设置。 集群形成后,从每个节点的配置中删除此设置。 |
同上 | xpack.security.enabled: | false | elasticsearch-8.x默认是开启Security的,内网搭建集群的话,此处建议关闭Security。如果是在公网使用,则建议打开,使用可以阅读官网文档。 |
jvm.options | -Xms | -Xms4g | 建议设置为机器内存大小的1/4~1/2范围内,最大不超过32G。默认情况下,Elasticsearch 根据节点的 角色和总内存自动设置 JVM 堆大小。对于大多数生产环境,建议使用默认大小。 |
同上 | -Xmx | -Xmx4g | 同上 |
0.7 elasticsearch产品兼容性
与elasticsearch兼容性 | 参考地址 |
---|---|
操作系统 | https://www.elastic.co/cn/support/matrix#matrix_os |
JVM | https://www.elastic.co/cn/support/matrix#matrix_jvm |
浏览器 | https://www.elastic.co/cn/support/matrix#matrix_browsers |
插件等 | https://www.elastic.co/cn/support/matrix#matrix_browsers |
Logstash 插件 | https://www.elastic.co/cn/support/matrix#matrix_browsers |
1 修改系统重要配置
1.1 线程数,句柄数和锁定内存
修改es用户创建的最小线程数,可打开的最小文件描述符和文件句柄,锁定内存
文件:/etc/security/limits.d/90-nproc.conf(或/etc/security/limits.conf)
echo 'es - nproc 4096' >> /etc/security/limits.d/90-nproc.conf
echo 'es - nofile 65535' >> /etc/security/limits.d/90-nproc.conf
echo 'es soft memlock unlimited' >> /etc/security/limits.d/90-nproc.conf
echo 'es hard memlock unlimited' >> /etc/security/limits.d/90-nproc.conf
1.2 修改内核参数
文件:/etc/sysctl.conf
echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
echo 'vm.swappiness=0' >> /etc/sysctl.conf
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
echo 'vm.zone_reclaim_mode=0' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_retries2=5' >> /etc/sysctl.conf
#执行命令生效
sysctl -p
2 软件部署
2.1 创建es用户及用户组
root用户操作
groupadd es -g 750 && useradd -g es -u 750 es
2.2 配置用户环境变量
cd /home/es
echo 'export ES_HOME=/home/es/software/elasticsearch' >> .bashrc
echo 'export ES_TMPDIR=/home/es/logs/tmp' >> .bashrc
echo 'export JAVA_HOME=/home/es/software/java' >> .bashrc
echo 'export PATH=$JAVA_HOME/bin:$ES_HOME/bin:$PATH' >> .bashrc
2.3 创建相关目录
软件目录
su - es -c "mkdir /home/es/software"
日志目录
su - es -c "mkdir -p /home/es/logs;mkdir -p /home/es/logs/tmp"
数据目录
elastic官网提示在 7.13.0 中弃用多个数据路径,每个节点(或进程服务)只能配置一个数据路径。
mkdir /data00/es-v8.5.2;mkdir /data01/es-v8.5.2;mkdir /data02/es-v8.5.2
chown es:es /data*/es-v8.5.2
2.4 上传软件包
上传软件包到/home/es/software目录下
scp elasticsearch-8.5.2-linux-x86_64.tar.gz $ip:/home/es/software
scp openjdk-17.0.1_linux-x64_bin.tar.gz $ip:/home/es/software
解压软件包,为elasticsearch和jdk创建软连接,和环境变量路径保持一致
cd /home/es/software
tar -zxvf elasticsearch-8.5.2-linux-x86_64.tar.gz
rm -f elasticsearch-8.5.2-linux-x86_64.tar.gz
ln -s elasticsearch-8.5.2 elasticsearch
tar -zxvf openjdk-17.0.1_linux-x64_bin.tar.gz
rm -f openjdk-17.0.1_linux-x64_bin.tar.gz
ln -s jdk-17.0.1 java
chown -R es:es /home/es
3 修改elasticsearch重要配置项
切换到es用户下执行
su - es
cd /home/es/software/elasticsearch/config/
3.1 node-1节点elasticsearch.yml
cluster.name: es-v8.5.2
node.name: node-1
path.data: /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2
path.logs: /home/es/logs
bootstrap.memory_lock: true
network.host: 192.168.168.1
discovery.seed_hosts: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
cluster.initial_master_nodes: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
xpack.security.enabled: false
3.2 node-2节点修改elasticsearch.yml
cluster.name: es-v8.5.2
node.name: node-2
path.data: /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2
path.logs: /home/es/logs
bootstrap.memory_lock: true
network.host: 192.168.168.2
discovery.seed_hosts: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
cluster.initial_master_nodes: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
xpack.security.enabled: false
3.3 node-3节点修改elasticsearch.yml
cluster.name: es-v8.5.2
node.name: node-3
path.data: /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2
path.logs: /home/es/logs
bootstrap.memory_lock: true
network.host: 192.168.168.3
discovery.seed_hosts: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
cluster.initial_master_nodes: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
xpack.security.enabled: false
3.4 node-4节点修改elasticsearch.yml
cluster.name: es-v8.5.2
node.name: node-4
path.data: /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2
path.logs: /home/es/logs
bootstrap.memory_lock: true
network.host: 192.168.168.4
discovery.seed_hosts: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
xpack.security.enabled: false
3.5 node-5节点修改elasticsearch.yml
cluster.name: es-v8.5.2
node.name: node-5
path.data: /data00/es-v8.5.2,/data01/es-v8.5.2,/data02/es-v8.5.2
path.logs: /home/es/logs
bootstrap.memory_lock: true
network.host: 192.168.168.5
discovery.seed_hosts: ["192.168.168.1", "192.168.168.2" , "192.168.168.3"]
xpack.security.enabled: false
4 依次启动Elasticsearch服务
切换到es用户下执行
su - es
cd /home/es/software/elasticsearch/bin/
./elasticsearch -d
#es用户下jps -ml查看Elasticsearch服务是否存在
jps -ml
5 验证集群服务
#查看集群监控状态
$ curl -XGET 'http://192.168.168.1:9200/_cat/health?v'
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1669797905 08:45:05 es-v8.5.2 green 5 5 0 0 0 0 0 0 - 100.0%
#查看节点状态
$ curl -XGET 'http://192.168.168.1:9200/_cat/nodes?v&s=name'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.168.1 11 49 0 0.00 0.01 0.05 cdfhilmrstw - node-1
192.168.168.2 6 98 0 0.00 0.01 0.05 cdfhilmrstw - node-2
192.168.168.3 4 99 0 0.00 0.01 0.05 cdfhilmrstw * node-3
192.168.168.4 2 99 0 0.00 0.05 0.09 cdfhilmrstw - node-4
192.168.168.5 2 99 7 0.61 0.21 0.11 cdfhilmrstw - node-5
6 删除cluster.initial_master_nodes配置项
删除master节点中cluster.initial_master_nodes: [“192.168.168.1”, “192.168.168.2” , “192.168.168.3”]配置项。
附录
附1 Elasticsearch和JDK兼容性对应关系表
Elasticsearch 和 JVM 版本对应关系见如下链接 | Oracle/OpenJDK**/AdoptOpenJDK | Oracle/OpenJDK** | Oracle/OpenJDK** | Oracle/OpenJDK** | AdoptOpenJDK | Oracle/OpenJDK** | Oracle/OpenJDK**/AdoptOpenJDK | Oracle/OpenJDK**/AdoptOpenJDK | Oracle/OpenJDK**/AdoptOpenJDK | Oracle/OpenJDK**/AdoptOpenJDK/Temurin | Oracle/OpenJDK**/Temurin | Oracle/OpenJDK**/Temurin | Oracle/OpenJDK**/Temurin | Azul Zing | IBM |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
https://www.elastic.co/cn/support/matrix#matrix_jvm | 1.8.0 | 9 | 10 | 11 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 16.01.9.0+ | J9 (any version) |
Elasticsearch 5.0.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.1.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.2.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.3.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.4.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.5.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 5.6.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | ✔ | X |
Elasticsearch 6.0.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.1.x | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.2.x | ✔ | ✔ | X | X | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.3.x | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.4.x | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.5.x | ✔ | X | X | ✔ | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.6.x | ✔ | X | X | ✔ | X | X | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.7.x | ✔ | X | X | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X |
Elasticsearch 6.8.x | ✔ | X | X | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | X | X | X |
Elasticsearch 7.0.x | ✔ | X | X | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X |
Elasticsearch 7.1.x | ✔ | X | X | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X |
Elasticsearch 7.2.x | ✔ | X | X | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X |
Elasticsearch 7.3.x | ✔ | X | X | ✔ | X | ✔ | X | X | X | X | X | X | X | X | X |
Elasticsearch 7.4.x | ✔ | X | X | ✔ | ✔ | X | ✔ | X | X | X | X | X | X | X | X |
Elasticsearch 7.5.x | ✔ | X | X | ✔ | ✔ | X | ✔ | X | X | X | X | X | X | X | X |
Elasticsearch 7.6.x | ✔ | X | X | ✔ | ✔ | X | ✔ | X | X | X | X | X | X | X | X |
Elasticsearch 7.7.x | ✔ | X | X | ✔ | ✔ | X | X | ✔ | X | X | X | X | X | X | X |
Elasticsearch 7.8.x | ✔ | X | X | ✔ | ✔ | X | X | ✔ | X | X | X | X | X | X | X |
Elasticsearch 7.9.x | ✔ | X | X | ✔ | ✔ | X | X | ✔ | ✔ | X | X | X | X | X | X |
Elasticsearch 7.10.x | ✔ | X | X | ✔ | ✔ | X | X | ✔ | ✔ | X | X | X | X | X | X |
Elasticsearch 7.11.x | ✔ | X | X | ✔ | ✔ | X | X | X | ✔ | X | X | X | X | X | X |
Elasticsearch 7.12.x | ✔ | X | X | ✔ | ✔ | X | X | X | ✔ | ✔ | X | X | X | X | X |
Elasticsearch 7.13.x | ✔ | X | X | ✔ | ✔ | X | X | X | X | ✔ | X | X | X | X | X |
Elasticsearch 7.14.x | ✔ | X | X | ✔ | ✔ | X | X | X | X | ✔ | X | X | X | X | X |
Elasticsearch 7.15.x | ✔ | X | X | ✔ | ✔ | X | X | X | X | ✔ | ✔ | X | X | X | X |
Elasticsearch 7.16.x | ✔ | X | X | ✔ | ✔ | X | X | X | X | X | ✔ | X | X | X | X |
Elasticsearch 7.17.x | ✔ | X | X | ✔ | ✔ | X | X | X | X | X | ✔ | ✔ | ✔ | X | X |
Elasticsearch 8.0.x | X | X | X | X | X | X | X | X | X | X | ✔ | X | X | X | X |
Elasticsearch 8.1.x | X | X | X | X | X | X | X | X | X | X | ✔ | ✔ | X | X | X |
Elasticsearch 8.2.x | X | X | X | X | X | X | X | X | X | X | ✔ | ✔ | X | X | X |
Elasticsearch 8.3.x | X | X | X | X | X | X | X | X | X | X | ✔ | ✔ | X | X | X |
Elasticsearch 8.4.x | X | X | X | X | X | X | X | X | X | X | ✔ | ✔ | X | X | X |
Elasticsearch 8.5.x | X | X | X | X | X | X | X | X | X | X | ✔ | ✔ | ✔ | X | X |