3

我正在使用 Node.js+Express+Mongoose 连接到我的 MongoDB 副本集(3x 实例)。我的印象是,当我使用 Mongoose 的“connectSet”命令,从而连接到副本集时,我的查询将在我的副本集之间进行负载平衡。

但是,使用nodetime,我可以看到所有查询(包括 find() 查询)都将转到副本集中的 PRIMARY 实例。

我在这里误解了什么吗?是否有一些我遗漏的练习,或者副本集中的设置?我认为副本集的目的是平衡只读查询与集合中的 SECONDARY MongoDB 服务器......

谢谢。

4

1 回答 1

5

我的印象是,当我使用 Mongoose 的“connectSet”命令,从而连接到副本集时,我的查询将在我的副本集之间进行负载平衡。

这种印象是不正确的。

默认情况下,MongoDB 读取和写入发送到副本集的主成员。副本集的主要目的是提供高可用性 (HA)。当主节点关闭时,驱动程序将在现有连接上抛出异常,然后自动重新连接到任何被选为新主节点的节点。

这里的想法是驱动程序将在没有干预和配置更改的情况下找到新的主节点。

是否有一些我遗漏的练习,或者副本集中的设置?

如果您真的想将查询发送到辅助服务器,您可以在查询上配置一个标志,说明“此查询可以发送到辅助服务器”。实现会有所不同,这里是Mongoose 的一个版本。

请注意,向辅助节点发送查询不是默认行为,这里有很多陷阱。MongoDB 的大多数实现都受到单个写入锁的限制,因此不需要对读取进行负载平衡。分散读取并不能保证提高性能,并且很容易导致脏读。

在进行这样的负载平衡之前,请确保您绝对需要它。分片可能是更好的选择。

于 2012-09-07T23:10:21.163 回答