本文提供了一份完整的Elasticsearch 8.13.2在生产环境中的部署指南。涵盖了从系统优化、安全配置到服务管理的全流程,特别注重生产环境下的安全性和稳定性配置。指南包括TLS/SSL证书配置、系统资源调优、systemd服务集成以及用户权限管理等关键环节,适合用于构建安全、可靠的Elasticsearch集群。
一、部署前准备
在部署Elasticsearch之前,必须对操作系统进行优化配置,以确保Elasticsearch能够获得足够的系统资源并稳定运行。
1.修改文件描述符最大及进程数量打开上限
Elasticsearch在处理大量数据时可能需要同时打开很多文件(如索引分片、日志文件等),默认的文件描述符限制通常不足以支持生产环境需求。提高这些限制可以避免出现"打开文件过多"的错误。
- soft nofile 65535:设置每个进程可打开的文件描述符软限制为65535
- hard nofile 131070:设置硬限制为131070,这是软限制的上限值
- hard nproc 8192:设置用户最大进程数为8192,确保ES有足够的进程资源
sh
[root@elk101 ~]# cat > /etc/security/limits.d/es.conf <<EOF
* soft nofile 65535
* hard nofile 131070
* hard nproc 8192
EOF
2.修改虚拟内存映射上限
Elasticsearch使用mmap来高效访问索引文件,vm.max_map_count参数定义了进程可以拥有的内存映射区域的最大数量。默认值通常较低,需要增加以避免内存映射不足的问题。
sh
查看内核参数:
[root@elk101 ~]# sysctl -q vm.max_map_count
vm.max_map_count = 262144
临时修改内核参数(重启OS后配置丢失):
[root@elk101 ~]# sysctl -w vm.max_map_count=262144
永久生效内核参数(重启OS后配置不丢失) 强烈推荐
[root@elk101 ~]# cat > /etc/sysctl.d/es.conf <<EOF
vm.max_map_count=262144
EOF
[root@elk101 ~]# sysctl -f /etc/sysctl.d/es.conf
3.安装jdk
Elasticsearch是基于Java开发的,需要JDK运行环境。Elasticsearch 8.13.2需要JDK 17或更高版本。
sh
#01 Oracle JDK下载地址:https://www.oracle.com/java/technologies/downloads/
#02 解压软件包
[root@ecm-d323 software]# tar xf jdk-17.0.15_linux-x64_bin.tar.gz
[worker@es-node-27 ~]$ vim /etc/profile.d/java.sh
#添加环境变量
export PATH=/data/software/jdk-17/bin:$PATH
4.创建es用户
出于安全考虑,不应该使用root用户运行Elasticsearch。创建专用用户可以限制权限,降低安全风险。
sh
[root@elk101 ~]# useradd elastic
二、部署es
1.下载es
从官方源下载Elasticsearch安装包,确保软件包完整性和安全性。
sh
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.13.2-linux-x86_64.tar.gz
2.解压
sh
[root@ecm-d323 software]# cd /data/software/
[root@ecm-d323 software]# tar xf elasticsearch-8.13.2-linux-x86_64.tar.gz
3.修改jvm参数
调整JVM堆内存大小是性能调优的关键步骤。应根据服务器物理内存大小合理分配。
- Xms和Xmx设置为相同值:避免运行时堆内存调整带来的性能开销
- 通常设置为物理内存的50%:但不超过32GB(超过32GB会降低JVM性能)
- 保留足够内存给操作系统和文件系统缓存
sh
[root@ecm-d323 config] cd /data/software/elasticsearch-8.13.2/config
[root@ecm-d323 config]# vim jvm.options
-Xms4g
-Xmx4g
4.生成证书
Elasticsearch 8.x默认启用安全特性,包括传输层加密。需要为节点间通信生成TLS/SSL证书。
- 第一步:创建自签名的根CA证书,用于签发其他证书
- 第二步:使用CA为Elasticsearch节点签发证书
- 生产建议:使用受信任的CA或内部PKI系统颁发证书
sh
#生成一个新的证书颁发机构(CA),即 自签名的根证书,用于后续签发其他 Elasticsearch 节点证书
[root@ecm-d323 ~]# cd /data/software/elasticsearch-8.13.2/config
[root@ecm-d323 elasticsearch-8.13.2]# ./bin/elasticsearch-certutil ca --out elastic-stack-ca.p12 --pass ""
#使用已有的 CA 签发 Elasticsearch 节点证书(即由 CA 签名的证书,而不是自签名证书)
[root@ecm-d323 elasticsearch-8.13.2]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ca-pass "" --out config/elastic-certificates.p12 --pass ""

5.修改配置文件
Elasticsearch的主要配置文件,需要根据实际环境调整集群名称、网络设置和安全配置。
关键配置说明:
- cluster.name:集群标识,同一集群的所有节点必须相同
- network.host: 0.0.0.0:监听所有网络接口(生产环境建议绑定特定IP)
- http.port: 19200:REST API端口(默认9200)
- discovery.seed_hosts:集群发现种子节点列表
- cluster.initial_master_nodes:初始主节点列表(集群首次启动时需要)
- xpack.security:启用安全特性,包括认证和加密
sh
[worker@elasticsearch-zs config]$ cd /data/software/elasticsearch-8.13.2/config/
[worker@elasticsearch-zs config]$ egrep -v "^#|^$" elasticsearch.yml
cluster.name: es8
network.host: 0.0.0.0
http.port: 19200
discovery.seed_hosts: ["10.0.0.3"]
cluster.initial_master_nodes: ["10.0.0.3"]
#配置证书
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
6.添加启动配置文件
创建启动脚本便于管理和维护Elasticsearch服务,包含环境变量设置和进程管理。
- ES_JAVA_HOME:显式指定JDK路径,避免环境变量问题
- 使用专用用户启动:提高安全性
- 进程检查:避免重复启动,确保服务状态可控
- 日志记录:将启动日志保存到文件便于排查问题
sh
[root@ecm-d323 elasticsearch-8.13.2]# cat startES.sh
#!/bin/bash
#设置jdk路径
export ES_JAVA_HOME="/data/software/jdk-17.0.15"
# 设置Elasticsearch的安装目录
ES_HOME="/data/software/elasticsearch-8.13.2"
LOG_FILE="${ES_HOME}/logs/startup.log"
#设置启动用户
ES_USER="elastic"
pid=`ps -ef | grep elasticsearch-8.13.2 | grep -v grep | grep '/data/software/elasticsearch-8.13.2' | awk '{print $2}'`
# 检查Elasticsearch是否已经在运行
if ps -ef | grep elasticsearch | grep -v grep > /dev/null; then
echo "Elasticsearch is running. Stopping..."
kill $pid;
echo "Elasticsearch stopped."
fi
sleep 5s
# 使用nohup重新启动Elasticsearch
#nohup "$ES_HOME/bin/elasticsearch" -d > "$ES_HOME/es.log" 2>&1 &
su - "$ES_USER" -s /bin/bash -c "nohup \"$ES_HOME/bin/elasticsearch\" -d >> \"$LOG_FILE\" 2>&1 &"
echo "Elasticsearch is starting in the background..."
7.以systemctl管理
使用systemd管理Elasticsearch服务可以实现开机自启、服务状态监控和集中化日志管理。
systemd配置要点:
- User/Group:指定运行服务的专用用户,确保安全
- 资源限制:覆盖系统默认限制,确保ES获得足够资源
- 进程控制:优雅的停止机制,避免数据损坏
sh
[root@ecm-d323 elasticsearch-8.13.2]# vim /usr/lib/systemd/system/es8.service
[Unit]
Description=elasticsearch
After=network.target
[Service]
# 核心配置:指定运行用户和组,请将 `your_es_user` 和 `your_es_group` 替换为实际的用户和组
User=elastic
Group=elastic
Type=forking
# 指定启动命令,-d 参数表示以守护进程(daemon)方式运行
ExecStart=/data/software/elasticsearch-8.13.2/bin/elasticsearch -d
PrivateTmp=true
# 设置资源限制,这对于ES稳定运行很重要
LimitNOFILE=65535
LimitNPROC=4096
LimitMEMLOCK=infinity
# 设置超时和停止信号
TimeoutStopSec=0
KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
# 重新加载systemd配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable es8.service
# 启动服务
sudo systemctl start es8.service
# 检查服务状态
sudo systemctl status es8.service
8.修改文件目录权限
确保Elasticsearch专用用户对安装目录和数据目录有正确的读写权限。
- 递归修改目录所有权,确保elastic用户可以正常读写
- 包括配置文件、数据目录、日志目录等
sh
chown elastic:elastic /data/software/elasticsearch-8.13.2 -R
9.启动
执行启动脚本,启动Elasticsearch服务,并监控启动日志。
- 使用
tail -f实时查看启动日志,便于监控启动过程 - 关注日志中的错误和警告信息
sh
[root@ecm-d323 elasticsearch-8.13.2]# sh startES.sh
[root@ecm-d323 elasticsearch-8.13.2]# tail -f logs/startup.log
10.设置es密码
Elasticsearch 8.x默认启用安全特性,需要为内置用户设置密码。
内置用户说明:
- elastic:超级管理员用户,拥有所有权限
- kibana_system:Kibana服务连接ES使用的用户
- logstash_system:Logstash服务连接ES使用的用户
- beats_system:Beats系列产品连接ES使用的用户
- apm_system:APM服务使用的用户
- remote_monitoring_user:监控用户
sh
[root@ecm-d323 elasticsearch-8.13.2]# ./bin/elasticsearch-setup-passwords auto
******************************************************************************
Note: The 'elasticsearch-setup-passwords' tool has been deprecated. This command will be removed in a future release.
******************************************************************************
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y
Changed password for user apm_system
PASSWORD apm_system = d2Kiqz6UR2RvRIUpFiNj
Changed password for user kibana_system
PASSWORD kibana_system = hBbxAHMiJywLgnuWDt2c
Changed password for user kibana
PASSWORD kibana = hBbxAHMiJywLgnuWDt2c
Changed password for user logstash_system
PASSWORD logstash_system = JbyQQrLKyb0tkhTZpYsu
Changed password for user beats_system
PASSWORD beats_system = gKqD5OMUxpkbWlVzmtFx
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = x42jHJK8i9xmoFYDMppn
Changed password for user elastic
PASSWORD elastic = EOnjcxaOSOuk5QjEmnOS
[root@ecm-d323 elasticsearch-8.13.2]#
#交互式修改密码
[root@ecm-d323 elasticsearch-8.13.2]# ./bin/elasticsearch-reset-password -i -u elastic
11.验证
通过REST API验证Elasticsearch是否正常运行,节点状态是否健康。
sh
curl -u elastic:IfCaV45mpajspXJ9cS4G 10.0.0.3:19200/_cat/nodes
