我有一个带有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在分布式系统中存储集合的方式存在误解,但我没有意识到这一点。
我留下参考图片。
我希望有人能帮助我理解。
的问候,
答案 0 :(得分:1)
分片收集意味着集合在所有分片和块中,文档均匀分布到所有分片。因此,如果我们有一个集合,其中我们有100个块的10,000个文档,那些块是均匀分布的。有两个碎片,两个碎片有50个块,一个块有"关于" 100份文件。
Chunk是一系列文档,其中分片键值处于特定限制。因此,如果我们的分片键类型是整数,则一个块的限制可能更低:50,upper:75以及那个键位于这些值之间(不包括上限)的所有文档都存储在该特定块中。
在这种情况下,收集已经创建到" primary"碎片,因为每个集合只有一个块,所有集合都在同一个碎片中,并且不能移动(通过自动平衡器)
使用命令sh.status()
,您可以获得分片信息。