写在前面:
Elasticsearch 是一个基于 Lucene 构建的分布式搜索引擎,它是 ELK 技术栈中的核心组件,主要用于存储和检索结构化/非结构化数据。
为什么选择 Elasticsearch 7.17.x?
虽然官方已经发布了 Elasticsearch 8.x 版本,但目前大多数企业级生产环境依然首选 7.17.x 版本,原因如下:
- 它是官方提供的长期支持(LTS)版本,维护到 2026 年,稳定可靠。
- 默认未强制开启安全模块,部署更简洁,便于集成其他开源组件。
- 社区生态成熟,插件丰富,出现问题更容易找到解决方案。
1. 部署准备
环境准备
注意:ES 7.x 及以下需独立安装 Java,ES 8.x 已内置 Java
官网获取安装包:
如果有限制的小伙伴,可以使用我下载好的包:elasticsearch-7.17.5
修改主机列表
--- 在所有节点上运行
cat >> /etc/hosts <<'EOF'
192.168.0.160 elk01
192.168.0.161 elk02
192.168.0.162 elk03
EOF
2. 部署服务
以下在所有节点上运行
--- 1. 上传压缩包至所有节点的服务器上
--- 2. 创建软件目录
mkdir -p /software
--- 3. 创建用户
useradd -u 2025 elasticsearch
--- 4. 创建工作目录
mkdir -pv /data/es
mkdir -pv /logs/es
--- 5. 授权
chown -R elasticsearch:elasticsearch /data
chown -R elasticsearch:elasticsearch /logs
--- 6. 解压软件包
tar xf elasticsearch-7.17.5-linux-x86_64.tar.gz -C /software/
## 这里传了软连接
ln -s /software/elasticsearch-7.17.5/ /software/es
chown -R elasticsearch:elasticsearch /software/es/
修改配置文件
## master节点的配置文件
grep -Ev '^\s*#|^\s*$' /software/es/config/elasticsearch.yml
cluster.name: my-es
node.name: elk01
node.master: true
node.data: true
path.data: /data/es
path.logs: /logs/es
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk01", "elk02", "elk03"]
cluster.initial_master_nodes: ["elk01", "elk02", "elk03"]
参数说明:
cluster.name: my-es 设置集群的名字,必须在集群中所有节点一致
node.name: elk01 当前节点的名称
path.data: /data/es 指定 Elasticsearch 存储数据的目录
node.master: true 是否作为master节点
node.data: true 是否作为数据节点
path.logs: /logs/es Elasticsearch 的日志输出路径
network.host: 0.0.0.0 监听的网络地址,0.0.0.0 表示监听所有网络,允许外部主机访问
http.port: 9200 设置 REST API 接口监听端口
discovery.seed_hosts: ["elk01", "elk02", "elk03"] 设置节点间自动发现机制的主机列表
cluster.initial_master_nodes: ["elk01", "elk02", "elk03"] 首次启动时,指定候选的 master 节点((必须为节点名,而不是 IP)
## node elk-02节点的配置文件
cluster.name: my-es
node.name: elk-02
node.master: false
node.data: true
path.data: /data/es
path.logs: /logs/es
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk01", "elk02", "elk03"]
cluster.initial_master_nodes: ["elk01", "elk02", "elk03"]
## node elk-03节点的配置文件
cluster.name: my-es
node.name: elk-03
node.master: false
node.data: true
path.data: /data/es
path.logs: /logs/es
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk01", "elk02", "elk03"]
cluster.initial_master_nodes: ["elk01", "elk02", "elk03"]
针对elasticsearch的基础调优
## 所有节点都要做基础调优
## 修改文件打开上限,需要重启服务器
--- 1. 修改limits配置文件,添加一下内容
cat /etc/security/limits.conf
root soft nofile 65535
root hard nofile 131070
root hard nproc 8192
--- 2. 修改systemd配置文件
egrep -v '^$|#' /etc/systemd/user.conf
[Manager]
DefaultLimitNOFILE=65535
DefaultLimitNPROC=8192
vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535:524288
DefaultLimitNPROC=8192
--- 3. 重启服务器,出现一下表示成功
ulimit -Sn
65535
## 调大内核虚拟内存映射值
cat /etc/sysctl.d/es.conf
vm.max_map_count=524288
sysctl -q vm.max_map_count
vm.max_map_count = 65530
sysctl -f /etc/sysctl.d/es.conf
vm.max_map_count = 524288
sysctl -q vm.max_map_count
vm.max_map_count = 524288
## 配置java环境,可以使用es自带的java环境
vim ~/.bashrc
export JAVA_HOME=/software/es/jdk
export PATH=$PATH:$JAVA_HOME/bin
## 后台启动es服务
su elasticsearch -c'/software/es/bin/elasticsearch -d'
ss -lntup |grep 9200
ss -lntup |grep 9300
root@elk-01:/software# curl 192.168.0.160:9200
{
"name" : "elk-01",
"cluster_name" : "my-es",
"cluster_uuid" : "EhhiYSboQgGQAcrRUr8wuQ",
"version" : {
"number" : "7.17.5",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
"build_date" : "2022-06-23T21:57:28.736740635Z",
"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"
}
## 启动成功,若集群UUID出现"_na_"状态时,集群可能启动失败,所有节点重新操作
pkill java
rm -rf /data/es/* /logs/es/*
使用systemctl管理ES服务
--- 1. 停掉es服务
pkill java
--- 2. 编写es的启动脚本
cat /usr/lib/systemd/system/es.service
[Unit]
Description=es
After=network.target
[Service]
Type=simple
ExecStart=/software/es/bin/elasticsearch
User=elasticsearch
LimitNOFILE=131070
[Install]
WantedBy=multi-user.target
--- 3. 加载脚本
systemctl daemon-reload
--- 4. 设置开机自启
systemctl enable --now es
--- 5. 查看服务是否运行
systemctl status es
ss -lntup
root@elk-01:~# curl 192.168.0.160:9200/_cat/nodes
192.168.0.160 20 80 2 0.03 0.17 0.18 cdfhilmrstw * elk-01
192.168.0.162 8 96 54 1.17 0.67 0.43 cdfhilmrstw - elk-03
192.168.0.161 79 3 0.02 0.13 0.23 cdfhilmrstw - elk-02
3. 优化
修改ES环境的堆(heap)内存大小
## 修改配置文件
root@elk-01:~# cat /software/es/config/jvm.options
...
-Xms256m
-Xmx256m
...
## 重启服务验证堆内存大小
systemctl restart es
jhsdb jmap --heap --pid 3058 |grep MaxHeapSize
MaxHeapSize = 268435456 (256.0MB)
常见报错
1. java.lang.RuntimeException: can not run elasticsearch as root
报错原因:
不能以root用户启动ES服务。
解决方案:
使用普通用户启动服务即可。
2. bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
报错原因:
程序默认的的文件打开数量上线过低。
解决方案:
调大文件打开数量上限即可。
3. bootstrap check failure [2] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
报错原因:
内核参数虚拟内存映射过低。
解决方案:
调大内核虚拟内存映射值即可。
4. bootstrap check failure [3] of [3]: max number of threads [3795] for user [oldboyedu] is too low, increase to at least [4096]
报错原因:
程序打开的线程数量设置过低。
解决方案:
调大程序打开的线程数量即可。
5. initial heap size [268435456] not equal to maximum heap size [1031798784]; this can cause resize pauses and prevents mlockall from locking the entire heap
报错原因:
初始化堆内存和最大堆内存大小不一致。
解决方案:
观察配置是否生效,建议将"-Xms"和"-Xmx"值配置一致。
评论