5

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

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

谢谢,

小号

4

2 回答 2

7

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

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

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

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

  1. 组成该块的文档必须读入源分片上的内存(如果还没有的话)(因此是相当标准的读取)
  2. 然后将它们发送到目标分片(相当标准的插入/写入)
  3. 最后,在元数据更新后,它们将从源分片中删除。

第 3 步是删除,它需要在源分片上写锁,但它应该很快 - 文档已经在迁移的内存中。

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

这意味着您将看到更多有关 mongos 需要刷新其配置并更新其分片版本的记录消息。在开始长时间运行的操作(如 Map/Reduce 或 findAndModify)之前运行flushRouterConfig 命令也是一个好主意。

如果您的分片使用率较低,您会发现迁移发生得更快,并且您还可以考虑使用平衡器窗口选项,仅在您注意到显着影响的特定时间运行平衡。

于 2012-07-22T15:24:15.663 回答
3

与往常一样,我假设您想在开始看到不利的性能数字时立即尝试添加这些成员

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

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

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

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

同样,这将与 IO 和我上面的评论相关联。

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

请注意,这只发生在分片并具有分片键的集合上。未分片的集合根本不动。这有时会在雷达下飞行,直到流量因未知原因开始累积在一个分片上。

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

于 2012-07-23T07:11:23.740 回答