4. Elasticsearch 集群搭建:节点角色划分与健康检查
在生产环境中,Elasticsearch 集群的稳定性和性能高度依赖于合理的节点角色划分。本章将详细讲解 Master、Data、Ingest 三种核心角色的职责与配置方法,并演示如何通过 discovery.seed_hosts 和 cluster.initial_master_nodes 完成集群引导,最后通过 API 验证集群健康状态。
4.1 节点角色划分:Master / Data / Ingest
Elasticsearch 节点可以承担一个或多个角色。合理的角色分离可以避免单点故障,提升集群的吞吐能力和容错性。下表列出了三种核心角色的职责与典型配置场景:
| 角色 | 职责描述 | 关键配置项 | 生产建议 |
|---|---|---|---|
| Master | 负责集群元数据管理、索引创建/删除、节点加入/离开等全局操作。只有 Master 节点可以执行集群状态变更。 | node.roles: [ master ] |
至少 3 个专用 Master 节点(奇数),避免脑裂。 |
| Data | 负责存储索引分片数据、执行文档的增删改查以及聚合操作。集群的读写性能主要取决于 Data 节点。 | node.roles: [ data ] |
根据数据量和查询 QPS 水平扩展,建议使用 SSD 磁盘。 |
| Ingest | 负责在数据写入前执行预处理管道(Pipeline),如字段提取、数据转换、格式校验等。 | node.roles: [ ingest ] |
如果日志解析量大,建议独立部署 Ingest 节点,避免占用 Data 节点资源。 |
角色组合说明: 在小规模集群(少于 10 个节点)中,可以将 Master 和 Data 角色合并,但必须保证 Master 候选节点为奇数。Ingest 角色通常独立部署在 Logstash 或 Beats 之后,作为数据清洗的缓冲层。
以下是一个 7 节点集群的角色分配示例:
- 节点 1-3: 专用 Master 节点(
node.roles: [ master ]) - 节点 4-6: 专用 Data 节点(
node.roles: [ data ]) - 节点 7: 专用 Ingest 节点(
node.roles: [ ingest ])
4.2 集群引导配置:discovery.seed_hosts 与 cluster.initial_master_nodes
Elasticsearch 集群的首次启动需要完成“引导(Bootstrap)”过程。两个核心配置项决定了节点如何发现彼此以及如何选举出第一个 Master 节点。
4.2.1 discovery.seed_hosts
该配置用于指定集群中其他候选节点的地址列表。节点启动后会通过此列表尝试连接,从而加入集群。支持 IP 地址、主机名或 DNS 记录。
# elasticsearch.yml 配置示例
discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11:9300
- 192.168.1.12:9300
4.2.2 cluster.initial_master_nodes
该配置仅在集群首次启动时使用,用于指定一组具备 Master 资格的节点,这些节点将参与第一次选举。一旦集群形成,该配置可以移除或注释掉。
# elasticsearch.yml 配置示例(仅在首次启动时生效)
cluster.initial_master_nodes:
- node-master-1
- node-master-2
- node-master-3
重要:
cluster.initial_master_nodes 必须使用节点的 node.name 值,而不是 IP 地址或主机名。如果配置错误,集群将无法完成引导,节点会一直处于等待状态。
以下 SVG 图展示了三节点集群的引导流程:
4.3 集群健康状态检查
集群启动后,可以通过 Elasticsearch 提供的 Cluster Health API 快速验证集群状态。健康状态分为三种:
| 状态 | 颜色 | 含义 | 处理建议 |
|---|---|---|---|
| 绿色 | green | 所有主分片和副本分片均处于正常分配状态。 | 集群运行正常,无需干预。 |
| 黄色 | yellow | 所有主分片已分配,但部分副本分片未分配(通常因副本数大于 Data 节点数)。 | 检查 Data 节点数量或调整副本数。 |
| 红色 | red | 至少一个主分片未分配,数据存在丢失风险。 | 立即检查节点状态、磁盘空间和分片分配策略。 |
执行健康检查的命令如下:
# 使用 curl 调用 Cluster Health API
curl -X GET "http://localhost:9200/_cluster/health?pretty"
# 返回示例(绿色状态)
{
"cluster_name" : "my-elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 2,
"active_primary_shards" : 10,
"active_shards" : 20,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
快速诊断技巧: 如果集群状态为黄色,可以执行
curl -X GET "http://localhost:9200/_cat/shards?v" 查看未分配的分片详情。如果为红色,使用 curl -X GET "http://localhost:9200/_cluster/allocation/explain?pretty" 获取未分配原因。
以下 SVG 图展示了健康检查的交互流程:
4.4 实战配置示例:三节点集群
以下是一个三节点集群的完整配置示例,每个节点承担 Master + Data 双角色(适用于小规模生产环境):
# 节点 1:node-1(elasticsearch.yml)
cluster.name: elk-production
node.name: node-1
node.roles: [ master, data ]
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.1.10
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.1.11:9300", "192.168.1.12:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 节点 2:node-2(elasticsearch.yml)
cluster.name: elk-production
node.name: node-2
node.roles: [ master, data ]
network.host: 192.168.1.11
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.12:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 节点 3:node-3(elasticsearch.yml)
cluster.name: elk-production
node.name: node-3
node.roles: [ master, data ]
network.host: 192.168.1.12
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
启动顺序: 建议先启动
cluster.initial_master_nodes 中列出的节点,等待它们选举出 Master 后,再启动其他 Data 或 Ingest 节点。首次启动后,可以注释掉 cluster.initial_master_nodes 配置,避免后续节点重启时引发冲突。
4.5 常见问题与排错
- 节点无法加入集群: 检查
discovery.seed_hosts中的端口是否为transport.port(默认 9300),而不是http.port(9200)。 - 集群一直处于等待状态: 确认
cluster.initial_master_nodes中的名称与node.name完全一致,且所有 Master 候选节点已启动。 - 健康状态为红色: 使用
_cluster/allocation/explainAPI 查看具体原因,常见原因为磁盘空间不足或分片分配策略限制。 - 脑裂问题: 确保 Master 候选节点为奇数,并配置
discovery.zen.minimum_master_nodes(7.x 之前版本)或使用cluster.initial_master_nodes正确引导。
通过以上配置和检查步骤,你可以快速搭建一个稳定、可扩展的 Elasticsearch 集群,为后续的日志采集与检索打下坚实基础。