最近我们重新设计了MongoDB数据库集群,除了我们已经实现的分片外,还使用了SSL和副本集。 SSL并不太难以开始工作,我们只需要拆分私钥和证书,然后一切正常。然而,让我的Node.js应用程序连接到两个mongos实例证明比我预期的更困难。
在我们实现副本集之前,我们只有两个分片,每个分片运行一个mongos路由器,而在mongoose中,我给它提供了以下连接字符串:
mongodb://Host1:27017,Host2:27017/DatabaseName
然后,在连接的options对象中,我传递了以下内容:
{mongos: true}
这似乎工作得很好。但是,在实现副本集之后,每当我传递mongos选项时,应用程序都不会连接。我们的集群现在已经设置好,因此每个服务器中有4个MongoDB服务器,每个服务器有2个服务器。每个副本集中的主服务器也运行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(),这是来自第一个主节点:
{
"_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")
}
}
答案 0 :(得分:0)
好吧,所以我终于明白了。我浏览了服务器上的日志,发现客户端正在尝试连接,并且没有使用SSL,因此不断被服务器启动。这让我感到困惑,因为我在服务器选项中设置了SSL并拥有正确的密钥和证书包,因为我能够连接到单个实例就好了。然后我浏览了mongo驱动程序选项here.它表明你需要为mongos本身设置关于SSL的选项。明确地设置后,我能够连接。
总之,这个选项对象允许我连接:
th
虽然这个选项对象没有:
var options = {
"server": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
},
"mongos": {
"ssl": true,
"sslCA": sslCAbuffer,
"sslCert": sslCertbuffer,
"sslKey": sslKeybuffer
}
}
我认为服务器对象可能是多余的,但我把它留在了。