MongoDB Cluster 数据平衡优化

Posted xibuhaohao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB Cluster 数据平衡优化相关的知识,希望对你有一定的参考价值。

技术图片

 

如果不了解 MongoDB Sharded Cluster 原理,请先阅读

关于 sharding 迁移,会分3个部分来介绍,本文为第三部分

  1. 负载均衡及迁移策略
  2. chunk 迁移流程
  3. Balancer 运维管理

在前面2个部分里,介绍了 MongoDB sharding 的迁移策略以及 chunk 迁移的步骤,本文将主要介绍如何管理 Balancer,以更好的为业务服务。

关闭 Balancer

可能需要关闭 Balancer 场景包括

  • 对 Sharded cluster 进行备份时,需要先关闭 Balancer,避免备份出来 shard、config server 数据出现不一致。
  • 避免 chunk 迁移对线上服务造成影响

查看 Balancer 当前状态

sh.getBalancerState()

关闭 Balancer

sh.stopBalancer()

开启 Balancer

sh.startBalancer()

说明:本文中提到的命令,都是连接到 sharding cluster 的 mongos 上执行

针对某个集合关闭 Balancer

默认情况下,Balancer 会针对所有分片的集合做负载均衡,如果针对某些特殊集合,不想 Balancer 自动去迁移数据,可以仅针对该集合关闭。

针对 students.grades 集合关闭 Balancer

sh.disableBalancing("students.grades")

针对 students.grades 集合开启 Balancer

sh.enableBalancing("students.grades")

设置 Balancer 时间窗口

为了尽量避免 chunk 迁移影响业务,可以将 Balancer 设置为只在某个时间窗口内工作,避开业务高峰期,如下命令设置 Balancer 只在凌晨2:00 – 6:00 工作。

  1.  
    use config
  2.  
    db.settings.update(
  3.  
    { _id: "balancer" },
  4.  
    { $set: { activeWindow : { start : "02:00", stop : "06:00" } } },
  5.  
    { upsert: true }
  6.  
    )

设置迁移选项

moveChunk 允许用户自定义迁移数据时,数据写到目标上的安全级别 (自由的在可靠性和迁移效率间做选择),通过writeConcern 的方式来指定。

用户可以修改_secondaryThrottle 以及 writeConcern 参数,这2个参数需要组合起来使用,意思是如果_secondaryThrottle为 true,则使用 writeConcern 选项来指定迁移时写数据的策略;如果_secondaryThrottle为 false,则使用{w: 1}, 如下命令将 writeConcern 设置为 {w: majority}。

  1.  
    use config
  2.  
    db.settings.update(
  3.  
    { "_id" : "balancer" },
  4.  
    { $set : { "_secondaryThrottle" : true ,
  5.  
    "writeConcern": { "w": "majority" } } },
  6.  
    { upsert : true }
  7.  
    )

如果没有设置,则默认使用 {w: 2} ,要求至少写到目标2个节点(若目标 shard 是单节点,则退化为{w: 1})。

数据迁移完后,源 shard 需要将迁移完的 chunk 移除,默认情况下,源 shard 会将删除 chunk 的任务加到一个后台队列,在后台异步删除,然后 Balancer 就可以启动下一次的 chunk 迁移。用户可以设置 _waitForDelete 为 true(默认为 false),让源 shard 在 chunk 迁移完后同步删除 chunk 数据。

  1.  
    use config
  2.  
    db.settings.update(
  3.  
    { "_id" : "balancer" },
  4.  
    { $set : { "_waitForDelete" : true } },
  5.  
    { upsert : true }
  6.  
    )

设置 chunkSize

MognoDB sharding 默认 chunkSize 为64MB,默认设置在绝大多数场景都是合适的,在某些场景下,用户可能需要修改 chunkSize 配置,具体参考关于MongoDB Sharding,你应该知道的 文章里『关于jumbo chunk及 chunk size』部分,这里不再赘述。

如下命令将 chunkSize 修改为 100MB

  1.  
    use config
  2.  
    db.settings.save( { _id:"chunksize", value: 100 } )

注意事项

  1. 将 chunkSize 改小,后台需要一定时间来对原来 chunk 进行分裂,将大小降低至新 chunkSize 以下。(如果是jumbo chunk,则无法分裂)
  2. 将 chunkSize 改大,原来的小 chunk 不会自动进行合并,只有新的插入或更新操作才能导致 chunk 大小逐步增大。
  3. chunkSize 可修改的范围为[1MB, 1024MB]之间。

参考资料

转载自:https://blog.csdn.net/wangkai_123456/article/details/53353193

以上是关于MongoDB Cluster 数据平衡优化的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Sharding Cluster

MongoDB Sharding Cluster分片集群

MySQL Cluster 与 MongoDB 复制群集分片设计及原理

MySQL Cluster 与 MongoDB 复制群集分片设计及原理

MongoDB-复制集rs及sharding cluster

MongoDB——MongoDB分片集群(Sharded Cluster)