我正在研究mongodb的分片,我有以下结构:
我有一个名为erp的数据库和3个集合,pessoas,produtos和contatos。
所以我使用以下方法添加我的收藏:
sh.shardCollection("erp.<collection>", { id: 1 }, true)
我从集合pessoas开始,这个集合有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"
在此之后我添加了produtos系列,我给了她1001个寄存器,所以为什么这个系列是这样分发的:
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”才能获取数据?集合contatos也会发生同样的事情,只有replicaSet“rs1”获取数据,我无法将数据分发到其他分片。
为什么会发生这种情况以及我做错了什么?
如何平均分配数据?例如,对于2000个寄存器,一个分片中有1000个寄存器,另一个分片中有1000个寄存器。
如果你们需要更多信息,请告诉我。
由于
答案 0 :(得分:2)
MongoDB使用块数而不是文档来平衡碎片(参见https://docs.mongodb.com/manual/core/sharding-balancer-administration/)。因此,从您提供的输出中,群集是平衡的。分片rs1
包含36个块,分片rs3
还包含36个pessoas
集合的块。
如果文档数量不均衡,则意味着您的插入将进入少量块(在最坏的情况下甚至是一个块),并且不会分布在所有块中。这通常是由使用单调增加的分片键引起的。
有关此主题的详细信息,请参阅Shard Keys,以及如何避免这种情况。请注意,分片键选择非常重要,因为一旦选择了分片键,就不能再更改分片键。更改集合的分片键的唯一方法是转储集合,并在还原过程中更改分片键。