Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。
Elasticsearch 基于 Java 语言实现。
https://www.elastic.co/guide/en/elastic-stack/index.html
https://www.elastic.co/guide/en/elasticsearch/reference/master/install-elasticsearch.html
部署方式
- 包安装
- 二进制安装
- Docker 部署
- Ansible 批量部署
ES支持操作系统版本和 Java 版本官方说明
https://www.elastic.co/cn/support/matrix
1、安装前准备
安装前环境初始化
CPU 2C 内存4G或更多
操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X
操作系统盘50G
主机名设置规则为es-nodeX.test.com
生产环境建议准备单独的数据磁盘
关闭防火墙和SELinux
# RHEL系列的系统执行下以下配置
# systemctl disable firewalld
# systemctl disable NetworkManager
# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
# reboot
各服务器配置本地域名解析
# vim /etc/hosts
192.168.1.101 es-node1.test.com
192.168.1.102 es-node2.test.com
192.168.1.103 es-node3.test.com
修改内核参数
内核参数 vm.max_map_count 用于限制一个进程可以拥有的VMA(虚拟内存区域)的数量
使用默认系统配置,二进制安装时会提示下面错误,包安装会自动修改此配置
![图片[1]-Elasticsearch 部署-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/12/image-298.png)
# 查看默认值
# sysctl -a |grep vm.max_map_count
vm.max_map_count = 65530
# 修改配置
# echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
# echo "fs.file-max = 1000000" >> /etc/sysctl.conf
# sysctl -p
vm.max_map_count = 262144
# Ubuntu 基于包安装后会自动修改文件
# cat /usr/lib/sysctl.d/elasticsearch.conf
vm.max_map_count=262144
修改资源限制配置
# vi /etc/security/limits.conf
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
安装JAVA环境(可以直接使用带JAVA的es安装包,省去单独安装JAVA的步骤)
2、Elasticsearch 安装
安装包有两种: 包含jdk和no-jdk的包
注意:官方提示no-jdk的包将被淘汰,建议使用包含JDK的包
#包含JDK的版本下载
https://www.elastic.co/downloads/elasticsearch
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/
#不包含JDK的版本下载
https://www.elastic.co/cn/downloads/elasticsearch-no-jdk
# 下载包
root@es-node1:~# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/apt/pool/main/e/elasticsearch/elasticsearch-7.17.8-amd64.deb
# 安装包
root@es-node1:~# dpkg -i elasticsearch-7.17.8-amd64.deb
root@es-node1:~# systemctl daemon-reload
root@es-node1:~# systemctl enable --now elasticsearch.service
root@es-node1:~# pstree -p | grep java
|-java(2872)-+-controller(3082)-+-{controller}(3084)
| |-{java}(3060)
| |-{java}(3061)
| |-{java}(3062)
| |-{java}(3063)
root@es-node1:~# ss -ntlp | grep java
LISTEN 0 4096 [::ffff:127.0.0.1]:9200 *:* users:(("java",pid=2872,fd=293))
LISTEN 0 4096 [::1]:9200 [::]:* users:(("java",pid=2872,fd=292))
LISTEN 0 4096 [::ffff:127.0.0.1]:9300 *:* users:(("java",pid=2872,fd=290))
LISTEN 0 4096 [::1]:9300 [::]:* users:(("java",pid=2872,fd=289))
root@es-node1:~# curl 127.0.0.1:9200
{
"name" : "es-node1.test.com",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "2fJUnFk_SB6pB1WRT383sw",
"version" : {
"number" : "7.17.8",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "120eabe1c8a0cb2ae87cffc109a5b65d213e9df1",
"build_date" : "2022-12-02T17:33:09.727072865Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
3、编辑服务配置文件
# 配置文件说明
[root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
# ELK集群名称,同一个集群内每个节点的此项必须相同,新加集群的节点此项和其它节点相同即可加入集群,而无需再验证
cluster.name: ELK-Cluster
# 当前节点在集群内的节点名称,同一集群中每个节点要确保此名称唯一
node.name: es-node1
# ES 数据保存目录
path.data: /data/es-data
# ES 日志保存目录
path.logs: /data/es-logs
# 服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap,提高启动速度
bootstrap.memory_lock: true
# 指定监听IP,如果绑定了错误的IP,可将此修改为指定IP
network.host: 0.0.0.0
# 监听端口
http.port: 9200
# 发现集群的node节点列表,可以添加部分或全部节点IP
# 在新增节点到集群时,此处需指定至少一个已经在集群中的节点地址
discovery.seed_hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]
# 集群初始化时指定希望哪些节点可以被选举为 master,只在初始化时使用,新加节点到已有集群时此项可不配置
cluster.initial_master_nodes: ["192.168.1.101","192.168.1.102","192.168.1.103"]
# 一个集群中的 N 个节点启动后,才允许进行数据恢复处理,默认是1,一般设为为所有节点的一半以上,防止出现脑裂现象
# 当集群无法启动时,可以将之修改为1,或者将下面行注释掉,实现快速恢复启动
gateway.recover_after_nodes: 2
# 设置是否可以通过正则表达式或者_all匹配索引库进行删除或者关闭索引库,默认true表示必须需要明确指定索引库名称,不能使用正则表达式和_all,生产环境建议设置为 true,防止误删索引库。
action.destructive_requires_name: true
# 不参与主节点选举
node.master: false
# 存储数据,此值为false则不存储数据而成为一个路由节点
# 如果将true改为false,需要先执行/usr/share/elasticsearch/bin/elasticsearch-node
repurpose 清理数据
node.data: true
# 7.x以后版本下面指令已废弃,在2.x 5.x 6.x 版本中用于配置节点发现列表
discovery.zen.ping.unicast.hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]
# 单节点配置
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.1.101"]
cluster.initial_master_nodes: ["node-1"]
# 集群配置
root@es-node1:~# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: es-cluster
node.name: node-1
path.data: /data/es-data
path.logs: /data/es-logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]
cluster.initial_master_nodes: ["192.168.1.101","192.168.1.102","192.168.1.103"]
gateway.recover_after_nodes: 2
action.destructive_requires_name: true
root@es-node1:~# chown -R elasticsearch.elasticsearch /data/
![图片[2]-Elasticsearch 部署-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/12/image-299.png)
4、优化 ELK 资源配置
推荐使用宿主机物理内存的一半,ES的heap内存最大不超过30G,26G是比较安全的。
堆大小应基于可用 RAM:
将 Xms 和 Xmx 设置为不超过总内存的 50%。 Elasticsearch 需要内存用于 JVM 堆以外的用途。 例如,Elasticsearch 使用堆外缓冲区来实现高效的网络通信,并依靠操作系统的文件系统缓存来高效地访问文件。 JVM 本身也需要一些内存。 Elasticsearch 使用比 Xmx 设置配置的限制更多的内存是正常的。
在容器(例如 Docker)中运行时,总内存定义为容器可见的内存量,而不是主机上的总系统内存。
将 Xms 和 Xmx 设置为不超过压缩普通对象指针 (oops) 的阈值。 确切的阈值会有所不同,但在大多数系统上 26GB 是安全的,在某些系统上可能高达 30GB。 要验证您是否低于阈值,请检查 Elasticsearch日志中的条目。
为了保证性能,每个ES节点的JVM内存设置具体要根据 node 要存储的数据量来估算,建议符合下面约定:
- 在内存和数据量有一个建议的比例:对于一般日志类文件,1G 内存能存储48G~96GB数据
- JVM 堆内存最大不要超过30GB
- 对于主分片的数量,单个分片控制在30-50GB
假设总数据量为1TB,3个node节点,1个副本;那么实际要存储的大小为2TB
每个节点需要存储的数据量为:2TB / 3 = 700GB,然后每个节点需要预留20%的空间,意味着每个node要存储大约 875GB 的数据;按照内存与存储数据的比率计算:875GB/48GB=18,即需要JVM内存为18GB,小于30GB
因为要尽量控制主分片的大小为30GB;875GB/30GB=30个主分片,即最多30个主分片
范例:指定heap内存最小和最大内存限制
# 建议将heap内存设置为物理内存的一半且最小和最大设置一样大,但最大不能超过30G
root@es-node1:~# vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
# 每天1TB左右的数据量的建议服务器配置
16C 64G 6T硬盘 共3台服务器
范例:修改service文件,做优化配置
root@es-node1:~# vim /usr/lib/systemd/system/elasticsearch.service
LimitNOFILE=1000000 # 修改最大打开的文件数,默认值为65535
LimitNPROC=65535 # 修改打开最大的进程数,默认值为4096
LimitMEMLOCK=infinity # 无限制使用内存,以前旧版需要修改,否则无法启动服务,当前版本无需修改