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 个。
高可用设计的基本约束
把上述机制放在一起,可以归纳出几条硬约束,它们直接决定集群能否在故障中存活:
- master 候选节点必须为奇数且不少于 3 个。2 个 master 的法定人数是 2,任意一个故障就无法选主;4 个 master 的法定人数是 3,虽然能容忍 1 个故障,但多一个节点只增加成本不增加容错,因此推荐 3 或 5。
- 副本数至少为 1,且数据节点数要足够。如果只有 1 个数据节点,副本无处分配,集群只能停留在 yellow;要容忍 1 个数据节点故障,至少需要 2 个数据节点,且副本数 ≥ 1。
- 主分片数决定扩展上限。主分片数应结合数据量、节点数和未来增长来规划。分片过少无法充分利用多节点,分片过多则增加集群状态和查询协调开销。
- 故障域要分散。主副本应分布在不同机架或可用区,避免单点故障同时带走主副本。可通过
cluster.routing.allocation.awareness.attributes配置机架感知。 - 避免脑裂。通过
discovery.seed_hosts和cluster.initial_master_nodes正确配置发现与初始选主,并确保 master 候选节点之间网络稳定、时钟同步。
理解这些基础后,后续的容量规划、故障演练和参数调优才有依据。高可用不是靠某一个配置项实现的,而是节点角色划分、分片副本布局、选主机制和故障域设计共同作用的结果。