MongoDB--特大块的问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值