在MongoDB中添加新的辅助服务器以分配负载
我在三台机器上有两个碎片(使用mongodb 1.8.2): NodeII的负载越来越高(CPU和IO),NodeI也很高,但比NodeII好一点 在java客户机中,我将代码指定为仅查询NodeII,而NodeI仅用于编写 我计划将NodeII从仲裁器转换为辅助服务器,以共享NodeII上的读取负载在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>只要仲裁器硬件与你的次要设备有相似的规格,你建议的方法似乎是合理的,因为它将分发次要读取。通常仲裁器的硬
你认为这是个好主意吗?如果我这样做,我应该考虑什么,或者你有其他建议来降低负载吗?
< P>只要仲裁器硬件与你的次要设备有相似的规格,你建议的方法似乎是合理的,因为它将分发次要读取。通常仲裁器的硬件规格很低,或者在共享硬件上,但我假设在您的配置中不是这样 如果副本集中的服务器数量为奇数,则不再需要仲裁器您可能想这样做,尤其是您可能对指定标记集以选择辅助对象感兴趣。从辅助对象读取不一定像您所期望的那样“分配”负载。如果没有找到性能问题的根源,您可能只会面临更多的挑战 特别是,向现有服务器添加辅助服务器将:
- 增加添加辅助服务器的服务器上的I/O负载(您现在正在复制和写入数据的完整额外副本)
- 为从辅助服务器同步的服务器读取提供更多争用
- 在大量读取活动期间,可能会导致次映像落后于主映像(如果您希望具有很强的一致性,则可能会引起关注)
- 移除仲裁器并将其替换为辅助节点。这将在一台服务器出现故障时提供额外的数据冗余,并有助于防止所有负载降落在一台服务器上
- 降低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)