强制mongodb将块移动到单个分片

时间:2014-11-28 20:54:01

标签: mongodb sharding

我有5个分片,我想将它们合并为一个分片。每个分片都有大约30GB的数据。我可以使用“removeShard”命令逐个删除它们。但这很浪费,因为当我逐个删除分片时,数据必须重新分配多次。强制数据移动到我将保留的单个分片会更有效。

2 个答案:

答案 0 :(得分:5)

基本上,moveChunk命令用于手动块迁移。

使用config数据库,您可以使用类似于下面的脚本。

请注意,您必须先关闭平衡器

var query = {"shard" : {$ne : "DESTINATION_SHARD_ID"} , "ns" : "YOUR_NAMESPACE"}
var cursor = db.chunks.find(query);

cursor.forEach(function(d) {
    sh.moveChunk("YOUR_NAMESPACE", { "_id" : d.min._id }, "DESTINATION_SHARD_ID")
});

其中:

  • DESTINATION_SHARD_ID是目标分片ID
  • YOUR_NAMESPACE是格式为[db]。[collection]
  • 的集合名称空间

这可能需要很长时间,具体取决于块的数量以及目标计算机如何处理写入。您也可以限制操作。例如,一个cron作业,在非高峰时段每天传输10个块((通过向查询添加limit(50))。

一旦消除了分片,您就可以发出(仍然必要的)removeShard命令。

答案 1 :(得分:1)

这里没有快速解决方案。您可以按照第一个答案中的指示手动移动块,但还有另一个选项。这将不会更快,因为无论你目前做什么,平衡器(为你移动块)仍然只能一次移动一个块。

您可以使用tag aware sharding并标记您希望留给整个数据集的一个分片。在平衡时排除分片之后立即评估标记,因此标记指示整个数据集应该在单个分片上将大致相当于将所有分片设置为排空。完成后,您可以发出命令以删除已完成所有工作的分片。

考虑到平衡器的开销和单线程特性,您可能需要考虑使用mongodump转储整个数据集,然后恢复为单个分片(假设您可以减少停机时间和有足够的空间)。