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