//
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集群的状态的时候,发现了下面的情况:
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功能模块也被关闭了。
于是查看了下官方文档,发现了下面这句话:
也就是说,从4.2版本开始,开启Balancer会开启chunk的自动分裂,而关闭Balancer也会关闭chunk的自动分裂。通过下面的代码,可以证明:
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集合中写入相关数据来实现,如下:
{ "_id" : "balancer", "mode" : "full", "stopped" : false } { "_id" : "autosplit", "enabled" : true }
上面的记录代表关闭balancer,但是打开chunk的autosplit操作。