MongoDB之balancer(2)

2021-02-07 15:48:09 浏览数 (1)

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" : "" } }
)

0 人点赞