2013-03-15 97 views
0

我有一个集合,其中分片键是UUID(十六进制字符串)。该集合非常庞大:812百万份文档,2张分片大约9600个大块。出于某种原因,我最初存储的文件不是UUID,而是在分区键字段中有整数。后来我彻底删除了它们,现在我的所有文档都被UUID分割了。但是我现在面临着大块分布的问题。虽然我的文档是整数而不是UUID,但平衡器为这些文档创建了大约2700个块,并将所有这些文件保留在一个碎片上。当我删除所有这些文件时,块没有被删除,它们保持空白,并且它们将一直为空,因为我现在只使用UUID。由于平衡器distrubutes块依靠块每碎片算,不单证数量和大小,我的碎片一个需要比其他3倍以上的磁盘空间:如何从mongodb碎片中删除块

--- Sharding Status --- 
db.click chunks: 
    set1 4863 
    set2 4784 // 2717 of them are empty 

set1> db.click.count() 
191488373 

set2> db.click.count() 
621237120 

这里可悲的是MongoDB中不提供命令,删除或手动合并块。 我的主要问题是,这个对子级作品的任何摆脱空块:

  1. 停止平衡器。连接到每个配置服务器,从config.chunks范围删除空块,并且还修复minKey切片以在第一个非空块开始时结束。启动平衡器。 似乎有风险,但据我所知,config.chunks是存储块信息的唯一地方。

  2. 停止平衡器。启动一个新的mongod实例并将其连接为第三个分片。手动将所有空块移动到这个新碎片,然后永远关闭它。启动平衡器。 不确定,但只要我不再使用分片键中的整数值,所有查询都应该正常运行。

回答

0

有人可能会读这个,并认为空块是占用空间。情况并非如此 - 块本身不占用空间 - 它们是分片键的逻辑范围。

但是,跨分片的块平衡是基于块的数量而不是每个块的大小。

你可能想你的声音添加到这张票:https://jira.mongodb.org/browse/SERVER-2487

0

因为MongoDB的平衡只有平衡豆腐块跨碎片数量,具有收集太多的空块可能会导致碎片由块数,但严重地平衡由于每个分片的数据大小不均衡(例如,如db.myCollection.getShardDistribution()所示)。

您需要识别空白块,并将它们合并为具有数据的块。这将消除空块。现在所有文档都在Mongodb文档中记录(至少3.2以上,甚至可能在此之前)。