我有一个集合,其中分片键是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中不提供命令,删除或手动合并块。 我的主要问题是,这个对子级作品的任何摆脱空块:
停止平衡器。连接到每个配置服务器,从
config.chunks
范围删除空块,并且还修复minKey
切片以在第一个非空块开始时结束。启动平衡器。 似乎有风险,但据我所知,config.chunks
是存储块信息的唯一地方。停止平衡器。启动一个新的mongod实例并将其连接为第三个分片。手动将所有空块移动到这个新碎片,然后永远关闭它。启动平衡器。 不确定,但只要我不再使用分片键中的整数值,所有查询都应该正常运行。