MongoDB sharding迁移那些事(三)

如果不了解 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]之间。

参考资料

作者简介

张友东,阿里巴巴技术专家,主要关注分布式存储、Nosql数据库等技术领域,先后参与TFS(淘宝分布式文件系统)Redis云数据库等项目,目前主要从事MongoDB云数据库的研发工作,致力于让开发者用上最好的MongoDB云服务。

发表评论