1.1 特大快形成
如果用date字段作为片键,集合中date是一个日期字符串,如:year/month/day,也就是说,mongoDB一天创建一个块。因块内所有文档的片键一样,因此这些块是不可拆分的。如果块超出了config.settings中设置的最大块大小,那么均衡器就无法移动这个块了。
这种不可拆分和移动的块就叫做特大快,这种快相当难对付。
1.2 特大快的表现
出现特大快的表现之一是,某分片的大小增长速度要比其他分片快得多。也可使用sh.status()来检查
是否出现了特大快:特大快会存在一个jumbo属性。
可以使用dataSize命令检查块大小
1)首先用config.chunks集合,产看块范围
>use config
>var chunks= db.chunks.find({"ns":"acme.analytics"}).toArray()
2)根据这些块范围,找出可能的特大快
>use dbName
要小心,因为dataSize命令要扫描整个块的数据才知道块的大小。因此,要根据自己对数据了解,尽可能缩小
搜索范围:比如,特大快是特定日期出现的吗?如11月11日系统很繁忙。。。
1.3 分发特大快(修复特大快)
未修复由特大快引发的集群不均衡,就必须将特大快均衡的分发到其他分片上。
下面用from分片来代指特大快分片,以to分片来代指特大快即将迁至的分片。
注意:多个from分片,则需要对每个from分片重复下列步骤
1、关闭均衡器
>sh.setBalancerState(false)
2、MongoDB默认不允许移动大小超过最大快大小设定值的块。因此,需要调整最大快大小。单位MB
>use config
>db.setting.findOne({_id:chunksize})
>db.settings.save({"_id":"chunksize","value":10000})
3、使用moveChunk命令将特大快从from分片移至to分片
如担心迁移对性能影响,可使用secondaryThrootle选项,放慢迁移过程,减缓对系统性能影响
>db.adminCommand(
{"moveChunk":"acme.analytics",
"find":{"date":new Date("10/23/2012"},
"to":""shard0002,
"secondaryThrootle":true
}
)
4、使用splitChunk命令对from分片剩余的块进行拆分,这样可以增加from分片的块数,直到实现from分片
与其他分片块数均衡。
5、块大小修改回最初值
>db.settings.save({"_id":"chunksize","value":64})
6、启用均衡器
>sh.setBalancerState(true)
1.4 防止出现特大快
1、可修改片键、细化片键的粒度
2、尽可能保证每个文档都拥有唯一的片键值,或者至少不要出现某个片键值的数据超出最大块大小
设定值的情况
3、添加辅助字段作为片键