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

Jef*_*ard 10 sharding mongodb

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

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

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

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

ok:0.0,错误:"moveChunk未能在数据传输中使用TO-shard:无法接受新的块,因为以前的迁移仍有1461个删除"}

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

ok:0.0,错误:"moveChunk未能在数据传输中使用TO-shard:无法接受新的块,因为从以前的迁移仍有1461个删除"}从:rs0到:shard1 chunk:min:{account_id:MinKey } max:{account_id:-9218254227106808901}

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

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

提前感谢任何见解.

Ada*_*ord 16

看到这种问题并不常见,但我看到它偶尔发生.

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

一旦你这样做,你将留下大量孤立的文件,这些文件可以是我建议在低流量时间运行的cleanUpOrphaned命令的地址(如果你有这样的时间).

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

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

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