我正在使用 Node.js+Express+Mongoose 连接到我的 MongoDB 副本集(3 个实例)。 我的印象是,当我使用 Mongoose 的“connectSet”命令从而连接到副本集时,我的查询将在我的副本集之间进行负载平衡。
但是,使用 nodetime ,我可以看到所有查询(包括 find() 查询)都转到副本集中的 PRIMARY 实例。
我是不是误会了什么?我缺少一些练习,还是副本集中的设置?我认为副本集的目的是平衡只读查询与副本集中的 SECONDARY MongoDB 服务器...
谢谢。
最佳答案
I was under the impression that when I used Mongoose's "connectSet" command, thereby connecting to the replica set, my queries would be load-balanced between my replica set.
这种印象是不正确的。
默认情况下,MongoDB 读写被发送到副本集的主要成员。副本集的主要目的是提供高可用性 (HA)。当主 Node 出现故障时,驱动程序将在现有连接上抛出异常,然后自动重新连接到任何被选为新主 Node 的 Node 。
这里的想法是驱动程序将在没有干预和配置更改的情况下找到新的主 Node 。
Is there some practice I am missing, or a setting in the replica set?
如果您真的想要将查询发送到辅助设备,您可以在查询上配置一个标志,声明“此查询可以发送到辅助设备”。这个的实现会有所不同,here's a version对于 Mongoose 。
请注意,向辅助 Node 发送查询不是默认行为,这里有很多陷阱。 MongoDB 的大多数实现都受到单写锁的限制,因此没有必要对读取进行负载平衡。分散读取并不能保证提高性能,而且很容易导致脏读。
在进行这样的负载平衡之前,请确定您绝对需要它。分片可能是更好的选择。
关于node.js - 如何使用 Node.js/Mongoose/MongoDB + ConnectSet 正确地进行负载平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325881/