因此,除了我们已经实现的切分之外,最近我们重新设计了我们的MongoDB数据库集群,以使用SSL和副本集。SSL不太难工作,我们只需要将私钥和证书分开,然后一切正常工作。然而,事实证明,要让我的Node.js应用程序连接到两个mongos实例比我预期的要困难。
在实现副本集之前,我们只有两个碎片,每个碎片运行一个mongos路由器,在mongos中,我给它提供了以下连接字符串:
mongodb://Host1:27017,Host2:27017/DatabaseName然后,在连接的options对象中,我传递了以下内容:
{mongos: true}这看起来挺好的。但是,在实现副本集之后,每当我传递mongos选项时,应用程序就不会连接。我们的集群现在已经设置好了,这样在两个副本集中就有4个MongoDB服务器,每个副本集有两个服务器。每个副本集中的主服务器也运行一个mongos路由器实例。我以为我应该能像以前那样连接,但是它从来没有连接过。如果我只使用一个没有选项的碎片创建连接,应用程序就会连接得很好。然而,这并不理想,因为关键在于路由器实例之间存在冗余。这里有人能提供一些洞察力吗?
下面是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(),这里是第一个主节点的输出:
{
"_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")
}
}发布于 2016-06-13 17:04:56
好吧,所以我终于想出来了。我查看了服务器上的日志,发现客户机正在尝试连接,并且没有使用SSL,因此服务器一直在引导。这让我感到困惑,因为我在服务器选项中设置了SSL,并且拥有正确的密钥和cert包,因为我能够连接到一个实例。然后,我查看了mongo驱动程序选项这里。,它表明您需要为mongos本身设置一些关于SSL的选项。在显式设置这些之后,我能够连接。
总之,此options对象允许我连接:
var options = {
"server": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
},
"mongos": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
}
}虽然此options对象没有:
var options = {
"server": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
},
"mongos": true
}我认为服务器对象可能是多余的,但我把它留在了里面。
https://stackoverflow.com/questions/37792475
复制相似问题