gpt4 book ai didi

node.js - 让 Mongoose 重新连接到 Node 并向辅助 Node 发送请求时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:36 25 4
gpt4 key购买 nike

Mongoose 连接到副本集的常见连接字符串如下所示

var connection = mongoose.createConnection("mongodb://db_1:27017/client_test,mongodb://db_2:27017/client_test", { 
replSet : { rs_name : "rs0", poolSize : 5, socketOptions : { keepAlive : 1 } }
}, function(err) {
if (err) { throw err; }
});

问题是如果两台主机之一关闭,则它将无法连接。如果您只指定一台主机,则不会有任何请求最终发送到辅助主机。

这是我对这一说法的证明。如果您指定一台主机,并设置副本集,以便有一个主 Node 和一个仲裁 Node ,然后执行诸如

之类的查询
myApi.find({}).slaveOk().read("s").exec(function(err, docs) { 
console.log(docs)
})

它将返回结果。好吧,由于我指定了“s”(辅助),因此该查询应该抛出错误,因为没有正在运行的辅助。此外,如果您使辅助数据库联机,然后执行db.currentOp(true),您将永远不会看到任何以这种方式发送的实际查询。

当您更改连接字符串以指定每个主机时,您将看到连接转到辅助主机。现在的困境是,因为您必须在连接字符串中指定附加主机,所以如果辅助主机离线,它将无法连接,我们现在已经失去了故障转移(或到副本集的整个点)

我无法确定这是否是我的配置错误、Mongoose 中的错误,还是我对副本集功能理解的概念缺陷。从一些文档来看,他们似乎指出从辅助 Node 读取基本上是一个坏主意,但这样做的原因通常是陈旧数据的问题。我的问题与过时的日期没有任何关系,我无法找到一种方法来设置系统,以便我可以在不损失故障转移能力的情况下向辅助 Node 进行查询。

最佳答案

1.connection字符串仅定义种子服务器,mongodb驱动程序尝试连接到这些服务器并获取replicaSet中其他服务器的信息(通过调用rs.status())。您可以拥有包含 5 个 Node 的副本集,但在连接字符串中仅指定一个 Node ,但如果连接字符串中的服务器可用,则驱动程序将能够找到其他四个 Node 。

2.我的建议是使用SecondaryPreferred而不是仅仅Secondary,这样,如果没有可用的辅助 Node ,请求就会向主 Node 完成。

关于node.js - 让 Mongoose 重新连接到 Node 并向辅助 Node 发送请求时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com