前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB之balancer(2)

MongoDB之balancer(2)

作者头像
AsiaYe
发布2021-02-07 15:48:09
4280
发布2021-02-07 15:48:09
举报
文章被收录于专栏:DBA随笔DBA随笔

01

针对指定集合的数据块搬迁

有的时候,我们会遇到这样一种场景,例如某个集合的数据,我们就想让它存在于一个数据分片上,不让分片集群对它的数据进行搬迁,这种情况下,就可以针对单个集合做balancer的定制,常见的场景有:数据分析场景、数据备份场景等。

而另外一些场景下,我们可能需要打开某个集合的balancer,例如在上述场景结束后,可能需要针对某个集合重新打开搬迁,上面两种场景中,禁止和开启集合balancer的方法如下:

代码语言:javascript
复制
禁止某个集合进行balancer数据搬迁
sh.disableBalancing("students.grades")

开启某个集合进行balancer数据搬迁
sh.enableBalancing("students.grades")

需要注意,当我们使用enableBalancing开启某个集合的数据搬迁时候,mongodb不会立即开始搬迁数据块,而是有查询chunk差值的一个过程。

02

确认搬迁是否开启?

我们可以通过下面的命令,来查看某个集合的balancer数据搬迁是否开启了。

代码语言:javascript
复制
查看某个集合的数据搬迁是否开启
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

这个操作返回值可能有4中情况,分别是:

null 错误:代表这个集合不存在

true:代表balancer是没有开启的

false:balancer当前是开启的,但是过去被关闭过,下一次balancer运行的时候,这个将会对这个集合进行数据搬迁

空值:代表balancer当前是开启的,而且从来没有被关闭过。下一次balancer运行的时候,这个将会对这个集合进行数据搬迁。

下面是4个参数的验证过程:

代码语言:javascript
复制
# 返回空,代表一直开着
mongos> db.getSiblingDB("config").collections.findOne({_id : "new.test"}).noBalance;

# 返回null,代表集合写错了
mongos> db.getSiblingDB("config").collections.findOne({_id : "new.xxxxx"}).noBalance;
2021-02-04T23:48:08.577+0800 E QUERY    [js] TypeError: db.getSiblingDB(...).collections.findOne(...) is null :
@(shell):1:1

# 关闭集合,开启集合,返回false,代表集合的balancer曾经被关闭过
mongos> sh.disableBalancing("new.test")
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongos> sh.enableBalancing("new.test")
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongos> db.getSiblingDB("config").collections.findOne({_id : "new.test"}).noBalance;
false

# 关闭集合,返回true,代表当前balancer关闭了。
mongos> sh.disableBalancing("new.test")
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongos> db.getSiblingDB("config").collections.findOne({_id : "new.test"}).noBalance;
true

03

数据搬迁过程控制

_secondaryThrottle参数

该参数可以控制一个块中的当前文档搬迁完毕后,何时开始搬迁下一个文档。注意,这个针对的是文档document

如果这个值被设置为write concern的格式,则代表在进行下一个文档搬迁的时候,需要收到本次文档搬迁的答复才能开始。

如果设置为true,则代表搬迁下一个文档搬迁的时候,需要收到至少一个secondary节点的的答复才能进行,这个设置等同于设置{w:2}

如果没有设置,则直接进行下一个文档搬迁,中间没有等待过程。

想要修改这个参数,可以直接连接mongos,然后修改config数据库下面的settings集合,修改方法如下:

代码语言:javascript
复制
use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_secondaryThrottle" : { "w": "majority" }  } },
   { upsert : true }
)

注意:这个修改生效时间不是即时的,想要即时生效,则需要手工停止并开启balancer。

_waitForDelete参数

这个参数控制的是,balancer搬迁多个数据块的时候,何时开启下一个数据块的搬迁。注意,这个针对的是数据块chunk

搬迁数据块是先把数据块搬迁到其他分片,然后删除当前分片的冗余数据。默认情况下,搬迁下一个数据块chunk,mongodb是不会等待上一个数据块搬迁完毕,并delete掉冗余块这个动作的。也就是会同时搬迁多个数据块。

如果这个参数设置为true,则上一个数据块的冗余数据delete掉之前,不会开始下一个数据块的搬迁的。也就是一次只能搬迁一个数据块。

要想设置这个参数,则需要连接mongos,并更新config库下面的settings这个集合:

代码语言:javascript
复制
设置为true
代码语言:javascript
复制
use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_waitForDelete" : true } },
   { upsert : true }
)

设置为空
use config
db.settings.update(
   { "_id" : "balancer", "_waitForDelete": true },
   { $unset : { "_waitForDelete" : "" } }
)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档