ES8.6.2 集群部署:教你避坑,笑着搞定高可用

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 默认带安全功能 ------ 你不想用也得先设置,不然 "敌人"(未授权访问)很容易混进来。

生成证书:最容易 "翻车" 的一步

证书就像 "小组通行证",没它节点间不敢互相认。我当时在这卡了半小时,这里给出我的解决步骤。

  1. 先建证书目录(三台都要做):
bash 复制代码
mkdir -p config/certs
chmod 750 config/certs  # 权限别给太松,"秘密不能外泄"
  1. 生成 CA 证书(只在 node1 执行,相当于 "制作通行证模板"):
bash 复制代码
cd bin
./elasticsearch-certutil ca
# 提示输密码时直接回车(不设密码,简单粗暴)

生成的elastic-stack-ca.p12会在 ES 根目录,就像 "模板藏在安全屋"。

  1. 生成节点证书(关键!要包含所有节点 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,后续集群通信必失败。

  1. 复制证书到所有节点:
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账号登录 ------ 看到首页的那一刻,就像 "潜伏小组终于和组织接上了头",成就感拉满。要是连这步都卡壳,建议回头看看配置,别让 "峨眉峰独照" 的浪漫主义,耽误了正事。

四、避坑指南: "少走弯路"

  1. "max file descriptors 太低"

改/etc/security/limits.conf,加* hard nofile 65535,不然 ES 会 "抱怨":"这点权限,能干成什么大事?"

  1. 节点间通信失败

先查证书是否包含所有节点 IP,再查防火墙是否开放 19302 端口 ------ "先查内部,再查外部"。别上来就重启,那是 "可怜的手段",我用不惯,你也别依赖。

  1. Kibana 连不上 ES

用curl -u 账号:密码 http://ESIP:19202 测试 ES 是否能通,再核对 Kibana 配置里的账号密码 ------"接头先确认身份,别找错人"。要是密码输错三次,建议贴个便利贴在屏幕上,别让脑子 "前列腺造反"。

  1. 集群状态 red

看日志里的 "分片分配失败" 原因,大概率是磁盘空间不足(ES 默认磁盘使用率超 85% 不分配分片),或者节点间网络不通 ------"有问题先看日志,日志是最好的情报"。要是日志都不会读,那真得研究研究 "凝聚意志,保卫领袖",先把自己的技术意志凝聚起来。

五、总结:耐心最重要

部署 ES 集群的过程,开始处处是坑,摸透规则后就顺风顺水。 "心急吃不了热豆腐",搞技术也是如此:证书错了就重新生成,配置不对就逐行核对,只要不放弃,总能搞定。

现在我的 ES 集群稳定运行,每天处理数据轻轻松松。想起两三年没写文,如今能把坑踩明白、把话说清楚,也算没让 "时间这头野驴" 白跑。

如果你也在部署 ES,希望这篇文章能帮你少踩坑 ------ 毕竟,"能少走弯路,就别给自己找麻烦"。

各位下次见!

相关推荐
非凡ghost4 小时前
By Click Downloader(下载各种在线视频) 多语便携版
前端·javascript·后端
weixin_456904274 小时前
Transformer架构发展历史
深度学习·架构·transformer
非凡ghost4 小时前
VisualBoyAdvance-M(GBA模拟器) 中文绿色版
前端·javascript·后端
非凡ghost4 小时前
K-Lite Mega/FULL Codec Pack(视频解码器)
前端·javascript·后端
sniper_fandc4 小时前
Elasticsearch从入门到进阶——分布式特性
大数据·分布式·elasticsearch
LinXunFeng4 小时前
Flutter 多仓库本地 Monorepo 方案与体验优化
前端·flutter·架构
非凡ghost4 小时前
ProcessKO(查杀隐藏危险进程)多语便携版
前端·javascript·后端
IT小番茄5 小时前
kubernetes云平台管理实战:deployment通过标签管理pod(十)
架构
程序新视界5 小时前
详解MySQL两种存储引擎MyISAM和InnoDB的优缺点
数据库·后端·mysql