【问题标题】:Why in my mongodb all the collections are in the same replica set?为什么在我的 mongodb 中所有集合都在同一个副本集中?
【发布时间】:2018-09-07 06:05:59
【问题描述】:

我有一个带有 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() 来获取有关“测试”数据库的信息。我发现所有集合都在同一个副本集中(我预计每个集合都可以找到 5000 个)。

当然,我对如何使用 mongodb 将集合存储在分布式系统中存在误解,但我没有意识到是哪一个。

我留下一张参考图片。

希望有人能帮助我理解。

问候,

【问题讨论】:

    标签: python mongodb collections pymongo


    【解决方案1】:

    分片集合意味着集合在所有分片和块中,文档均匀分布到所有分片。因此,如果我们有一个集合,其中包含 100 个块的 10.000 个文档,那么这些块是均匀分布的。对于两个分片,两个分片都有 50 个块,一个块有“大约”100 个文档。

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

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

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

    【讨论】:

    • 嗨。然后,我明白,如果我增加了足够多的文件插入数量,文件将开始在系统中分发。这是这样吗?另一件事,如何定义“主分片”?我不记得在配置分布式系统时指定此数据。感谢您的回复。
    • 如果你有足够的文档(>64MB)在一个块中,就会发生块分割,你现在有两个块。系统自动为 DATABASE 选择主分片,并且该数据库的所有集合都进入同一个分片。您可以使用movePrimary 命令更改主数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多