//
MongoDB balancer的版本差异
//
这几天在做一个MongoDB的版本升级,升级的过程中发现了不同版本balancer的一个小差异。这里记录下。
本次升级的目的是线上一个集群从4.0.4升级到4.2.14版本。
升级方法:
在升级的过程中,利用数据同步工具,将4.0.4的分片集群数据同步到4.2.14版本的分片集群中,最后通过业务切换来实现升级。
Balancer相关操作:
同步过程中,为了加快同步的速度,在目标端关闭了4.2.14版本的balancer,相关命令是:
sh.setbalancerstate(false),避免chunk搬迁导致的写入性能变差。
最终结果:
最终数据同步完成,意外发现源端集群和目标集群的分片数量不一致了,源端集群上有500多个分片,但是在目标集群上只有2个分片。
当我们使用sh.status()命令查看当前sharding集群的状态的时候,发现了下面的情况:
代码语言:javascript复制mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f4766144099611dfdd12e97")
}
shards:
{ "_id" : "test1", "host" : "test1/xxx", "state" : 1 }
{ "_id" : "test2", "host" : "test2/xxx", "state" : 1 }
active mongoses:
"4.2.5" : 1
autosplit:
Currently enabled: no
balancer:
Currently enabled: no
Currently running: no
可以看到,这个集群的autosplit功能模块也被关闭了。
于是查看了下官方文档,发现了下面这句话:
Starting in MongoDB 4.2, sh.startBalancer()
also enables auto-splitting for the sharded cluster.
也就是说,从4.2版本开始,开启Balancer会开启chunk的自动分裂,而关闭Balancer也会关闭chunk的自动分裂。通过下面的代码,可以证明:
代码语言:javascript复制mongos> sh.setBalancerState(true)
{
"ok" : 1,
"operationTime" : Timestamp(1624204578, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1624204578, 2),
"signature" : {
"hash" : BinData(0,"baKnEwcXN5bHr56N3D7hmuKq0SQ="),
"keyId" : NumberLong("6966117271106224131")
}
}
}
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f4766144099611dfdd12e97")
}
shards:
{ "_id" : "test1", "host" : "test1/10.41.15.139:45020,10.69.2.202:45020", "state" : 1 }
{ "_id" : "test2", "host" : "test2/10.41.28.104:45021", "state" : 1 }
active mongoses:
"4.2.5" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
而在MongoDB4.0版本中,关闭或者打开balancer不会影响chunk的autosplit操作。
解决方案:
如果发现源端和目标端的数据一致,但是分片数量不一致的情况,可以通过开启Balancer,然后进行数据插入和数据更新的操作,这样,MongoDB就会自动进行chunk的split操作了。
补充说明:
1、在MongoDB 4.0版本中,当我们关闭balancer或者打开balancer的时候,不会影响chunk的split操作,也就是说,chunk会进行分裂操作,但是出现chunk差的时候,不进行chunk搬迁操作
2、在MongoDB 4.2版本中,如果我们关闭balancer,chunk的split操作也会随之关闭,如果我们打开balancer,chunk的split操作也会随之打开。
3、如果想在MongoDB 4.2的版本中,仅仅关闭balancer,而打开chunk split,可以通过在config数据库的settings集合中写入相关数据来实现,如下:
代码语言:javascript复制{ "_id" : "balancer", "mode" : "full", "stopped" : false }
{ "_id" : "autosplit", "enabled" : true }
上面的记录代表关闭balancer,但是打开chunk的autosplit操作。