为什么当我添加新的 collections 时只有一个分片获取数据? - MongoDB

Why when I add new collections just one shard gets the data? - MongoDB

我正在研究 mongodb 的分片,我有以下结构:

我有一个名为 erp 的数据库和 3 个 collections、pessoas、produtos 和 contatos。

所以我添加了 collections 使用:

sh.shardCollection("erp.<collection>", { id: 1 }, true)

我从 collection pessoas 开始,这个 collection 有 2000 份文件并以这种方式分发:

mongos> db.pessoas.getShardDistribution()

Shard rs1 at rs1/desenv1:27019,desenv1:27020
data : 57KiB docs : 1497 chunks : 36
estimated data per chunk : 1KiB
estimated docs per chunk : 41

Shard rs3 at rs3/desenv1:27022,desenv1:27023
data : 19KiB docs : 503 chunks : 36
estimated data per chunk : 541B
estimated docs per chunk : 13

Totals
 data : 77KiB docs : 2000 chunks : 72
 Shard rs1 contains 75.27% data, 74.85% docs in cluster, avg obj size on        shard : 39B
 Shard rs3 contains 24.72% data, 25.15% docs in cluster, avg obj size on shard : 38B"

之后我添加了collection产品,我给了她1001个寄存器,为什么这个collection是这样分配的:

mongos> db.produtos.getShardDistribution()

Shard rs1 at rs1/desenv1:27019,desenv1:27020
 data : 67KiB docs : 1001 chunks : 1
 estimated data per chunk : 67KiB
 estimated docs per chunk : 1001

Totals
 data : 67KiB docs : 1001 chunks : 1
 Shard rs1 contains 100% data, 100% docs in cluster, avg obj size on shard : 69B"

问题:

如果你们需要更多信息,请告诉我。

谢谢

MongoDB 通过使用块的数量而不是文档来平衡碎片(参见 https://docs.mongodb.com/manual/core/sharding-balancer-administration/)。因此,根据您提供的输出,集群是平衡的。分片 rs1 包含 36 个块,分片 rs3 也包含 pessoas 集合的 36 个块。

如果文档数量不平衡,这意味着您的插入将进入少量块(或者在最坏的情况下甚至是单个块),而不是分布在所有块中。这通常是由使用单调递增的分片键引起的。

有关此主题以及如何避免这种情况的更多信息,请参阅 Shard Keys。请注意,分片键的选择非常重要,因为一旦选择了分片键,就无法再更改。更改集合的分片键的唯一方法是转储集合,并在还原过程中更改分片键。