• MongoDB 分片管理(四)数据均衡 -- 特大快


    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、添加辅助字段作为片键

  • 相关阅读:
    layui flow loading占位图实现方法
    layui弹出层layer的area过大被遮挡
    layui 复选框checkbox 实现全选全选
    axios 设置headers token
    elementUI vue this.$confirm 和el-dialog 弹出框 移动
    vue + axios + formdata 上传文件带参数的爬坑之路
    Java四舍五入时保留指定小数位数
    List containsKey 和Map contains 判断集合中是否包含某个值
    BigDecimal 基本使用 比较大小和加减乘除
    springMVC返回json数据乱码问
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/11274123.html
Copyright © 2020-2023  润新知