4. Elasticsearch 集群搭建:单节点与多节点配置,安全设置(X-Pack)
好,咱们进入实战环节。搭建 Elasticsearch 集群,这一步如果地基没打好,后面 Logstash 和 Kibana 再好看也白搭。我见过不少团队,日志一多,单节点直接 OOM,或者节点间通信用了默认配置,结果数据丢了都不知道。
这一章我会把单节点、多节点、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 里已经捆绑,你不需要额外安装插件,只需要开启并配置。
我个人习惯按这个顺序操作:
- 开启安全功能——在
elasticsearch.yml加xpack.security.enabled: true - 自动生成密码——运行
./bin/elasticsearch-setup-passwords auto,会生成 elastic、kibana_system 等用户的随机密码。别忘了保存! - 配置 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"—— 确认集群状态 greencurl -u elastic -X GET "https://localhost:9200/_cat/nodes?v"—— 列出所有节点
如果你发现某个节点没连上,先查日志 logs/elasticsearch.log,关键词 discovery 或 ssl。我遇到过两次 TLS 证书不匹配导致节点间握手失败,解决办法就是重新生成证书,确保每个节点的 node.name 和证书 CN 匹配。
生产环境推荐配置速查表:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
discovery.seed_hosts | 3~5 个节点 IP:端口 | 不要用 DNS 轮询,固定 IP |
cluster.initial_master_nodes | 奇数个(3/5) | 仅首次启动使用 |
xpack.security.enabled | true | 审计日志必须开启 |
xpack.security.transport.ssl.enabled | true | 节点间加密 |
ES_JAVA_OPTS | -Xms16g -Xmx16g | 堆大小不超过物理内存 50% |
好了,到这里你的 Elasticsearch 集群已经具备了单节点快速验证的能力、多节点生产配置的经验,以及 X-Pack 安全防护。接下来你就可以放心地把 Logstash 和 Beats 连上来了。