通过动态交互演示,彻底理解 Shard 和 Replica 的运作机制
点击卡片展开详细说明
索引数据的「物理子集」。一个索引被水平切成多块,每块就是一个主分片。
主分片的完整拷贝,用冗余换可靠性和读性能。
运行 ES 实例的服务器。分片的物理载体。
一群主分片 + 副本分片的逻辑集合。
可视化展示分片在节点间的分布,支持交互操作
从客户端发出请求,到数据安全存储在磁盘的全过程
ES 使用轮询策略,主分片和副本分片都可以响应读请求
ES 通过一致性哈希决定每个文档落在哪个分片,输入 ID 试试看
公式:
shard = hash(_routing) % number_of_primary_shards
默认 _routing = _id。这就是为什么「主分片数量创建后不可更改」—— 改了之后 hash 结果完全不同!
副本的核心价值:用空间换可靠性
某个只有副本分片的节点宕机 → 集群变 YELLOW → ES 在其它节点重建副本 → 恢复 GREEN
存有主分片的节点宕机 → ES 立刻将对应副本提升为主分片 → 在新节点重建副本 → 恢复 GREEN
| 维度 | 主分片 (Primary) | 副本分片 (Replica) |
|---|---|---|
| 本质 | 数据的原始物理分区 | 主分片的完整拷贝 |
| 数量 | 创建时确定,不可改 | 可动态增减 |
| 写入 | 唯一写入入口 | 从主分片接收数据 |
| 读取 | 可读 ✅ | 可读 ✅(分担压力) |
| 与主分片位置 | — | 绝不能和对应主分片同节点 |
| 故障时 | 对应副本提升为主 | 在其它节点重建 |
| 影响性能 | 分片越多,写入越慢 | 副本越多,写入越慢(等待更多 ACK),但读取越快 |
| 公式关系 | 总数据量 = 主分片数 × 每个主分片数据量 总存储量 = 主分片数 × (1 + 副本数) × 每个主分片数据量 |
|
分片解决的是 「存不下」的问题(水平扩展),
副本解决的是 「靠不住」的问题(高可用 + 读吞吐)。
两者配合,让 ES 既能存 PB 级数据,又能在节点宕机时自动恢复、无感知对外服务。