0

我有一个集合,其中分片键是 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 不提供手动删除或合并块的命令。我的主要问题是,这项工作是否可以摆脱空块:

  1. 停止平衡器。连接到每个配置服务器,从config.chunks空块的范围中删除,并将minKey切片固定在第一个非空块的开头。启动平衡器。似乎有风险,但据我所知,config.chunks它是唯一存储块信息的地方。

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

4

2 回答 2

0

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

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

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

于 2013-03-16T21:18:20.747 回答
0

由于 mongodb 平衡器仅平衡分片之间的块数,因此集合中的空块过多会导致分片按块数平衡,但每个分片的数据大小严重不平衡(例如,如 db.myCollection.getShardDistribution() 所示) .

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

于 2017-04-26T21:08:55.037 回答