Elasticsearch 集群部署
环境信息
IP | 角色 | 系统版本 | ES版本 | JDK |
---|---|---|---|---|
172.16.30.10 | Master | RockyLinux 9.6 | 7.17.29 | OpenJDK 11 |
172.16.30.11 | Node | RockyLinux 9.6 | 7.17.29 | OpenJDK 11 |
172.16.30.12 | Node | RockyLinux 9.6 | 7.17.29 | OpenJDK 11 |
软件下载
操作系统 | 包 | 下载地址 |
---|---|---|
RockyLinux/RHEL | RPM | 下载地址 |
Linux | TAR | 下载地址 |
Debian/Ubuntu | DEB | 下载地址 |
Other | Other | 下载地址 |
集群部署
hosts
# 在三个节点上分别改名
172.16.30.10 es-1
172.16.30.11 es-2
172.16.30.12 es-3
目录规划
目录 | 用途 |
---|---|
/data/elasticsearch | elasticsearch根目录 |
/data/kibana | kibana根目录 |
创建账户
因为安全问题, Elasticsearch 不允许 root 用户直接运行,所以要在每个节点中创建新用户,在 root 用户中创建新用户
# 三台都需要操作
useradd es
echo "es:es" | chgpasswd
chown -R es:es /data/elasticsearch
解压软件包
cd /data/elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.29-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.17.29-linux-x86_64.tar.gz
mv elasticsearch-7.17.29-linux-x86_64/* ./ && rm -rf elasticsearch-7.17.29-linux-x86_64
修改配置文件
# 三台都要操作
# es-1
#集群名称
cluster.name: myescluster
#节点名称,每个节点的名称不能重复
node.name: node-1
#ip 地址,每个节点的地址不能重复(也可写hostname)
network.host: 172.16.30.10
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["172.16.30.10:9300","172.16.30.11:9300","172.16.30.12:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
# es-2
#集群名称
cluster.name: myescluster
#节点名称,每个节点的名称不能重复
node.name: node-2
#ip 地址,每个节点的地址不能重复(也可写hostname)
network.host: 172.16.30.11
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["172.16.30.10:9300","172.16.30.11:9300","172.16.30.12:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
# es-3
#集群名称
cluster.name: myescluster
#节点名称,每个节点的名称不能重复
node.name: node-3
#ip 地址,每个节点的地址不能重复(也可写hostname)
network.host: 172.16.30.12
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["172.16.30.10:9300","172.16.30.11:9300","172.16.30.12:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
swap 调优
内存交换 到磁盘对服务器性能来说是 致命 的。如果内存交换到磁盘上,性能就会急剧下降, 一个 100 微秒的操作可能变成 10 毫秒,下降100倍以上。想想那么多 10 微秒的操作时延累加起来。不难看出 swapping 对于性能是多么可怕。
所以,Elasticsearch建议禁用Swap分区,因为当物理内存不足时,操作系统会将一些内存页交换到磁盘上,这会导致性能急剧下降。
# 临时关闭
sudo swapoff -a
# 永久关闭
vim /etc/sysctl.conf
# 在文件末尾添加以下行
vm.swappiness=1
sudo sysctl -p
锁定内存
memlock 是一个与内存锁定相关的系统资源限制。它用于指定一个进程能够锁定的物理内存(RAM)的大小。内存锁定意味着将进程使用的内存固定在物理内存中,防止操作系统将其交换(swap)到磁盘上的虚拟内存(磁盘交换空间)。
对于像 Elasticsearch 这样的应用程序,将内存锁定是很重要的。
因为 Elasticsearch 大量使用内存来缓存索引数据,如果这些数据被交换到磁盘,会导致查询性能大幅下降。内存锁定可以确保关键的内存区域(如索引缓存)始终在物理内存中,提高数据访问速度。
可以通过设置Elasticsearch的bootstrap.memory_lock
选项来尝试锁定JVM内存,防止其被交换到磁盘上, 在 配置文件elasticsearch.yml中添加以下行
vim /data/elasticsearch/config/elasticsearch.yml
....
bootstrap.memory_lock: true
...
vim /etc/security/limits.conf
# 限制设置8G,单位是字节
* soft memlock 8388608
* hard memlock 8388608
JVM调优
内存分配
Jvm
内存分为新生代和老年代,一般来说,老年代和新生代的内存比例为2:1是比较合适的。比如给堆内存分配3G,则新生代分配1G,其余都给老年代。
- 如果 把所有的内存都分配给
Elasticsearch
的堆内存,那将不会有剩余的内存交给Lucene
。这将严重地影响全文检索的性能。 - 标准的建议是把 50% 的可用内存作为
Elasticsearch
的堆内存,保留剩下的 50%,Lucene
会很乐意利用起余下的内存,也就是把 50% 的可用内存作为 Lucene 的非堆内存(off - heap)。 Lucene
被设计为可以利用操作系统底层机制来缓存内存数据结构,所以这部分Lucene
的非堆内存(off - heap),预留就OK了,不需要专门设置。
所以,在使用Elasticesearch
的时候,按照实际的系统内存大小,一般进行Elasticesearch
堆大小进行对应的配置,从最小规格的8G(如果 os内存 16g) 到了中等规模16G内存(如果 os内存 32g),然后最大规格32G内存(如果 os内存>64g)。
分配的建议如下:
- 如果 os内存 16g ,jvm 8G
- 如果 os内存 32g ,jvm 16g
- 如果 os内存>64g ,jvm 32g
合理设置堆内存大小, 一般建议将堆内存设置为物理内存的 50 - 70%。通过-Xms(初始堆大小)和-Xmx(最大堆大小)参数来设置初始堆大小、最大堆大小 相同。例如:
# 在ElasticSearce的配置文件jvm.options文件配置:
-Xms30g //配置堆初始化大小
-Xmx30g //配置堆的最大内存
-Xmn15g //配置新生代内存。
垃圾回收
vim jvm.options
...
# jdk11开始支持zgc来及回收,所以我这里使用zgc作为java的垃圾回收机制。
14-:-XX:+UseZGC
14-:-:XX:+UnlockExperimentalVMOptions
# jdk17支持动态配置gc线程 ,降低cpu使用,小于jdk17 请勿开启
# 14-:-:XX:+UseDynamicNumberOfGCThreads
...
修改系统配置
- 修改/etc/security/limits.conf
vim /etc/security/limits.conf
# 每个进程可以打开的文件数的限制
es soft nofile 65536
es hard nofile 65536
2.修改/etc/sysctl.conf
vim /etc/sysctl.conf
# 一个进程可以拥有的 VMA(虚拟内存区域)的数量,默认值为 65536
vm.max_map_count=655360
sysctl -p
启动集群
bin/elasticsearch -d
测试集群
curl -XGET 172.16.30.10:9200/_cat/nodes