MongoDB sharding迁移那些事(三)-阿里云开发者社区

开发者社区> 阿里云数据库> 正文
登录阅读全文

MongoDB sharding迁移那些事(三)

简介: 如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 sharding 迁移,会分3个部分来介绍,本文为第三部分 负载均衡及迁移策略 chunk 迁移流程 Balancer 运维管理 在前面2个部分里,介绍了 MongoDB sharding 的迁移策略以及 chunk 迁移的步骤,本文将主要介绍如何管理 Balancer,以更好的为业务服务。

如果不了解 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 工作。

use config
db.settings.update(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "02", stop : "06" } } },
   { upsert: true }
)

设置迁移选项

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

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

use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_secondaryThrottle" : true ,
              "writeConcern": { "w": "majority" } } },
   { upsert : true }
)

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

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

use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_waitForDelete" : true } },
   { upsert : true }
)

设置 chunkSize

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

如下命令将 chunkSize 修改为 100MB

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

注意事项

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

参考资料

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里云数据库
使用钉钉扫一扫加入圈子
+ 订阅

帮用户承担一切数据库风险,给您何止是安心!

官方博客
链接