【问题标题】:How to efficiently Shard a MongoDb collections that already has millions of documents?如何有效地对已经拥有数百万个文档的 MongoDb 集合进行分片?
【发布时间】:2022-01-27 16:08:41
【问题描述】:

我有一个名为 order_error 的集合。其中有超过 6000 万份文件。今天我试图把它分片。我有 3 个副本集。最初,没有任何问题。平衡器在集群之间分配块。但最终,它已经开始消耗所有的 Ram 空间,并且也开始消耗所有的交换空间。现在一切都没有反应。我们不能在生产中遵循这个程序。我们需要一个更好的解决方案。如何以更好的方式进行分片? 如果有人可以帮助我,请告诉我

【问题讨论】:

  • 提示增加内存?顺便说一句,在初始复制期间,您肯定会使用更多的 ram+cpu。
  • 我尝试增加内存。但这并没有太大帮助。这个过程真的很慢。如何创建一个空集合,将其分片并将所有文档导出到该集合?所以它会在插入时分裂。不是吗? @SomeoneSpecial
  • 你可以试试。但是 6000 万个文档,你应该给它时间.. 即使你执行 insertOne() x 6000 万次也需要很多小时。这不是即时的
  • @JithinVariyar 我认为这是您最好的选择,这取决于您的索引有多少和有多大,您可以在不到 2 小时的时间内插入 6000 万份文档。我认为您在这种方法中的实际瓶颈将是对数据进行分页,如果您有一种简单的方法,我认为这是更安全的方法。
  • 也许你选择了一个糟糕的分片键。

标签: mongodb mongoose mongodb-query sharding


【解决方案1】:

当您将文档插入空集合时,最初所有日期都会写入primary shard,因此它不会解决您的问题。

但您可以在空集合上使用sh.splitAt 来预拆分它。

注意,即使集合是空的,也需要一些时间才能将块分布在所有分片上!当您拆分一个块时,它仍然保留在当前分片上。用db.collection.getShardDistribution()检查块是否均匀分布。

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2016-08-22
    • 2022-10-03
    相关资源
    最近更新 更多