MongoDB正在排出碎片,但平衡器未运行?(removeShard占用太多时间)

MongoDB正在排出碎片,但平衡器未运行?(removeShard占用太多时间),mongodb,sharding,Mongodb,Sharding,我正在尝试将一个目前有8个碎片的分片集群缩小为一个有4个碎片的集群 我从第8个碎片开始,并尝试先移除它 db.adminCommand( { removeShard : "rs8" } ); ---- { "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(1575), "dbs" : NumberLong(0)

我正在尝试将一个目前有8个碎片的分片集群缩小为一个有4个碎片的集群

我从第8个碎片开始,并尝试先移除它

db.adminCommand( { removeShard : "rs8" } );
----
{
    "msg" : "draining ongoing",
    "state" : "ongoing",
    "remaining" : {
        "chunks" : NumberLong(1575),
        "dbs" : NumberLong(0)
    },
    "note" : "you need to drop or movePrimary these databases",
    "dbsToMove" : [ ],
    "ok" : 1
}
因此,有1575个块要迁移到集群的其余部分

但是运行
sh.isBalancerRunning()
我得到值
false
,并且
sh.status()
的输出如下所示:

  ...
  ...

  active mongoses:
        "3.4.10" : 16
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
NaN
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                59 : Success
                1 : Failed with error 'aborted', from rs8 to rs1
                1 : Failed with error 'aborted', from rs2 to rs6
                1 : Failed with error 'aborted', from rs8 to rs5
                4929 : Failed with error 'aborted', from rs2 to rs7
                1 : Failed with error 'aborted', from rs8 to rs2
                506 : Failed with error 'aborted', from rs8 to rs7
                1 : Failed with error 'aborted', from rs2 to rs3
...
因此,平衡器已启用,但未运行。但是有一个正在被移除的碎片(rs8)正在流失,所以我认为平衡器应该持续运行,对吗?但事实并非如此,正如我在上面提供的日志中所显示的那样

而且这个过程花费了难以置信的时间,在过去的将近一天里,剩余的块数只减少了10块,从1575块减少到1565块!这样,我需要几个月才能将8个实例的分片集群减少到4个实例的分片集群

MongoDB本身似乎也没有停止对正在流失的碎片的写入,所以我所经历的是,块的增加速度,可能几乎抵消了它们的减少

非常感谢您的帮助
谢谢

编辑

太好了,整整一个月后,这个过程结束了,我有一个4分片集群!做下面我描述的技巧有助于减少时间,但老实说,这是我做过的最慢的事情


好的,在这里回答我自己的问题

我无法让自动平衡行为以我想要的速度工作,每天我观察到大约5到7个块会被迁移(这意味着整个过程将需要几年!)

为了解决这个问题,我所做的是手动使用命令

所以我基本上做的是:

while 'can still sample':
    // Sample the 8th shard for 100 documents
    db.col.aggreagte([{$sample: {size: 100}}])

    For every document:
        db.moveChunk(namespace, {shardKey: value}, `rs${NUM}`);
因此,我手动将块从第8个碎片移动到前4个碎片(一个缺点是,我们需要启用平衡器,其中一些迁移的块将再次自动迁移到碎片5-7,我希望稍后也将其删除,这会导致该过程花费更多时间,有解决方案吗?)

由于第8块碎片正在流失,它将不再被平衡器填充,现在整个过程要快得多,大约每天350-400块。因此,希望每个碎片最多需要5天,然后整个调整大小将需要大约20天


这是我能做到的最快的速度,我感谢任何有其他答案或策略的人更好地执行此缩减。

您是如何在正在排水的碎片上手动运行
moveChunk
命令的?我收到错误
无法开始新的迁移,因为此碎片当前正在捐赠区块
——我认为这是指正在流失的区块,一次只能为一个碎片运行一个区块迁移。这是很久以前的事了,我真的不记得了。我的猜测是,他们要么改变了行为,要么根据我模糊的记忆,默认迁移过程非常古怪,大多数时候,没有发生块迁移,而碎片实际上正在流失,这是为了让它在迁移过程中有大约100%的块。也许他们也已经纠正了这种行为。理解这里的行为。禁用平衡器也停止了区块排放,我能够手动运行
moveChunk
命令,这同样缓慢(~150区块/天)。将群集从版本
4.4.2
升级到
4.4.4
解决了这个问题,当前的排放速度现在是2500块/天。