ES8.6.2 集群部署:教你避坑,笑着搞定高可用
各位 "潜伏同仁",好久不见!自从上次写技术文,时间都像 "一头野驴,跑起来就不停"------ 一晃两三年,连我这脑子都快跟站长的前列腺似的 "经常造反",写个配置都得翻三遍笔记。
但最近想使用需要使用ES集群,于是我上了,弄了个 ES8.6.2 集群部署,整完后,我突然悟了:搞技术 ------ 表面上跟着文档 "念主义",背地里全是 "填坑的生意"。今天从 0 到 1 带你搭集群,保证让你少掉头发,多省时间 ------ 毕竟谁也不想让领导骂 "把你的脑袋从脚后跟里拿出来再用一次吧"。
一、准备工作:搞集群,先懂 "站队"
部署 ES 集群前,你得先想明白:单个节点就是 "孤胆英雄",遇到大数据量直接 "暴露身份";集群才是 "潜伏小组",节点间互相打掩护,高可用才有保障。
"搞集群不为高可用,不如回家卖红薯"。所以最少准备 3 台服务器,内存 16G 起步 ------ 不然 ES 启动时抛错:"你这配置,是来混日子的?"
基础环境要到位,别等踩坑了才后悔:
-
JDK 得是 11+(别拿 8.x 凑数,不然 ES 跟晚秋见翠平似的,互不兼容),本文采用ES自带的JDK,后面安装集群总结有详细操作步骤
-
防火墙开放端口:HTTP 端口(我用 19202,默认 9200)、集群通信端口(19302,默认 9300)
-
文件描述符改到 65535(执行ulimit -n 65535,不然 ES 会警告 "眼界太窄,成不了大事")
------ 要是连这步都省,回头集群崩了,可别让我用 "处罚" 这种 "可怜的手段"(站长原话,我用不惯,但坑是真得填)。

二、部署 ES 集群:像搭潜伏小组,一个都不能错
第一步:改配置文件,定 "规则"
解压 ES 安装包后,先改config/elasticsearch.yml------ 这就像给小组定规矩,错一个字都可能 "暴露"错误。以 node1 为例:
bash
cluster.name: es8-cluster # 小组代号,三台节点必须一样,不然就是"不同派系"
node.name: node1-es8 # 节点代号,每台不一样(node1/node2/node3)
path.data: /mnt/data/elastic8/es8-data # 数据存放地,别放系统盘,"狡兔三窟"懂不懂?
path.logs: /mnt/data/elastic8/es8-logs # 日志路径,出问题全靠它"破案"
network.host: 192.168.5.10 # 方便节点间"传递情报"
http.port: 19202 # HTTP端口,对外"接头"用
transport.port: 19302 # 内部通信端口,节点间"密谈"用
# 集群发现:填另外两台的IP+通信端口,"认识自己人很重要"
discovery.seed_hosts: ["192.168.5.10:19302", "192.168.5.11:19302", "192.168.5.12:19302"]
# 初始主节点:候选名单,"组长得从自己人里选"
cluster.initial_master_nodes: ["node1-es8", "node2-es8", "node3-es8"]
# 禁用GeoIP自动下载(没网的环境就别"联网报信"了)
ingest.geoip.downloader.enabled: false
"细节决定成败",这里千万注意:cluster.name三台必须一致,node.name必须唯一 ------ 要是填错了,集群启动后全是 "孤狼",集群就跟不存在似的。
第二步:加 "密码锁",就像设 "暗号"
ES8.x 默认带安全功能 ------ 你不想用也得先设置,不然 "敌人"(未授权访问)很容易混进来。
生成证书:最容易 "翻车" 的一步
证书就像 "小组通行证",没它节点间不敢互相认。我当时在这卡了半小时,这里给出我的解决步骤。
- 先建证书目录(三台都要做):
bash
mkdir -p config/certs
chmod 750 config/certs # 权限别给太松,"秘密不能外泄"
- 生成 CA 证书(只在 node1 执行,相当于 "制作通行证模板"):
bash
cd bin
./elasticsearch-certutil ca
# 提示输密码时直接回车(不设密码,简单粗暴)
生成的elastic-stack-ca.p12会在 ES 根目录,就像 "模板藏在安全屋"。
- 生成节点证书(关键!要包含所有节点 IP,不然 "通行证不认人"):
bash
./elasticsearch-certutil cert --ca ../elastic-stack-ca.p12 -multiple
这里必须选 "y" 添加多个实例,依次输入三个节点的名字和 IP:
-
第一台:node1-es8 + IP
192.168.5.11 -
第二台:node2-es8 + IP
192.168.5.12 -
第三台:node3-es8 + IP
192.168.5.13
"每个人的分工要明确,不能乱"------ 少一个节点 IP,后续集群通信必失败。
- 复制证书到所有节点:
bash
# 把node2的证书传到node2服务器
scp -r ../config/certs/node2/ elastic8@192.168.5.12:$ES_HOME/config/certs/
别传错了!node1 的证书只能 node1 用,传混了就像 "拿错通行证,进不了门"------ 这种低级错误,站长见了都得说 "颇具浪漫主义气质"(嘲讽拉满)。
改安全配置:给 "暗号" 上保险
在所有节点的elasticsearch.yml里加这些配置(对应各自节点的证书路径):
yaml
xpack.security.enabled: true # 启用安全功能,"暗号必须有"
xpack.security.transport.ssl.enabled: true # 节点间通信加密,"密谈不能被偷听"
# 证书路径:node1用node1的,node2用node2的,别搞混
xpack.security.transport.ssl.keystore.path: certs/node1/node1-es8.p12
xpack.security.transport.ssl.truststore.path: certs/node1/node1-es8.p12
xpack.security.transport.ssl.keystore.password: "" # 没设密码就是空
xpack.security.transport.ssl.truststore.password: ""
xpack.security.http.ssl.enabled: false # 暂时不用HTTPS,先"简化流程"
设置密码:"暗号" 定好了,该记牢
启动所有节点后,在任意节点执行:
arduino
./elasticsearch-setup-passwords interactive
按提示给用户设密码,重点记两个:
-
elastic:超级管理员,相当于 "站长",权限最大
-
kibana_system:Kibana 专用,相当于 "联络员",只负责和 Kibana 对接
"重要的事情要记牢,不能忘"------ 这两个密码丢了,后续 Kibana 连不上 ES,只能重置(别问我怎么知道的,我当时重置了两次,差点被自己蠢哭)。
第三步:启动集群,看 "潜伏小组" 是否就位
bash
# 后台启动ES,"悄悄干活,别声张"
bin/elasticsearch -d
验证集群状态:
bash
curl -u elastic:你的密码 http://localhost:19202/_cluster/health
-
看到"status":"green":完美,小组全员就位,"潜伏成功"
-
看到"status":"yellow":还行,个别分片没分配,"问题不大"
-
看到"status":"red":完了,"暴露了",赶紧看日志(es8-cluster.log)找问题
"遇事别慌,先找原因"------ 红状态大概率是证书传错、端口没开,或者磁盘空间不足。要是连日志都不会看,那真得 "把脑袋从脚后跟里拿出来再用一次" 了。
安装ES集群总结
bash
# root 用户操作
useradd elastic8
passwd elastic8
vim /etc/security/limits.conf
# 在文末添加如下内容:
elastic8 hard nofile 65536
elastic8 soft nofile 65536
elastic8 hard nproc 4096
elastic8 soft nproc 4096
vim /etc/sysctl.conf
# 在文件末尾添加
vm.max_map_count = 655360
# 保存退出
# 使之生效
sysctl -p
# 下面是用 elastic8 用户操作
su elastic8
# (如果不使用 su elastic8 ,可以直接使用 elastic8 登录)
# 配置环境变量,方便后续操作
# 在 /home/elastic8 下
vim .bashrc
# 文件末尾:
export ES_HOME=/home/elastic8/elasticsearch
export ES_JAVA_HOME=/home/elastic8/elasticsearch/jdk
export KIBANA_HOME=/home/elastic8/kibana
export PATH=$PATH:$ES_HOME/bin
source .bashrc
# 在 ~/.bash_profile 中加入:
vim .bash_profile
# 添加如下代码(如果还没有)
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
source .bash_profile
# 将 elasticsearch-8.6.2-linux-x86_64.tar.gz 上传到 /home/elastic8
# 解压
cd /home/elastic8 && tar -zxvf elasticsearch-8.6.2-linux-x86_64.tar.gz
# 重命名 ES 家目录
mv elasticsearch-8.6.2 elasticsearch
scp -P port -r elasticsearch elastic8@192.168.5.12:/home/elastic8
scp -P port -r elasticsearch elastic8@192.168.5.13:/home/elastic8
# 修改配置文件
cd $ES_HOME/config
cp elasticsearch.yml elasticsearch.yml.bak
vim elasticsearch.yml
# 文件内容设置如下:
cluster.name: es8-cluster
node.name: node1-es8
path.data: /mnt/data/elastic8/es8-data
path.logs: /mnt/data/elastic8/es8-logs
network.host: 192.168.5.11
http.port: 19202
transport.port: 19302
discovery.seed_hosts: ["192.168.5.11:19302", "192.168.5.12:19302", "192.168.5.13:19302"]
cluster.initial_master_nodes: ["node1-es8", "node2-es8", "node3-es8"]
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: false
# 使用p12格式证书
xpack.security.transport.ssl.keystore.path: certs/node1/node1-es8.p12
xpack.security.transport.ssl.truststore.path: certs/node1/node1-es8.p12
# 不验证证书密码
xpack.security.transport.ssl.keystore.password: ""
xpack.security.transport.ssl.truststore.password: ""
# 禁用 GeoIP 自动下载(无法联网,这样配置)
ingest.geoip.downloader.enabled: false
# 生成证书
cd $ES_HOME/bin
# 生成CA证书(会保存到ES家目录)
./elasticsearch-certutil ca
# 执行过程中的提示:
# 1. 输出文件默认是"elastic-stack-ca.p12",直接按回车
# 2. 输入密码时直接按回车(不设置密码,简化配置)
# 基于CA证书生成节点证书(注意指定CA证书的正确路径:ES根目录)
./elasticsearch-certutil cert --ca $ES_HOME/elastic-stack-ca.p12 -multiple
# 执行过程中的提示:
[elastic8@node1 bin]$ ./elasticsearch-certutil cert --ca $ES_HOME/elastic-stack-ca.p12 -multiple
warning: ignoring JAVA_HOME=/mnt/data/jdk1.8.0_131; using ES_JAVA_HOME
....
Enter password for CA (/home/elastic8/elasticsearch/elastic-stack-ca.p12) :
Enter instance name: node1-es8
Enter name for directories and files of node1-es8 [node1-es8]:
Enter IP Addresses for instance (comma-separated if more than one) []: 192.168.5.11
Enter DNS names for instance (comma-separated if more than one) []:
Would you like to specify another instance? Press 'y' to continue entering instance information: y
Enter instance name: node2-es8
Enter name for directories and files of node2-es8 [node2-es8]:
Enter IP Addresses for instance (comma-separated if more than one) []: 192.168.5.12
Enter DNS names for instance (comma-separated if more than one) []:
Would you like to specify another instance? Press 'y' to continue entering instance information: y
Enter instance name: node3-es8
Enter name for directories and files of node3-es8 [node3-es8]:
Enter IP Addresses for instance (comma-separated if more than one) []: 192.168.5.13
Enter DNS names for instance (comma-separated if more than one) []:
Would you like to specify another instance? Press 'y' to continue entering instance information: n
Please enter the desired output file [certificate-bundle.zip]:
Enter password for node2-es8/node2-es8.p12 :
Enter password for node1-es8/node1-es8.p12 :
Enter password for node3-es8/node3-es8.p12 :
Certificates written to /home/elastic8/elasticsearch/certificate-bundle.zip
...
# 移动CA证书到config/certs目录
mv ../elastic-stack-ca.p12 ../config/certs/
# 移动节点证书到config/certs目录
mv ../elastic-certificates.p12 ../config/certs/
scp -P port -r $ES_HOME/config/certs/node2/ elastic8@192.168.5.12:/home/elastic8/elasticsearch/config/certs/
scp -P port -r $ES_HOME/config/certs/node3/ elastic8@192.168.5.13:/home/elastic8/elasticsearch/config/certs/
# 没有的配置项需要手动添加上,其余配置项默认即可,保存并退出
# 生成密码,参考官网地址
https://www.elastic.co/guide/en/elasticsearch/reference/8.6/security-minimal-setup.html
# 在任一节点(比如 node1-es8)开一个 terminal 终端,使用 elastic8 用户登录
cd $ES_HOME
# 1. 启动 es
./bin/elasticsearch
# 2. 再另打开一个 terminal 终端,使用 elastic8 用户登录
./bin/elasticsearch-setup-passwords auto
# 该命令执行完,会打印一些密码信息,要牢记

三、部署 Kibana:给 ES 配个 "联络员"
Kibana 就像 ES 的 "联络员",把复杂的命令行变成可视化界面,不然每次查数据都得输 curl,跟 "发电报似的麻烦"。
第一步:装 Kibana,版本必须 "对得上"
下载和 ES 同版本的 Kibana(8.6.2),解压后改配置文件config/kibana.yml:
bash
server.host: "192.168.5.11"
# 连接ES集群,填所有节点的HTTP地址,"多个人多条路"
elasticsearch.hosts: ["http://192.168.5.11:19202", "http://192.168.5.12:19202", "http://192.168.5.13:19202"]
elasticsearch.username: "kibana_system" # 用刚才设的"联络员"账号
elasticsearch.password: "你的kibana_system密码" # 对应密码
elasticsearch.ssl.verificationMode: "none" # 没开HTTPS,就"不验证SSL"
第二步:启动 Kibana,看 "联络员" 是否上线
bash
# 后台启动,"低调行事"
nohup bin/kibana &
访问http://KibanaIP:5601,用elastic账号登录 ------ 看到首页的那一刻,就像 "潜伏小组终于和组织接上了头",成就感拉满。要是连这步都卡壳,建议回头看看配置,别让 "峨眉峰独照" 的浪漫主义,耽误了正事。
四、避坑指南: "少走弯路"
- "max file descriptors 太低":
改/etc/security/limits.conf,加* hard nofile 65535,不然 ES 会 "抱怨":"这点权限,能干成什么大事?"
- 节点间通信失败:
先查证书是否包含所有节点 IP,再查防火墙是否开放 19302 端口 ------ "先查内部,再查外部"。别上来就重启,那是 "可怜的手段",我用不惯,你也别依赖。
- Kibana 连不上 ES:
用curl -u 账号:密码 http://ESIP:19202 测试 ES 是否能通,再核对 Kibana 配置里的账号密码 ------"接头先确认身份,别找错人"。要是密码输错三次,建议贴个便利贴在屏幕上,别让脑子 "前列腺造反"。
- 集群状态 red:
看日志里的 "分片分配失败" 原因,大概率是磁盘空间不足(ES 默认磁盘使用率超 85% 不分配分片),或者节点间网络不通 ------"有问题先看日志,日志是最好的情报"。要是日志都不会读,那真得研究研究 "凝聚意志,保卫领袖",先把自己的技术意志凝聚起来。
五、总结:耐心最重要
部署 ES 集群的过程,开始处处是坑,摸透规则后就顺风顺水。 "心急吃不了热豆腐",搞技术也是如此:证书错了就重新生成,配置不对就逐行核对,只要不放弃,总能搞定。
现在我的 ES 集群稳定运行,每天处理数据轻轻松松。想起两三年没写文,如今能把坑踩明白、把话说清楚,也算没让 "时间这头野驴" 白跑。
如果你也在部署 ES,希望这篇文章能帮你少踩坑 ------ 毕竟,"能少走弯路,就别给自己找麻烦"。
各位下次见!
