Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB将碎片添加到现有集群-会发生什么?_Mongodb - Fatal编程技术网

MongoDB将碎片添加到现有集群-会发生什么?

MongoDB将碎片添加到现有集群-会发生什么?,mongodb,Mongodb,我试图确保我了解在向现有分片集群添加新分片(副本集)时会发生什么。当我添加这些新成员时,它看到有一个新的碎片成员可用,Mongo然后开始重新安排块,以便它可以利用新成员,对吗?当这种情况发生时,你会受到什么样的影响?和往常一样,我假设您希望在看到不利的性能数字时(如果其他调优选项没有帮助的话)尝试添加这些成员 只是想更好地了解在集群已经存在的情况下添加碎片会发生什么 谢谢 S当您将碎片添加到现有集群时,它将自动成为每个碎片集合中块数最少的碎片。这意味着它将成为迁移的默认目标(从块数最多的碎片开始

我试图确保我了解在向现有分片集群添加新分片(副本集)时会发生什么。当我添加这些新成员时,它看到有一个新的碎片成员可用,Mongo然后开始重新安排块,以便它可以利用新成员,对吗?当这种情况发生时,你会受到什么样的影响?和往常一样,我假设您希望在看到不利的性能数字时(如果其他调优选项没有帮助的话)尝试添加这些成员

只是想更好地了解在集群已经存在的情况下添加碎片会发生什么

谢谢


S

当您将碎片添加到现有集群时,它将自动成为每个碎片集合中块数最少的碎片。这意味着它将成为迁移的默认目标(从块数最多的碎片开始),直到事情变得更加平衡。但是,每个shard primary(负责迁移)一次只能参与一次迁移。因此,平衡需要一段时间,尤其是在负载下

就迁移本身而言,您已经在当前集群中看到了迁移,所以这就是如何判断迁移的影响。您可以在日志中查看最近的迁移,也可以查看changelog(一个包含最新迁移/拆分等的10MB封顶集合):

就发生的操作而言,要移动块:

  • 组成该区块的文档必须读入源碎片上的内存(如果还没有的话)(因此是相当标准的读取)
  • 然后将它们发送到目标碎片(相当标准的插入/写入)
  • 最后,元数据更新后,将从源碎片中删除它们 第3步是删除,这需要对源碎片进行写锁定,但速度应该相当快——迁移过程中文档已经在内存中

    增加迁移频率的另一个影响是,碎片版本将更频繁地更新,尤其是主要的碎片版本(因此它具有块到碎片的最新映射)

    这意味着您将看到更多有关mongos需要刷新其配置和更新其碎片版本的日志消息。在启动长时间运行的操作(如Map/Reduce或findAndModify)之前,最好先运行

    <>如果你的碎片有低使用期,你会看到迁移发生得更快,你也可以考虑使用这个选项,如果你注意到显著的影响,在某些时候只运行平衡。 像往常一样,我假设您希望在看到不利的性能数据时,尝试添加这些成员

    根据我的经验,您希望添加一个分片以增加流量。特别是如果分片数量较低(<6个左右)。将数据迁移到新节点会增加现有节点上的IO,也会增加网络流量

    因此,如果您已经遇到IO问题,添加碎片只会使情况变得更糟。您可能最终会“照看”迁移或使用平衡器窗口选项。事实上,平衡器窗口选项的存在应该告诉您一些关于平衡过程强度的信息

    当这种情况发生时,你会受到什么样的影响

    另一个不寻常的副作用是,通常不在内存中的数据可能会被拉入内存。例如,如果您的历史数据在一天中大部分时间都未被触及,那么即使您的客户没有积极阅读,也可以将其拉入内存进行移动

    同样,这将与IO和我上面的评论联系起来

    当我添加这些新成员时,它看到有一个新的碎片成员可用,Mongo然后开始重新排列块

    请注意,这仅适用于已分片且具有分片密钥的集合。未分片的集合根本不会移动。这有时会在雷达下飞行,直到未知原因导致流量开始在一个分片上累积


    对于未分片的数据,您可能希望将其保存在单独的副本集中,以确保您的分片按预期运行。

    感谢Adam我感谢InfoThreak@GatesVP提供的非常有用的信息!
    // connect to a mongos, switch to the config DB
    use config
    // look at the changelog
    db.changelog.find()