Mongodb - 分片 - 同时添加多个分片

Mongodb - sharding - adding multiple shards at the same time

我有一个带有 4 个分片的生产 mongodb 部署 (3.6),并且运行良好。我想向集群中添加 4 倍以上的分片。一次添加多个分片是否可以,或者这会引起戏剧性事件吗?我发现添加分片是一项昂贵的操作,在我看来,同时添加分片可以避免来回传输数据,从而提高性能。 谢谢,

当您添加分片时,所有分片集合都需要重新平衡它们的数据,这意味着移动块直到所有分片具有大致相同数量的块。过去(3.4 之前)在块迁移方面没有并行性,但是现在集群上可以发生的并行迁移的数量与集群中的分片数量直接相关。来自 3.4 补丁说明:

for a sharded cluster with n shards, MongoDB can perform at most n/2 (rounded down) simultaneous chunk migrations

现在这意味着您可以同时进行 2 次迁移,如果您增加到 5 个总分片,您将不会获得任何额外容量。但是,6 个分片可以同时进行 3 次迁移,而最终的 8 个分片可以进行 4 次同时迁移。

除了一次进行更多迁移外,一次添加更多分片还可以减少必须进行的迁移总数(如果添加一个,重新平衡;添加另一个,重新平衡等。您将结束比仅添加 4 个分片并进行一次重新平衡更多的总迁移)。

为了说明,考虑几个简单的场景,使用具有 400 个块的理论集合,以及每次达到平衡需要多少步:

场景 1 - 一次添加一个分片

1st addition: # of migrations = 80
2nd addition: # of migrations = 66 (22)
3rd addition: # of migrations = 55 (28)
4th addition: # of migrations = 50 (13)
Total migrations = 251

场景 2 - 一次添加 2 个分片

1st addition: # of migrations = 66 (22)
2nd addition: # of migrations = 50 (13)
Total migrations = 116

场景 3 - 立即添加 4 个分片

Total migrations = 50 (13)

括号中的数字表示如果我们假设最大并行化并假设所有迁移花费相同的时间,则必须发生多少顺序迁移操作。综上所述,我认为从迁移吞吐量和效率来说,立即加4是最好的做法。

然而,缺点是对集群的影响。正如您所提到的,迁移不是免费的(尽管它们比以前更有效,尤其是使用新的 WiredTiger 默认设置时),而且您的迁移越多,它们的影响就越大。因此,与大多数事情一样,这是一种权衡。

我们甚至还没有考虑哪些集合最大、最忙或拥有最多的块。您可以采用许多策略来最大程度地减少对用户性能的影响(例如,您可以禁用最重要、最繁忙的集合的平衡,最后执行它们,但立即让其余的 re-balance)。

因此,我无法给你一个明确的答案,但如果你考虑以上所有因素,你应该能够为你的数据和集群做出正确的决定。