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 图展示了三节点集群的引导流程:

Elasticsearch 集群引导流程(三节点) node-master-1 192.168.1.10:9300 node-master-2 192.168.1.11:9300 node-master-3 192.168.1.12:9300 配置清单 discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300", "192.168.1.12:9300"] cluster.initial_master_nodes: ["node-master-1", "node-master-2", "node-master-3"]

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 图展示了健康检查的交互流程:

集群健康检查交互流程 客户端 / Kibana curl / Dev Tools Master 节点 _cluster/health 响应结果 green / yellow / red 健康状态判断逻辑 green = 所有主分片 + 副本分片已分配;yellow = 主分片已分配,副本未完全分配;red = 主分片未分配

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/explain API 查看具体原因,常见原因为磁盘空间不足或分片分配策略限制。
  • 脑裂问题: 确保 Master 候选节点为奇数,并配置 discovery.zen.minimum_master_nodes(7.x 之前版本)或使用 cluster.initial_master_nodes 正确引导。

通过以上配置和检查步骤,你可以快速搭建一个稳定、可扩展的 Elasticsearch 集群,为后续的日志采集与检索打下坚实基础。