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

时间:2018-03-22 04:16:55

标签: mongodb database-performance sharding

我有一个带有4x分片的生产mongodb部署(3.6),它运行良好。我想为群集添加4倍以上的分片。可以一次添加多个分片,还是会引起戏剧?我发现添加分片是一项昂贵的操作,在我看来,同时添加它们可以避免必须来回传输数据,从而提高性能。 谢谢,

1 个答案:

答案 0 :(得分:2)

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

  

对于具有n个分片的分片群集,MongoDB最多可以执行n / 2(向下舍入)同步块迁移

现在,这意味着您可以同时进行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默认值),并且您在飞行中拥有的越多,它们将产生的影响就越大。因此,与大多数事情一样,这是一种权衡。

我们还没有考虑到哪些收藏品是最大,最繁忙或最多的块。您可以采用许多策略来最大限度地降低对用户的性能影响(您可以禁用最重要,最繁忙的集合的平衡,最后进行,但其余部分会立即重新平衡)。

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