在MongoDB中添加新的辅助服务器以分配负载

在MongoDB中添加新的辅助服务器以分配负载,mongodb,load,sharding,mongodb-java,Mongodb,Load,Sharding,Mongodb Java,我在三台机器上有两个碎片(使用mongodb 1.8.2): NodeII的负载越来越高(CPU和IO),NodeI也很高,但比NodeII好一点 在java客户机中,我将代码指定为仅查询NodeII,而NodeI仅用于编写 我计划将NodeII从仲裁器转换为辅助服务器,以共享NodeII上的读取负载 你认为这是个好主意吗?如果我这样做,我应该考虑什么,或者你有其他建议来降低负载吗? < P>只要仲裁器硬件与你的次要设备有相似的规格,你建议的方法似乎是合理的,因为它将分发次要读取。通常仲裁器的硬

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

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

在java客户机中,我将代码指定为仅查询NodeII,而NodeI仅用于编写

我计划将NodeII从仲裁器转换为辅助服务器,以共享NodeII上的读取负载


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

< P>只要仲裁器硬件与你的次要设备有相似的规格,你建议的方法似乎是合理的,因为它将分发次要读取。通常仲裁器的硬件规格很低,或者在共享硬件上,但我假设在您的配置中不是这样

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


您可能想这样做,尤其是您可能对指定标记集以选择辅助对象感兴趣。

从辅助对象读取不一定像您所期望的那样“分配”负载。如果没有找到性能问题的根源,您可能只会面临更多的挑战

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

  • 增加添加辅助服务器的服务器上的I/O负载(您现在正在复制和写入数据的完整额外副本)
  • 为从辅助服务器同步的服务器读取提供更多争用
  • 在大量读取活动期间,可能会导致次映像落后于主映像(如果您希望具有很强的一致性,则可能会引起关注)
你也应该考虑在失败的情况下会发生什么。如果您的服务器在当前负载下挣扎,那么如果您的任何一台物理服务器出现问题,并且所有流量最终都会命中一台服务器,那么情况可能会急剧恶化

理想情况下,您应该运行或类似操作,以便更好地了解服务器的性能特征以及可能导致负载的因素(内存压力、锁定%、I/O、网络等等)。如果您可以将mongostat输出的采样发布到或类似的站点,这将非常有用

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

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

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

  • 降低NodeI上的初选,使NodeI和NodeII各有一个主次(而不是NodeI上的两个初选和NodeII上的两个二次)。主服务器和辅助服务器具有不同的写入特性,因此这可以更好地平衡负载

  • 检查碎片密钥和常见查询,以确认它们将合理地平衡读写。潜在的问题包括一个“热点”,其中对集合的所有写入都会命中一个碎片。。或者查询所有碎片以获得结果

  • 如果你没有从二级数据库中读取数据,测试性能的变化。这似乎有悖常理,但根据你的疑问的性质,从第二方阅读可能实际上会给你带来其他问题


最后,您提到使用1.8.2。MongoDB 2.0和2.2以及其他bug修复程序在性能和锁定/生成方面都有显著的改进。在您的开发环境中测试升级是值得的,因为这可能会解决您的一些问题。

,我正在使用java客户端连接mongoS,我担心如果客户端可以自动平衡到两个秒的读取请求,我是否需要一些特定的配置。很抱歉,这是什么意思:“您可能特别感兴趣的是指定标记集以选择辅助标记。“读取请求将在两个辅助设备之间自动平衡。如果愿意,可以在何时使用标记集读取哪个辅助对象上指定特殊规则,但这不是必需的。我提到它只是为了让你感兴趣时可以查看我提供的链接。如果你能发布更多详细信息,那会很有帮助:三台服务器的硬件规格,以及带有
节点I
节点II
输出的链接。非常感谢Stennie!你的回答非常详细,非常有帮助!我将尝试短期方法,几天后我将尝试根解决方案:添加新的分片复制集。顺便说一句,我有一个愚蠢的问题,我不明白“对辅助设备的写入通常会导致比主设备更高的I/O写入”?你是说二级的IO压力比一级重?我知道主oplog将许多更新减少为一个更新,然后将一个更新发送到次更新?那么为什么次更新的IO压力更大呢?提前感谢还有一个愚蠢的问题:当我使用mongostat时,如何检查“锁状态”,是否有锁阈值,如何是好的,如何是坏的。多谢各位@杰克:对不起,这不是对初级和中级性能特征的合理概括;它们可以根据许多因素而有所不同,包括您的阅读偏好和更新类型。通过多次更新,可以将应用于主服务器的单个语句转换为多个语句,以便中继到辅助服务器。至于
mongostat
中的锁定状态,您需要查看
lock%
。其实没有好坏之分,更多的是关于历史。扩展高锁%1不正确:)。如果可能,您应该将服务器添加到免费服务器。MMS提供了一些有用的操作和性能跟踪
nodeI   including:   shard1(primary) and shard2(primary)
nodeII  including:   shard1(secondary) and shard2(secondary)
nodeIII including:   shard1(arbiter) and shard2 (arbiter)