MongoDB Sharding
关于 MongoDB sharding 的原理,如果不了解请先参考
注:本文的内容基于 mongoDB 3.2 版本。
Primary shard
使用 MongoDB sharding 后,数据会以 chunk 为单位(默认64MB)根据 shardKey
分散到后端1或多个 shard 上。
每个 database 会有一个 primary shard
,在数据库创建时分配
- database 下启用分片(即调用
shardCollection
命令)的集合,刚开始会生成一个[minKey, maxKey] 的 chunk,该 chunk 初始会存储在primary shard
上,然后随着数据的写入,不断的发生 chunk 分裂及迁移,整个过程如下图所示。 - database 下没有启用分片的集合,其所有数据都会存储到
primary shard
何时触发 chunk 分裂?
mongos 上有个 sharding.autoSplit
的配置项,可用于控制是否自动触发 chunk 分裂,默认是开启的。如无专业人士指导,强烈建议不要关闭 autoSplit,更好的方式是使用「预分片」的方式来提前分裂,后面会详细介绍。
mongoDB 的自动 chunk 分裂只会发生在 mongos 写入数据时,当写入的数据超过一定量时,就会触发 chunk 的分裂,具体规则如下。
int ChunkManager::getCurrentDesiredChunkSize() const {