2. Elastic集群架构与高可用基础

单机版 Elasticsearch 只能算一个“能用的搜索引擎”,而生产环境真正依赖的是由多个节点组成的集群。集群的价值不只是把数据分散到多台机器上,更在于当某台机器、某块磁盘甚至某个机架出现故障时,搜索和写入仍能继续。要理解这一点,必须先弄清楚四个基础概念:节点角色、分片与副本、集群状态,以及节点之间如何发现彼此并选出主节点。

节点角色:谁负责什么

Elasticsearch 节点可以承担多种角色,角色决定了该节点参与哪些集群级工作。常见角色包括:

  • master:负责集群级管理,如创建/删除索引、跟踪节点加入离开、分配分片。它不负责存储业务数据,也不处理搜索请求。
  • data:存储分片并执行数据相关的读写、搜索、聚合。可细分为 data_hot、data_warm、data_cold、data_frozen 等层级,用于冷热分层。
  • ingest:在写入前执行预处理管道(pipeline),如字段解析、富化、转换。
  • coordinating(仅协调):不承担 master、data、ingest 角色,只负责接收请求、分发到相关分片、合并结果返回。
  • ml / transform / remote_cluster_client:分别用于机器学习、转换任务和跨集群检索。

生产集群通常不会让一个节点“什么角色都干”。专用 master 节点只做集群管理,专用 data 节点只存数据,协调节点单独承担请求分发,这样可以避免数据节点负载过高时影响选主和集群状态更新。一个常见的角色划分示例是:3 台专用 master(满足法定人数)、若干 data_hot、若干 data_warm,再加 2 台 coordinating 节点对外提供服务。

分片与副本:数据如何分布与容错

索引在创建时会被切分为若干个主分片(primary shard),每个主分片是一个独立的 Lucene 索引。主分片数量在索引创建后不可更改(除非 reindex 或 split),因此它决定了索引能横向扩展到多少个数据节点上。每个主分片可以有零个或多个副本分片(replica shard),副本是主分片的完整拷贝,既能承担读请求,也能在主分片所在节点故障时被提升为新的主分片。

分片分配遵循两条硬约束:同一分片的主副本不能落在同一个节点上;同一分片的主副本应尽量分散到不同故障域(如不同机架、不同可用区)。因此,一个索引的可用性取决于:主分片数、副本数、数据节点数量以及故障域分布。举例来说,索引设置为 3 个主分片、1 个副本,那么总共需要 6 个分片副本;如果只有 2 个数据节点,集群无法为所有副本找到合适位置,集群状态会停留在 yellow。

副本数可以在索引创建后动态调整,例如把 number_of_replicas 从 1 调到 2,Elasticsearch 会自动复制分片;但主分片数不能直接改,只能通过 reindex、split 或 shrink 等操作调整。

集群状态:green、yellow、red 的含义

集群健康状态是判断高可用是否达标的直接指标:

  • green:所有主分片和副本分片都已分配。
  • yellow:所有主分片已分配,但至少有一个副本未分配。此时数据可读写,但容错能力下降。
  • red:至少有一个主分片未分配,部分数据不可用,搜索和写入可能失败。

需要强调的是,yellow 并不等于“集群坏了”,它往往意味着副本暂时无处安放,例如节点数不足、磁盘水位过高或分配规则限制。运维中更应关注“yellow 持续多久”以及“是否有主分片未分配”,而不是一看到 yellow 就盲目重启节点。

发现与选主:集群如何形成一致决策

节点启动后并不知道集群里还有谁,它通过发现机制(discovery)找到其他节点。常见配置是 discovery.seed_hosts 提供一组种子节点地址,节点启动时向这些地址发起连接,交换集群信息。首次启动的集群还需要 cluster.initial_master_nodes 指定初始 master 候选节点,用于完成第一次选主。

选主过程基于类 Raft 的共识算法:候选节点向其他 master 候选节点请求投票,获得法定人数(quorum)以上投票才能成为主节点。法定人数为 master_eligible_nodes / 2 + 1。例如 3 个专用 master 节点,法定人数为 2;如果只部署 2 个 master 节点,法定人数也是 2,任意一个故障就会导致无法选出主节点,集群进入不可管理状态。因此专用 master 节点数量通常取奇数:3、5、7,且不超过 7 个。

Elasticsearch 集群:节点角色、分片副本与选主关系 专用 Master 节点(3 台) M1 M2 M3 法定人数 = 3/2+1 = 2 负责:集群状态、索引元数据、分片分配 Data 节点(示例 3 台) D1 D2 D3 存储主分片与副本分片 执行读写、搜索、聚合 Coordinating 节点 C1 C2 接收请求、分发分片、合并结果 不存数据、不参与选主 分配 返回 索引示例:3 主分片 + 1 副本(共 6 个分片副本) P0 D1 P1 D2 P2 D3 R0 D2 R1 D3 R2 D1 集群健康状态与容错判断 green:主副本全部分配,可容忍 1 个数据节点故障 yellow:主分片已分配,副本缺失,容错能力下降 red:主分片未分配,部分数据不可用 选主失败:master 候选节点不足法定人数

高可用设计的基本约束

把上述机制放在一起,可以归纳出几条硬约束,它们直接决定集群能否在故障中存活:

  1. master 候选节点必须为奇数且不少于 3 个。2 个 master 的法定人数是 2,任意一个故障就无法选主;4 个 master 的法定人数是 3,虽然能容忍 1 个故障,但多一个节点只增加成本不增加容错,因此推荐 3 或 5。
  2. 副本数至少为 1,且数据节点数要足够。如果只有 1 个数据节点,副本无处分配,集群只能停留在 yellow;要容忍 1 个数据节点故障,至少需要 2 个数据节点,且副本数 ≥ 1。
  3. 主分片数决定扩展上限。主分片数应结合数据量、节点数和未来增长来规划。分片过少无法充分利用多节点,分片过多则增加集群状态和查询协调开销。
  4. 故障域要分散。主副本应分布在不同机架或可用区,避免单点故障同时带走主副本。可通过 cluster.routing.allocation.awareness.attributes 配置机架感知。
  5. 避免脑裂。通过 discovery.seed_hosts 和 cluster.initial_master_nodes 正确配置发现与初始选主,并确保 master 候选节点之间网络稳定、时钟同步。
一个常见误区是“节点越多越可靠”。如果 master 候选节点过多(如 10 个),选主和集群状态同步的开销会显著增加,反而降低稳定性。专用 master 节点建议控制在 3~5 个,最多不超过 7 个。

理解这些基础后,后续的容量规划、故障演练和参数调优才有依据。高可用不是靠某一个配置项实现的,而是节点角色划分、分片副本布局、选主机制和故障域设计共同作用的结果。