4. Elasticsearch 集群搭建:单节点与多节点配置,安全设置(X-Pack)

好,咱们进入实战环节。搭建 Elasticsearch 集群,这一步如果地基没打好,后面 Logstash 和 Kibana 再好看也白搭。我见过不少团队,日志一多,单节点直接 OOM,或者节点间通信用了默认配置,结果数据丢了都不知道。

这一章我会把单节点、多节点、X-Pack 安全设置串起来讲。你跟着做就行,不用纠结“先调哪个参数”——我会告诉你哪些是必填项,哪些是坑。

Elasticsearch 集群搭建知识体系 Elasticsearch 集群 节点角色(Master/Data/Ingest) elasticsearch.yml 核心配置 X-Pack 安全 & 加密 单节点 多节点 网络 & 发现 JVM 堆内存 密码认证 TLS 加密 💡 本章核心:单节点快速验证 → 多节点生产配置 → X-Pack 安全加固 顺序不能乱:先单后多,先通后安

4.1 单节点搭建——别小看这一步

我个人习惯,在生产环境之前,先拉一个单节点验证所有配置。你想想看,如果单节点都起不来,堆多节点也没用。

先下载 ES 8.x(我建议用 8.5 以上,X-Pack 默认集成,省事),解压到 /opt/elasticsearch。核心配置只有两个文件:elasticsearch.yml 和 jvm.options。

最精简的单节点配置:

cluster.name: my-secrets-cluster
node.name: node-1
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
xpack.security.enabled: false

discovery.type: single-node 是关键——告诉 ES 别尝试发现其他节点。我记得第一次接手 ES 时,没加这个,单节点启动一直报 discovery 错误,卡了我半小时。嗯,现在你可以放心跑起来:

./bin/elasticsearch -d -p /tmp/es.pid

然后用 curl 验证:

curl http://localhost:9200

返回一个 JSON,里面有 cluster_name 和 version,说明单节点 OK 了。

避坑指南: 千万不要在生产用 discovery.type: single-node。我曾经见人图省事,直接把这个配置丢到服务器跑了一年,后来数据量上来,想扩容都难——单节点模式不支持滚动升级。

4.2 多节点集群——从单机到分布式的跨越

多节点配置,说白了就是告诉每个节点:“你不是一个人在战斗”。你需要至少两个节点,用 discovery.seed_hosts 互相发现。

我习惯把节点角色分开。表里整理了一下常见角色组合:

角色类型配置参数典型用途
Master 候选node.roles: [ master ]集群控制,建议 3 台奇数
数据节点node.roles: [ data ]存储和搜索数据,IO 密集型
Ingest 节点node.roles: [ ingest ]预处理管道,CPU 密集型
协调节点node.roles: []纯分发请求,不存数据

拿一个三节点集群举例。我在公司就是这么搭的:

节点 1(Master + Data 混合,中小规模推荐):

cluster.name: my-secrets-cluster
node.name: node-1
node.roles: [ master, data ]
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 192.168.1.11
http.port: 9200
discovery.seed_hosts: ["192.168.1.11:9300", "192.168.1.12:9300", "192.168.1.13:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
xpack.security.enabled: false

节点 2 和节点 3 只需要改 node.name 和 network.host 对应的 IP 就行。启动后,用 curl 查集群健康:

curl http://192.168.1.11:9200/_cluster/health?pretty

返回的 "number_of_nodes": 3 就对了。

⚠️ 重要: cluster.initial_master_nodes 只在第一次集群启动时用。如果你后续增加了节点,不要在配置里追加这个参数,否则会干扰选举。我以前吃过这个亏——集群重启后脑裂,导致大量数据丢失。

4.3 X-Pack 安全设置——给集群上锁

为什么要上 X-Pack?你想想看,ELK 采集的是 Secrets 审计日志,如果 Elasticsearch 裸奔,谁都能用 9200 端口删你的索引……那太可怕了。X-Pack 默认在 ES 8.x 里已经捆绑,你不需要额外安装插件,只需要开启并配置。

我个人习惯按这个顺序操作:

  1. 开启安全功能——在 elasticsearch.yml 加 xpack.security.enabled: true
  2. 自动生成密码——运行 ./bin/elasticsearch-setup-passwords auto,会生成 elastic、kibana_system 等用户的随机密码。别忘了保存!
  3. 配置 TLS——节点间通信加密,防止中间人攻击。

配置 TLS 的关键步骤:

# 生成 CA 证书
./bin/elasticsearch-certutil ca
# 生成节点证书
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 将证书放到 config 目录,并在 elasticsearch.yml 添加:
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

小技巧: 如果你在 Docker 里跑 ES,证书路径要用卷挂载。我习惯把证书放在 /etc/elasticsearch/certs,然后在 compose 文件里映射。这样重启容器也没问题。

全部配置好后,用 curl 访问就得加认证了:

curl -u elastic:your-password https://localhost:9200 -k

-k 是跳过自签名证书校验,生产环境请用 --cacert 指定 CA 证书。

4.4 验证集群安全状态

我一般会用两个命令快速验证:

  • curl -u elastic -X GET "https://localhost:9200/_cluster/health" —— 确认集群状态 green
  • curl -u elastic -X GET "https://localhost:9200/_cat/nodes?v" —— 列出所有节点

如果你发现某个节点没连上,先查日志 logs/elasticsearch.log,关键词 discovery 或 ssl。我遇到过两次 TLS 证书不匹配导致节点间握手失败,解决办法就是重新生成证书,确保每个节点的 node.name 和证书 CN 匹配。

生产环境推荐配置速查表:

配置项推荐值说明
discovery.seed_hosts3~5 个节点 IP:端口不要用 DNS 轮询,固定 IP
cluster.initial_master_nodes奇数个(3/5)仅首次启动使用
xpack.security.enabledtrue审计日志必须开启
xpack.security.transport.ssl.enabledtrue节点间加密
ES_JAVA_OPTS-Xms16g -Xmx16g堆大小不超过物理内存 50%

好了,到这里你的 Elasticsearch 集群已经具备了单节点快速验证的能力、多节点生产配置的经验,以及 X-Pack 安全防护。接下来你就可以放心地把 Logstash 和 Beats 连上来了。