我有一个集合,其中分片键是 UUID(十六进制字符串)。集合是巨大的:8.12 亿个文档,大约 9600 个块在 2 个分片上。出于某种原因,我最初存储的文档不是 UUID,而是在分片键字段中具有整数。后来我完全删除了它们,现在我所有的文档都被 UUID 分片了。但我现在面临块分布的问题。虽然我有整数而不是 UUID 的文档,但平衡器为这些文档创建了大约 2700 个块,并将它们全部放在一个分片上。当我删除所有这些文档时,块并没有被删除,它们保持为空并且它们将永远是空的,因为我现在只使用 UUID。由于平衡器根据每个分片的块数而不是文档数或大小来分配块,因此我的一个分片占用的磁盘空间是另一个分片的 3 倍:
--- 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 实例并将其连接为第三个分片。手动将所有空块移动到这个新分片,然后永远关闭它。启动平衡器。不确定,但只要我不再在分片键中使用整数值,所有查询都应该运行良好。