MongoDB分片集群仅生成一个Chunk及数据大小异常求助
MongoDB分片集合未拆分问题排查方案
分片键分布异常
你用userId:1作为分片键,如果这个字段基数极低(比如大量文档共用同一个userId,或者分布极端集中),MongoDB不会自动拆分chunk。
检查方式:- 执行
db.Collection.distinct("userId").length查看userId的唯一值数量 - 执行
db.Collection.aggregate([{$group:{_id:"$userId", count:{$sum:1}}}, {$sort:{count:-1}}])查看userId的文档分布情况
- 执行
Chunk大小阈值未触发
MongoDB默认chunk大小是64MB,当前你的chunk只有10.07MiB,远低于拆分阈值,不会自动触发拆分。
处理方式:- 若业务需要更小的拆分阈值,可执行
sh.setChunkSizeMB(10)调整(最小1MB,过小会增加路由压力,谨慎操作) - 调整后可通过写入新数据或手动拆分触发分片
- 若业务需要更小的拆分阈值,可执行
数据归属与集合一致性问题
show dbs的大小是所有shard的总数据量,但当前仅shard2有数据,需确认:- 是否存在其他shard上有未被分片路由识别的同名集合:直接连接每个shard的mongod实例,执行
use database; db.Collection.stats()核对数据 - 确认Parse框架使用的集合与你分片的集合完全一致(MongoDB集合名区分大小写,注意拼写)
- 是否存在其他shard上有未被分片路由识别的同名集合:直接连接每个shard的mongod实例,执行
分片元数据异常
即便执行了flushRouterConfig,元数据仍可能存在异常:- 执行
sh.status()确认database.Collection已被标记为分片集合 - 执行
config.chunks.find({ns:"database.Collection"})查看chunk元数据,确认是否仅存在一条记录且范围覆盖所有数据 - 若元数据异常,备份数据后尝试重新分片:先执行
sh.disableSharding("database"),再重新执行sh.enableSharding("database")和sh.shardCollection("database.Collection", {"userId": 1})
- 执行
手动拆分验证
若自动拆分未触发,可手动拆分chunk验证:- 先查询当前chunk范围:
config.chunks.findOne({ns:"database.Collection"}),获取min和max值 - 执行
sh.splitAt("database.Collection", {userId: <中间值>})(选一个在min和max之间的userId值),之后再用db.Collection.getShardDistribution()查看拆分结果
- 先查询当前chunk范围:
内容的提问来源于stack exchange,提问作者poroster8
相关产品推荐
相关产品推荐

