ElasticSearch中的分片是什么
一、 Fox版标准面试回答(建议背诵)
面试官: 请解释一下 Elasticsearch 中的分片(Shard)是什么?
Fox版回答: “一句话定义:分片(Shard)是 Elasticsearch 实现分布式存储和横向扩展(Scale-out)的最小工作单元。
但我对它的理解,通常会从逻辑和物理两个维度来向别人解释:
- 从逻辑视角看(为什么需要它): 一个索引(Index)的数据量可能非常大(比如 1TB),单个节点的硬盘可能存不下,或者单个节点的处理能力(CPU/内存)不足以支撑高并发。 分片的作用就是把这个大索引‘切’成多份,散落在集群的多个节点上。这样不仅解决了存储瓶颈,还能利用多节点的资源进行并行计算,提升查询效率。
- 从物理视角看(它到底是什么): 这是一个非常硬核的点:每一个分片,本质上就是一个独立的、功能完整的 Apache Lucene 索引。 这意味着每个分片都有自己独立的倒排索引、文件系统缓存和处理能力。我们在 ES 层面看到的一个 Index,实际上是由底层多个 Lucene Index(即分片)组合而成的逻辑概念。
所以,分片是 ES 能够处理海量数据、实现高可用和高性能的物理基础。”
二、 进阶解析(防止面试官深挖)
如果面试官追问: “那主分片和副本分片有什么区别?为什么主分片数量创建后不能改?”
Fox版进阶解析: “这涉及到了 ES 的分片模型和路由原理。
1. 关于分片的类型(Primary vs Replica): ES 的分片分为两种,职责非常明确:
主分片(Primary Shard):
它是数据的‘源头’。所有的新增、修改、删除操作(Write)必须先在主分片上完成。
关键点: 主分片的数量在创建索引时必须指定,且创建后不能修改(除非重建索引 Reindex)。
副本分片(Replica Shard):
它是主分片的‘完整拷贝’。
核心作用:
- 高可用(HA): 如果主分片挂了,副本会立马晋升为主分片,防止数据丢失。
- 读写分离(提升吞吐): 副本分片可以承担搜索(Read)请求。并发量大时,只需增加副本数即可。
2. 关于‘为什么主分片不能改’(路由公式): 这是一个经典的架构设计权衡。ES 在保存文档时,需要知道这个文档该存在哪个分片上,它用的是下面这个路由公式:
shard = hash(routing) % number_of_primary_shards
routing:默认是文档 ID。number_of_primary_shards:主分片数量。
结论: 如果索引创建后,我们将主分片数量从 5 改为 10,那么取模运算的结果就全变了。到时候 ES 去找数据时,会去错误的分片寻找,导致之前的文档全部‘失联’。这就是主分片不可变的最底层原因。”
三、 总结
“简单来说,分片就是 ES 的‘细胞’。 主分片决定了索引的存储容量上限(也受限于路由算法,不可变),而副本分片决定了索引的吞吐能力和可用性(可动态扩展)。 在生产环境中,规划分片是一门艺术,通常建议单个分片大小控制在 30GB-50GB 之间,过大影响恢复速度,过小会导致元数据(Cluster State)管理压力过大。”