1. 基础定义
- Chunk(块) :MongoDB分片集群中数据的逻辑存储单元,由一组连续的片键(Shard Key)范围数据组成,默认大小为64MB(可调整范围为1-1024MB)。
- 数据分布逻辑:分片集群通过记录Chunk与分片(Shard)的映射关系管理数据存储,而非直接跟踪每条数据的位置。
2. Chunk生命周期
-
初始状态
新分片的集合默认生成一个覆盖全片键范围(
[minKey, maxKey]
)的Chunk,存储在primary shard上。 -
**自动分裂(Splitting)**
- 触发条件 :当Chunk大小超过
chunkSize
(默认64MB)时,MongoDB自动将其拆分为更小的Chunk。 - 分裂规则 :
- 首次分裂时,若Chunk数≤3,分裂阈值为1MB;随着Chunk数量增加,阈值逐步升高至
chunkSize
3。 - 分裂后更新元数据至config server,并在mongos缓存中同步路由信息。
- 首次分裂时,若Chunk数≤3,分裂阈值为1MB;随着Chunk数量增加,阈值逐步升高至
- 触发条件 :当Chunk大小超过
-
手动分裂
通过splitAt()
或splitFind()
函数指定片键值强制拆分,适用于预分片(Pre-splitting)优化场景。
Chunk迁移与均衡
Balancer触发迁移:当分片间Chunk数量差异≥9时,Balancer自动迁移Chunk以实现负载均衡
迁移流程
- 从源分片复制Chunk数据到目标分片。
- 更新config server元数据及mongos路由缓存。
- 删除源分片上的旧Chunk数据
关键配置与管理
配置项 | 作用 | 示例命令/参数 | 来源 |
---|---|---|---|
shardCollection |
为集合启用分片 | sh.shardCollection("db.coll", {key:1}) |
|
chunkSize |
定义Chunk初始大小 | sh.setBalancerMaxChunkSize(128) |
|
sh.disableBalancer() |
临时关闭Balancer以维护 | sh.disableBalancer("db.coll") |
|
sh.status() |
查看Chunk分布及迁移状态 | sh.status() |