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

时间:2012-07-22 13:29:54

标签: mongodb

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

只是想更好地了解在群集已存在时添加分片时会发生什么。

谢谢,

取值

2 个答案:

答案 0 :(得分:4)

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

就迁移本身而言,您已经在当前群集中看到它们,因此这就是如何判断它们的影响。您可以在日志中查看最近的迁移,也可以查看更改日志(包含最新迁移/拆分等的10MB上限集合)。

// connect to a mongos, switch to the config DB
use config
// look at the changelog
db.changelog.find()

就发生什么样的行动而言,移动一大块:

  1. 构成该块的文档必须在源分片上读入内存(如果尚未存在)(这是一个相当标准的读取)
  2. 然后将它们发送到目标分片(相当标准的插入/写入)
  3. 最后,在更新元数据后,它们将从源分片中删除。
  4. 第3步是删除,它需要对源分片进行写锁定,但它应该非常快 - 文档已经在迁移的内存中。

    增加迁移频率的另一个影响是分片版本将更频繁地更新 - 特别是主要的分片版本(以便它具有最新的分块到分片的映射。

    这意味着您将看到有关需要刷新其配置并更新其分片版本的m​​ongos的更多已记录消息。在开始像Map / Reduce或findAndModify这样的长时间运行之前运行flushRouterConfig command也是一个好主意。

    如果您的分片具有低使用率的时段,您将看到迁移更快,并且您还可以考虑使用balancer window选项仅在特定时间运行平衡,如果您确实注意到了重大影响。< / p>

答案 1 :(得分:3)

  

一如既往,我会假设您想在尝试看到不利的效果数字时尝试添加这些成员

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

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

  

发生这种情况会给你带来什么样的影响?

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

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

  

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

请注意,这仅适用于分片并具有分片键的集合。未加密的集合根本不会移动。这有时可以在雷达下飞行,直到交通开始在一个碎片上累积,原因不明。

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

相关问题