MongoDB–特大块的问题
文章目录
一. 关于特大块
因为相同片键值的文档都处于同一个块中,因此这个块是不可以拆分的。如果块大小超过了config.settings中设置的最大块大小,那么均衡器就无法移动这个块了,这种不可以拆分和移动的块就叫做特大块。
>sh.status() //有jumbo字段的就是特大块
可以使用dataSize命令查看块的大小
//首先在config.chunks集合查看块范围
>use config
>var chunks=db.chunks.find("ns":"acme.analytics").toArray()
>use dbName
>db.runCommand({"dataSize":"dbName.collName","keyPattern":{"date":1},"min":chunks[0].min,"max":chunk[0].max})
二. 特大块的分发
1)关闭均衡器
>sh.setBalancerState(false)
2)调高chunkSize
因为mongoDB不允许移动大小超过最大块大小设置值的块,所以需要临时调高最大块大小的设置值。
>use config
>db.settings.save({"_id":"chunksize","value":10000})
3)使用moveChunk手动迁移块
//Sh.moveChunk({“test.collecton”,{query},”shard_1”}),参数1:集合,参数2:查询条件,参数3:移动到那个分片
>sh.moveChunk("testdb.users.chunks",{"user_id":NumberLog("28179147024124")},"shard2","secondaryThrottle":true)
或者
>db.adminCommand({"moveChunk":"testdb.users.chunks",
"find":{"user_id":NumberLog("28179147024124")}
"to":"shard2"})
secondaryThrottle强制要求迁移过程中间隙进行。
4)使用splitAt将剩余的块切分的更小
切分之后块的个数更多,便于均衡
5)将块大小修改了最初的值
>use config
>db.settings.save({"_id":"chunksize","value":64})
6)启用均衡器
>sh.setBalancerState(true)
三. 防止出现特大块
选择片键的时候可以细化片键的粒度,例如以时间为片键的时候可以精确到秒。还可以采用复合片键,片键的第二个字段选择粒度比较细的字段,例如MD5和UUID