为什么在我的mongodb中所有的集合都在同一个副本集中?

时间:2018-03-28 13:54:57

标签: python mongodb collections pymongo

我有一个带有mongodb 3.2的2节点集群。我只是为了测试目的而做的。 该系统有2个副本集。

使用python和pymongo驱动程序,我创建了一个数据库('test')并启用了分片。然后我创建了10000个集合(对于每个集合,我创建了一个复合分片键并启用它进行分片)。然后,对每个集合,只插入一个文档。

我使用(并且正常工作)的命令是:

mongoClient = MongoClient('xx.xx.xx.xx:27017')
db = mongoClient.admin
db.command('enableSharding', 'test')
for i in range(0,10000):
    col = "test." + str(i)
    db.command({'shardCollection': col, 'key': {'ValueX': 1, 'ValueY': 1}})

db = mongoClient['test']

with open('doc.json') as json_data:
    post = json.load(json_data)

for i in range(0,10000):
    col = db[str(i)]
    col.insert(post)

我怀疑: 在mongo shell中,我使用db.stats()来获取有关'test'数据库的信息。我发现所有的集合都在同一个副本集中(我希望每个集合中找到5000个)。

当然,我对使用mongodb在分布式系统中存储集合的方式存在误解,但我没有意识到这一点。

enter image description here

我留下参考图片。

我希望有人能帮助我理解。

的问候,

1 个答案:

答案 0 :(得分:1)

分片收集意味着集合在所有分片和块中,文档均匀分布到所有分片。因此,如果我们有一个集合,其中我们有100个块的10,000个文档,那些块是均匀分布的。有两个碎片,两个碎片有50个块,一个块有"关于" 100份文件。

Chunk是一系列文档,其中分片键值处于特定限制。因此,如果我们的分片键类型是整数,则一个块的限制可能更低:50,upper:75以及那个键位于这些值之间(不包括上限)的所有文档都存储在该特定块中。

在这种情况下,收集已经创建到" primary"碎片,因为每个集合只有一个块,所有集合都在同一个碎片中,并且不能移动(通过自动平衡器)

使用命令sh.status(),您可以获得分片信息。