写在前面:

Elasticsearch 是一个基于 Lucene 构建的分布式搜索引擎,它是 ELK 技术栈中的核心组件,主要用于存储和检索结构化/非结构化数据。

为什么选择 Elasticsearch 7.17.x?

虽然官方已经发布了 Elasticsearch 8.x 版本,但目前大多数企业级生产环境依然首选 7.17.x 版本,原因如下:

- 它是官方提供的长期支持(LTS)版本,维护到 2026 年,稳定可靠。

- 默认未强制开启安全模块,部署更简洁,便于集成其他开源组件。

- 社区生态成熟,插件丰富,出现问题更容易找到解决方案。

1. 部署准备

环境准备

主机名

IP

应用

环境

elk01

192.168.0.160

elasticsearch

Ubuntu 24.04.2 LTS

elk02

192.168.0.161

elasticsearch

Ubuntu 24.04.2 LTS

elk03

192.168.0.162

elasticsearch

Ubuntu 24.04.2 LTS

注意:ES 7.x 及以下需独立安装 Java,ES 8.x 已内置 Java

官网获取安装包:

如果有限制的小伙伴,可以使用我下载好的包:elasticsearch-7.17.5

https://www.elastic.co/downloads/elasticsearch

修改主机列表

--- 在所有节点上运行
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"值配置一致。