为什么当我添加新的 collections 时只有一个分片获取数据? - MongoDB
Why when I add new collections just one shard gets the data? - MongoDB
我正在研究 mongodb 的分片,我有以下结构:
- 1 Mongod 到我的 ConfigServer,ReplicaSet 中只有 1 个成员
- 2 个分片,每个分片在 ReplicaSet 中有 2 个成员
- 1 个蒙戈斯
我有一个名为 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"
问题:
为什么只有 replicaSet "rs1" 正在获取数据?同样的事情发生在 collection contatos 上,只有 replicaSet "rs1" 获取数据,我无法将数据分发到另一个分片。
为什么会这样,我做错了什么?
如何平均分配数据?例如,有 2000 个寄存器,一个分片中有 1000 个寄存器,另一个分片中有 1000 个寄存器。
如果你们需要更多信息,请告诉我。
谢谢
MongoDB 通过使用块的数量而不是文档来平衡碎片(参见 https://docs.mongodb.com/manual/core/sharding-balancer-administration/)。因此,根据您提供的输出,集群是平衡的。分片 rs1
包含 36 个块,分片 rs3
也包含 pessoas
集合的 36 个块。
如果文档数量不平衡,这意味着您的插入将进入少量块(或者在最坏的情况下甚至是单个块),而不是分布在所有块中。这通常是由使用单调递增的分片键引起的。
有关此主题以及如何避免这种情况的更多信息,请参阅 Shard Keys。请注意,分片键的选择非常重要,因为一旦选择了分片键,就无法再更改。更改集合的分片键的唯一方法是转储集合,并在还原过程中更改分片键。
我正在研究 mongodb 的分片,我有以下结构:
- 1 Mongod 到我的 ConfigServer,ReplicaSet 中只有 1 个成员
- 2 个分片,每个分片在 ReplicaSet 中有 2 个成员
- 1 个蒙戈斯
我有一个名为 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"
问题:
为什么只有 replicaSet "rs1" 正在获取数据?同样的事情发生在 collection contatos 上,只有 replicaSet "rs1" 获取数据,我无法将数据分发到另一个分片。
为什么会这样,我做错了什么?
如何平均分配数据?例如,有 2000 个寄存器,一个分片中有 1000 个寄存器,另一个分片中有 1000 个寄存器。
如果你们需要更多信息,请告诉我。
谢谢
MongoDB 通过使用块的数量而不是文档来平衡碎片(参见 https://docs.mongodb.com/manual/core/sharding-balancer-administration/)。因此,根据您提供的输出,集群是平衡的。分片 rs1
包含 36 个块,分片 rs3
也包含 pessoas
集合的 36 个块。
如果文档数量不平衡,这意味着您的插入将进入少量块(或者在最坏的情况下甚至是单个块),而不是分布在所有块中。这通常是由使用单调递增的分片键引起的。
有关此主题以及如何避免这种情况的更多信息,请参阅 Shard Keys。请注意,分片键的选择非常重要,因为一旦选择了分片键,就无法再更改。更改集合的分片键的唯一方法是转储集合,并在还原过程中更改分片键。