【问题标题】:Adding a new secondary in MongoDB to Distribute Load在 MongoDB 中添加新的辅助节点以分配负载
【发布时间】:2012-09-05 15:06:58
【问题描述】:

我在三台机器上有两个分片(使用 mongodb 1.8.2):

nodeI   including:   shard1(primary) and shard2(primary)
nodeII  including:   shard1(secondary) and shard2(secondary)
nodeIII including:   shard1(arbiter) and shard2 (arbiter) 

NodeII 负载越来越高(CPU 和 IO),NodeI 也很高,但比 nodeII 好一点。

在我的 java 客户端中,我指定代码只查询 NodeII,而 NodeI 仅用于编写。

我打算将 nodeIII 从仲裁器转换为辅助节点,以分担 NodeII 上的读取负载。

您认为这是一个好主意吗?如果我这样做,我应该考虑什么,或者您有其他降低负载的建议吗?

【问题讨论】:

  • 如果您可以发布更多详细信息将会很有帮助:您的三台服务器的硬件规格,以及带有来自Node INode II 的一些mongostat 输出的PasteBin 链接。

标签: mongodb load sharding mongodb-java


【解决方案1】:

只要仲裁器硬件具有与您的辅助设备相似的规格,您建议的方法似乎是合理的,因为它将分发辅助读取。通常仲裁器的硬件规格非常低或使用共享硬件,但我假设您的配置不是这种情况。

如果副本集中的服务器数量为奇数,则不再需要仲裁器。

您可能想look into Read Preference here,特别是您可能有兴趣指定标签集以选择辅助。

【讨论】:

  • ,我正在使用java客户端连接mongoS,我担心如果客户端可以自动平衡两个辅助的读取请求,我需要一些特殊的配置。我很抱歉是什么这意味着:“特别是您可能有兴趣指定标签集以选择辅助。”
  • 读取请求将在两个辅助节点之间自动平衡。如果你愿意,你可以指定特殊的规则,当你想使用标签集读取哪个次要时,但这不是必需的。我只是提到它,所以如果您有兴趣,可以查看我提供的链接。
【解决方案2】:

从辅助节点读取并不一定会像您预期的那样“分配”负载。如果没有找到性能问题的根源,您可能只是在准备迎接更多挑战。

特别是,将辅助服务器添加到现有服务器将:

  • 增加添加辅助服务器的 I/O 负载(您现在正在复制和写入数据的完整额外副本)
  • 为从服务器同步读取提供更多争用
  • 可能会导致次要在繁重的读取活动期间落后于主要(如果您期望强一致性,这可能会引起关注)。

您还应该考虑在失败的情况下会发生什么。如果您的服务器在当前负载下苦苦挣扎,那么如果您的任何一台物理服务器出现问题并且所有流量最终都到达单个服务器,那么事情可能会严重崩溃。

理想情况下,您应该运行mongostat 或类似的monitoring tools 以更好地了解服务器的性能特征以及可能导致负载的因素(内存压力、锁定百分比、I/O、网络...... )。如果您可以将 mongostat 输出样本发布到 PasteBin 或类似地址,将会很有帮助。

您还应该使用explain() 查看您的常见查询以了解索引的使用情况,并检查它们是否需要访问所有分片或被定向到特定分片。

如果所有 3 台服务器的硬件规格相同,作为短期改进,我会考虑:

  • 删除仲裁器并用辅助节点替换它们。这将在您的一台服务器出现故障时提供额外的数据冗余,并有助于防止所有负载落在一台服务器上。

  • 降低 NodeI 上的主节点,使 NodeI 和 NodeII 各有一个主节点和从节点(而不是 NodeI 上的两个主节点和 NodeII 上的两个从节点)。主备服务器具有不同的写入特性,这样可以更好地平衡负载。

  • 检查您的分片键和常见查询以确认它们将合理地平衡读取和写入。潜在问题包括“热点”,即所有对集合的写入都命中单个分片.. 或查询命中所有分片以获得结果。

  • 如果您从辅助节点读取,则测试性能变化。这可能看起来有悖常理,但根据查询的性质,从辅助数据中读取实际上可能会导致其他问题。

最后,您提到使用 1.8.2。 MongoDB 2.0 和 2.2 中有显着的性能和锁定/屈服改进,以及其他错误修复。值得在您的开发环境中测试升级,因为这可能会解决您的一些问题。

【讨论】:

  • 非常非常感谢Stennie!您的回答非常详细,非常有帮助!我将尝试短期方法,几天后我将尝试根本解决方案:添加新的分片复制集。顺便说一句,我有一个愚蠢的问题,我不明白“写入辅助设备通常会导致比主设备写入更高的 I/O”?你的意思是二级的IO压力比一级重?我了解主 oplog 将许多更新减少到一个更新,然后将一个更新发送到辅助?那么为什么第二个 IO 压力更大?提前致谢
  • 对不起,另一个愚蠢的问题:当我使用 mongostat 时如何检查“锁定状态”,是否有锁定阈值,好坏如何。非常感谢!
  • @Jack:对不起,这不是对主要和次要性能特征的合理概括;它们可能会因许多因素而有所不同,包括您的阅读偏好和更新类型。通过多次更新,可以将应用于主节点的单个语句转换为多个 operations in the oplog 以中继到辅助节点。至于mongostat中的锁定状态,你想看看lock %。没有好坏之分,更多的是历史。扩展的高锁定百分比不好:)。
  • 如果可能,您应该将您的服务器添加到免费的Mongo Monitoring Service (MMS)。 MMS 提供了一些有用的操作和性能特征跟踪。或者,您可以使用 munin 之类的东西设置自己的 monitoring
  • ,谢谢你的好意:)
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多