0

我在三台机器上有两个分片(使用 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 上的读取负载。

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

4

2 回答 2

0

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

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

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

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

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

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

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

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

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

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

  • 如果您从辅助节点读取数据,则测试性能变化。这似乎违反直觉,但根据查询的性质,从辅助节点读取实际上可能会导致其他问题。

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

于 2012-09-07T13:21:08.150 回答
0

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

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

您可能想查看 Read Preference here,特别是您可能对指定标签集以选择辅助节点感兴趣。

于 2012-09-05T18:26:24.130 回答