如何使用Node.js/Mongoose/MongoDB + ConnectSet正确加载平衡?

Zan*_*aes 3 mongoose mongodb node.js

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

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

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

谢谢.

Gat*_* VP 5

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

这种印象不正确.

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

这里的想法是驱动程序将找到新的主数据库,没有干预,也没有配置更改.

是否有一些我缺少的练习,或副本集中的设置?

如果您确实要向辅助节点发送查询,则可以在查询上配置一个标志,指出"此查询可以发送到辅助节点".这个的实现会有所不同,这是 Mongoose 的一个版本.

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

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