如果不了解 MongoDB Sharded Cluster 原理,请先阅读
关于 sharding 迁移,会分3个部分来介绍,本文为第三部分
- 负载均衡及迁移策略
- chunk 迁移流程
- 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 } )
注意事项
- 将 chunkSize 改小,后台需要一定时间来对原来 chunk 进行分裂,将大小降低至新 chunkSize 以下。(如果是 jumbo chunk,则无法分裂)
- 将 chunkSize 改大,原来的小 chunk 不会自动进行合并,只有新的插入或更新操作才能导致 chunk 大小逐步增大。
- chunkSize 可修改的范围为[1MB, 1024MB]之间。