← 返回题目列表

Elasticsearch 中 index、shard、replica 是什么?集群健康状态怎么判断?

高频 中等 第 14 / 30 题 更新于 2026/07/28
Elasticsearch索引分片副本集群

简化版

index 是逻辑上的文档集合,shard 是 index 被切分后的物理分片,replica 是主分片的副本。集群健康通常看 green、yellow、red:green 表示主分片和副本都正常,yellow 表示主分片正常但副本未完全分配,red 表示至少有主分片不可用。

详细版

Elasticsearch 是分布式搜索引擎,一个索引的数据不会只放在一个“大文件”里,而是拆成多个 shard 分布在不同节点上。

  • index:面向业务的逻辑索引,例如 orderslogs-2026.07.19
  • primary shard:主分片,负责承载数据写入,每个文档根据路由规则进入某个主分片。
  • replica shard:副本分片,用来提高可用性,也能分担读请求。
  • node:集群中的一台 Elasticsearch 进程实例。
  • cluster:多个节点组成的集群。

集群健康状态常见解释:

状态含义影响
green所有主分片和副本分片都已分配最健康
yellow所有主分片已分配,但至少一个副本未分配数据可查可写,但容灾不足
red至少一个主分片未分配部分数据不可用,必须排查

常见追问:

  • 单节点集群为什么经常 yellow?因为副本不能和对应主分片放在同一个节点,单节点无法分配副本。
  • shard 越多越好吗?不是。分片太多会增加集群状态、文件句柄、内存和查询协调成本。
  • replica 只是备份吗?不只是。它还可以承担读请求,提高搜索吞吐。

完整版教学

一、index 是逻辑概念,shard 是真正承载数据的单位

业务上我们通常说“建一个商品索引”:

PUT /products

但底层不会把所有商品都塞进一个不可拆分的结构里。Elasticsearch 会把 index 切成一个或多个 primary shard,每个 shard 都是一个 Lucene 索引。

所以关系是:

index
  ├─ primary shard 0
  ├─ primary shard 1
  └─ primary shard 2

分片带来的好处是:

  • 数据量大时可以横向分布到多个节点;
  • 查询可以并行打到多个分片;
  • 节点扩容后可以迁移部分分片实现负载均衡。

二、文档如何进入某个分片

Elasticsearch 会根据路由值决定文档落到哪个主分片。默认路由值通常是文档 _id,简化公式可以理解为:

shard = hash(routing) % number_of_primary_shards

这也解释了为什么主分片数量在索引创建后通常不能随便改:如果主分片数量变了,同一个文档 id 的路由结果可能完全不同,历史数据位置就乱了。

实际设计时要提前估算:

  • 单个索引的数据规模;
  • 未来增长速度;
  • 查询并发;
  • 单分片大小;
  • 节点数量和磁盘规划。

三、replica 的两个作用:高可用和读扩展

副本分片保存主分片的数据副本。主分片所在节点故障时,某个副本可以提升为新的主分片,保证数据继续可用。

例如一个索引有 2 个主分片、1 份副本:

nodeA: primary-0, replica-1
nodeB: primary-1, replica-0

如果 nodeA 挂了,nodeB 上的 replica-0 可以被提升为 primary-0。同时,搜索请求也可以打到主分片或副本分片,因此副本还能提高读吞吐。

副本不能替代备份。副本解决节点故障下的高可用,误删除、误更新、逻辑污染仍然需要快照备份来恢复。

四、green、yellow、red 应该怎么排查

健康状态不要只看颜色,还要看原因。

常见排查命令:

GET /_cluster/health
GET /_cat/shards?v
GET /_cluster/allocation/explain

判断思路:

  1. red:先确认哪些主分片未分配,是否节点丢失、磁盘满、索引损坏、分配规则限制。
  2. yellow:看副本为何未分配,单节点集群、副本数过高、磁盘水位线、节点角色不匹配都可能导致。
  3. green 但慢:颜色只代表分片分配状态,不代表查询一定快,还要看 CPU、JVM、磁盘 IO、慢查询和线程池。

五、分片数量设计的常见坑

分片不是越多越快。每个 shard 都有固定管理开销,分片太多会带来:

  • cluster state 变大;
  • 查询需要协调更多 shard;
  • segment、文件句柄、缓存占用增加;
  • recovery 和 relocation 更慢。

但分片太少也有问题:单分片过大时迁移慢、恢复慢、单节点压力集中。生产环境通常结合数据量、保留周期和查询压力来设计,时间序列数据常配合 data stream、rollover 和 ILM 控制单个 backing index 的大小。

六、常见误区与追问

判断点正确理解常见风险
primary shard数据路由和写入的主承载单元创建后数量通常不应随意改
replica shard高可用和读扩展不能和对应 primary 放同一节点
yellow主分片可用,副本未完全分配单节点或副本数过高很常见
red至少有主分片不可用部分数据不可读写,要优先处理
3 个 primary,1 个 replica
理论 shard 总数 = 3 * (1 + 1) = 6
如果只有 1 个节点,副本无法分配,集群通常是 yellow。

易错点:green/yellow/red 只说明分片分配健康,不等于查询性能、写入吞吐和磁盘水位都健康。

如果一个日志索引每天 600GB,设置 12 个 primary,则单主分片大约 50GB;如果只设 1 个 primary,单分片会膨胀到 600GB,后续迁移和恢复都会非常重。反过来,如果每天只有 5GB 却建 50 个 primary,元数据和小分片管理成本会超过收益。

  • 误区:shard 越多查询越快。 shard 越多,协调、调度、segment、文件句柄和 cluster state 成本越高,小数据量过度分片反而更慢。
  • 误区:replica 就等于备份。 replica 会同步错误写入和删除,能抗节点故障,不能替代快照备份。
  • 误区:yellow 一定是严重故障。 单节点开发环境配置 1 个副本时常见 yellow,生产要结合副本策略、节点数和分配解释判断。
  • 追问:为什么主分片数量创建后不宜改? 默认路由近似 hash(routing) % primary_count,主分片数变化会影响文档归属,需要 shrink、split 或重建索引等专门方案。
  • 追问:副本能提升写入性能吗? 通常不能,写入需要主分片处理并复制到副本,副本主要提升读吞吐和可用性。
  • 追问:red 状态优先看什么? 先定位未分配 primary shard,再查节点丢失、磁盘水位、allocation 规则、索引损坏或快照恢复情况。

七、加强记忆

记住“index 是业务入口,shard 是数据切片,replica 是容灾和读扩展”。green/yellow/red 的核心判断只看分片分配:主副本都好是 green,主好副本缺是 yellow,主分片缺就是 red。