MongoDB 耗尽分片但平衡器未运行?(removeShard 花费太多时间)

Spi*_*Xel 5 sharding mongodb

我正在尝试将当前具有 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
}
Run Code Online (Sandbox Code Playgroud)

所以有 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
...
Run Code Online (Sandbox Code Playgroud)

所以平衡器已启用,但未运行。但是有一个正在被删除的耗尽碎片 (rs8),所以我认为平衡器应该不断运行,对吗?但事实并非如此,如我上面提供的日志所示。

而且这个过程花费的时间非常长,在过去的近一天里,剩余块的数量仅减少了 10 个块,从15751565!这样,我将需要几个月的时间才能将 8 个实例的分片集群减少到 4 个实例的分片集群!

似乎 MongoDB 本身也不会停止写入耗尽的分片,所以我所经历的是块增加的速度,也许几乎抵消了它们的减少?

任何帮助是极大的赞赏!
谢谢

Spi*_*Xel 1

编辑

太棒了,现在正好一个月后,这个过程就结束了,我有了一个 4 分片集群!执行我下面描述的技巧有助于减少无论如何可能花费的时间,但老实说,这是我做过的最慢的事情。


好吧,所以在这里回答我自己的,

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

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

所以我基本上做的是:

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}`);
Run Code Online (Sandbox Code Playgroud)

因此,我手动将块从第 8 个分片移至前 4 个分片(一个缺点是,因为我们需要启用平衡器,并且每时每刻只有一个分片可以耗尽,其中一些已迁移的块将再次自动迁移到碎片 5-7,我稍后也想删除它,这会导致该过程花费更多时间,有什么解决方案吗?)。

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

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