9 ES集群调优建议
9.1 内核参数优化
# 对于操作系统,需要调整几个内核参数
[root@node ~]# vim /etc/sysctl.conf
fs.file-max=655360 # 设定系统最大打开文件描述符数,建议修改为655360或者更高,
vm.max_map_count = 262144 # 用于限制一个进程可以拥有的虚拟内存大小,建议修改成262144或更高。
net.core.somaxconn = 32768 # 全连接池大小
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1000 65535
net.ipv4.tcp_max_tw_buckets = 400000
[root@node1 ~]# sysctl -p
# 调整最大用户进程数(nproc),调整进程最大打开文件描述符(nofile)
[root@node ~]# rm -f /etc/security/limits.d/20-nproc.conf # 删除默认nproc设定文件
[root@node ~]# vim /etc/security/limits.conf
* soft nproc 20480
* hard nproc 20480
* soft nofile 65536
* hard nofile 65536
9.2 es配置参数优化
# 1.锁定物理内存地址,避免es使用swap交换分区,频繁的交换,会导致IOPS变高。
[root@es-node ~]# vim /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true
#2.配置elasticsearch启动参数
[root@es-node ~]# sed -i '/\[Service\]/a LimitMEMLOCK=infinity' /usr/lib/systemd/system/elasticsearch.service
[root@es-node ~]# systemctl daemon-reload
[root@es-node ~]# systemctl restart elasticsearch
9.3 JVM优化
JVM内存具体要根据 node 要存储的数据量来估算,为了保证性能,在内存和数据量间有一个建议的比例:
像一般日志类文件,1G 内存能存储48G~96GB数据;
jvm堆内存最大不要超过31GB;
其次就是主分片的数量,单个控制在30-50GB;
假设总数据量为1TB,3个node节点,1个副本;那么实际要存储的大小为2TB,因为有一个副本的存在;
2TB / 3 = 700GB,然后每个节点需要预留20%的空间,意味着每个node要存储大约 850GB 的数据;
按照内存与存储数据的比率计算:
850GB/48=17GB,小于31GB,因为 31*48=1.4TB 及每个Node可以存储1.4TB数据,所以3个节点足够;
850GB/30=30个主分片,因为要尽量控制主分片的大小为30GB;
假设总数据量为2TB,3个node节点,1个副本;那么实际要存储的大小为4TB,因为有一个副本的存在;
4TB/3 = 1.4TB,然后每个节点需要预留20%的空间出来,意味着每个node要存储大约 1.7TB 的数据;
按照内存与存储数据的比率计算:
1.7TB/48=32GB 大于31G,因为 31*48=1.4TB及每个Node最多存储1.4TB数据,所以至少需要4个节点;
1.5TB/30G=50个主分片,因为要尽量控制主分配存储的大小为30GB;
[root@es-node ~-]# vim /etc/elasticsearch/jvm.options
-Xms 31g #最小堆内存
-Xmx 31g #最大堆内存
#根据服务器内存大小,修改为合适的值。一般设置为服务器物理内存的一半最佳,但最大不能超过32G
#每天1TB左右的数据量的服务器配置
16C 64G 6T 3台ECS