gpt4 book ai didi

node.js - 使用 mongoose 将 node.js 连接到 MongoDB 中的分片副本集群的正确方法

转载 作者:可可西里 更新时间:2023-11-01 09:54:38 28 4
gpt4 key购买 nike

最近我们重新设计了我们的 MongoDB 数据库集群,除了我们已经实现的分片之外,还使用了 SSL 和副本集。 SSL 工作起来并不难,我们只需要拆分私钥和证书,然后一切正常。然而,事实证明,让我的 Node.js 应用程序连接到两个 mongos 实例比我预期的要困难。

在我们实现副本集之前,我们只有两个分片,每个分片都运行一个 mongos 路由器,在 mongoose 中我给它以下连接字符串:

mongodb://Host1:27017,Host2:27017/DatabaseName

然后,在连接的选项对象中,我传入了以下内容:

{mongos: true}

这似乎工作得很好。但是,在实现副本集后,每当我通过 mongos 选项时,应用程序都不会连接。我们的集群现在已经设置好,所以在 2 个副本集中有 4 个 MongoDB 服务器,每个副本有 2 个服务器。每个副本集中的主 Node 也运行一个 mongos 路由器实例。我以为我应该能够像以前一样连接,但它永远不会连接。如果我仅使用 1 个分片创建连接而没有任何选项,则应用程序连接正常。然而,这并不理想,因为重点是在路由器实例之间实现冗余。任何人都可以在这里提供一些见解吗?

这里是 sh.status() 的输出:

--- Sharding Status --- 
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("57571fc5bfe098f05bbbe370")
}
shards:
{ "_id" : "rs0", "host" : "rs0/mongodb-2:27018,mongodb-3:27018" }
{ "_id" : "rs1", "host" : "rs1/mongodb-4:27018,mongodb-5:27018" }
active mongoses:
"3.2.7" : 4
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "Demo", "primary" : "rs0", "partitioned" : true }

我被要求输出 rs.config(),这是来自第一个主 Node 的:

{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongodb-2:27018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongodb-3:27018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("57571692c490a699f61e3784")
}
}

最佳答案

好吧,我终于明白了。我浏览了服务器上的日志,看到客户端正在尝试连接并且没有使用 SSL,因此一直被服务器引导。这让我感到困惑,因为我在服务器选项中设置了 SSL 并拥有正确的 key 和证书包,因为我能够很好地连接到单个实例。然后我查看了 mongo 驱动程序选项 here.它表明您需要为 mongos 本身设置有关 SSL 的选项。明确设置这些后,我就可以连接了。

总而言之,这个选项对象允许我连接:

var options = {
"server": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
},
"mongos": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
}
}

虽然这个选项对象没有:

var options = {
"server": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
},
"mongos": true
}

我认为服务器对象可能是多余的,但我把它留下了。

关于node.js - 使用 mongoose 将 node.js 连接到 MongoDB 中的分片副本集群的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37792475/

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