【发布时间】:2015-11-19 21:55:19
【问题描述】:
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; }
});
这样的问题是,如果两台主机中的一台出现故障,那么它将无法连接。如果您只指定一台主机,则最终不会向辅助主机发送任何请求。
这是我对该声明的证明。如果您指定一台主机,并设置您的副本集,以便有一个主服务器和一个仲裁器,然后执行查询,例如
myApi.find({}).slaveOk().read("s").exec(function(err, docs) {
console.log(docs)
})
它会返回结果。好吧,因为我指定了“s”(辅助),所以这个查询应该抛出一个错误,因为没有正在运行的辅助。此外,如果您将辅助服务器联机,然后执行db.currentOp(true),您将永远不会看到任何实际查询以它的方式发送。
当您更改连接字符串以指定每个主机时,您将看到连接转到辅助服务器。现在的困境是,因为你必须在连接字符串中指定额外的主机,如果辅助节点离线,它将无法连接,我们现在已经失去了故障转移(或整个指向副本集)
我无法确定这是我的配置错误、Mongoose 中的错误,还是我对副本集功能方式的理解存在概念缺陷。从一些文档中,他们似乎说从辅助文件中读取基本上是一个坏主意,但这样做的原因通常是陈旧数据的问题。我的问题与过期日期没有任何关系,我想不出一种方法来设置系统,以便在不丢失故障转移能力的情况下获取对辅助节点的查询。
【问题讨论】: