MongoDB balancer的版本差异

2021-07-14 13:14:38 浏览数 (1)

//

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操作。

0 人点赞