moveChunk未能在数据传输中使用TO-shard:因为无法接受新的块

时间:2014-10-29 21:18:32

标签: mongodb sharding

我有一个运行2.6.5的MongoDb生产集群,我最近从两个分片迁移到了三个分片。我已经作为两个碎片运行了大约一年。每个分片都是一个3服务器副本集,我有一个分片集合 分片集合大约为240G,使用新分片,我现在在每个分片上均匀分布了2922个块。我的制作环境似乎表现得很好。访问数据没有问题。

[注意:1461应该是从rs0和shard1移动到shard2上的2922的块数。]

我的意图是再打三个收藏品,所以我从一个开始,并期望它分散在整个碎片中。但不 - 我最终得到了这个重复的错误:

2014-10-29T20:26:35.374 + 0000 [Balancer] moveChunk结果:{原因:   {ok:0.0,errmsg:"不能接受新的块,因为之前的迁移仍有1461个删除" },

ok:0.0,errmsg:" moveChunk无法在数据传输中使用TO-shard:无法接受新的块,因为之前的迁移仍有1461次删除" }

2014-10-29T20:26:35.375 + 0000 [Balancer]平衡器移动失败:{原因:   {ok:0.0,errmsg:"不能接受新的块,因为之前的迁移仍有1461个删除" },

ok:0.0,errmsg:" moveChunk无法在数据传输中使用TO-shard:无法接受新的块,因为之前的迁移仍有1461次删除" } from:rs0 to:shard1 chunk:min:{account_id:MinKey} max:{account_id:-9218254227106808901}

通过一些研究,我认为我应该给它一些时间,因为显然它需要在移动后清理一些东西。我运行了sh.disableBalancing(" collection-name")来阻止错误尝试对新集合进行分片。 sh.getBalancerState显示为true, 就像sh.isBalancerRunning一样。但是,我给了它24小时,错误信息是相同的。 我认为它会清除/删除它需要删除的1461中的至少一个。

  1. 这个常见的行为现在在2.6世界吗?每次我用另一个碎片培养环境时,我是否需要对所有分片集合进行处理?
  2. 知道如何进行清理吗?或者我应该在shard1上放下主要内容,这似乎是个问题?
  3. 如果我放弃主要版本,我仍然会有文件删除/清除'在中学呢?或者这会处理事情,以便我可以开始分割一些新的集合吗?
  4. 提前感谢任何见解。

1 个答案:

答案 0 :(得分:16)

看到这种问题并不常见,但我看到它偶尔出现。

这里采取的最佳补救措施是降低引用的TO分片的主要部分,这将清除背景删除。删除线程仅存在于当前主节点上(它们将在处理时通过oplog从主节点复制)。当您将其降低时,它将成为辅助,线程无法再写入,并且您将获得一个没有挂起删除的新主数据库。您可能希望在下台后重新启动前一个主要游标以清除旧游标,但它通常不紧急。

执行此操作后,您将留下大量孤立的文档,这些文档可以是cleanUpOrphaned command的地址,我建议您在低流量时运行(如果您有这样的时间)。

作为参考,如果这是一个反复出现的问题,那么初选可能会在负载方面稍微挣扎,并且为了避免排队删除,您可以将平衡器的_waitForDelete option设置为true (默认为false)如下:

use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_waitForDelete" : true } },
   { upsert : true }
)

这意味着每次迁移都较慢(可能非常明显),但不会导致后台删除累积。