连载中 3/20

核心概念:Index、Document、Shard 与 Replica

2026-08-11 · 1305 阅读 · 0 评论 · 0 赞

先用一张映射表安顿下来

从 MySQL 世界过来的开发者,先拿映射表对号入座,能省一半的懵:

MySQLElasticsearch备注
数据库 Database集群 Cluster对齐粒度不同,大致对应
表 Table索引 Index注意:不是 MySQL 的「索引」
行 Row文档 DocumentJSON 格式
列 Column字段 Field每个字段自带正排+倒排
表结构 Schema映射 Mapping定义字段类型与分词器
分区 Partition分片 Shard水平切分,分布式的基础

最容易混的是 Index:在 MySQL 里它是 B+ 树结构,在 ES 里它是一张「表」。本系列说的 Index 一律指后者。

Document:一份 JSON 的自我修养

文档就是一个 JSON 对象,写进索引时会带上几个系统元数据:_id(文档唯一标识,可自定可生成)、_source(原始 JSON 的完整保存,查询时默认原样返回,update 和 reindex 也靠它)、_routing(路由值,决定文档落在哪个分片,默认取 _id)。老王的商品文档长这样:

POST /product/_doc/10086
{
  "name": "燕麦拿铁(大杯)",
  "category": "咖啡",
  "price": 32.0,
  "tags": ["燕麦", "新品"],
  "stock": 200
}

Shard:把一张表拆到多台机器

单机装不下、扛不住时就要水平切分。ES 的 Index 由多个主分片(Primary Shard)组成,每个主分片本质上是一个独立完整的 Lucene 实例——还记得第 2 篇的 FST 和倒排表吗?它们都活在分片里。三个分片的索引,一次查询会被拆成三个子查询并行打出去,再把结果归并——这就是 ES 天生并行的来源。

关键规则:主分片数量在建索引时确定,之后不能改。为什么改不了?看路由公式:

shard = hash(routing) % number_of_primary_shards

文档去哪个分片由这个公式决定,分片数一变,所有已有文档的位置计算全部作废——文档找不到了。想改分片数只有两条路:reindex 到新索引,或用 split API 按倍数拆分。所以分片规划要在建索引前想清楚(第 14 篇专题)。

Replica:备份与读扩展一肩挑

副本分片(Replica Shard)是主分片的拷贝,两个职责:主分片所在节点挂掉时顶上(高可用),以及分担读请求(读扩展)。两条硬规则:

  • 主副不可同节点:副本绝不分配到它的主分片所在的节点——否则节点一挂主副全灭,备份失去意义;
  • 副本数可随时改:和主分片数不同,副本数不参与路由公式,大促前临时加副本扩读能力,过完再减回来,都是合法操作。

单节点集群可以建副本数,但副本无处安放,集群健康就是黄色——注意这个信号别当成故障瞎折腾。

集群健康的三色灯

颜色含义动作
green主分片、副本分片全部就位安心喝咖啡
yellow主分片全在,部分副本没地方放查节点数是否小于副本数
red有主分片丢失,数据不可写不可查立即排查,这是真故障

小结

概念地图一句话:文档进索引,索引拆分片,分片带副本,主副不同居。主分片数定死路由,副本数弹性伸缩,三色灯红黄绿分清轻重。世界观立好了,下一篇解决中文搜索的生死劫:分词器——标准分词器为什么把「燕麦拿铁」切成单字,IK 分词器怎么用

503

10 年全栈工程师 · 503咖啡馆主理人

#Elasticsearch#分片#副本#索引#核心概念

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 3 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞