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

时间:2016-11-25 18:29:18

标签: mongodb replication sharding

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

  • 1个Mongod到我的ConfigServer,ReplicaSet只有1个成员
  • 2在ReplicaSet
  • 中每个镜头都有2个成员
  • 1 Mongos

我有一个名为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个寄存器。

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

由于

1 个答案:

答案 0 :(得分:2)

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

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

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