使用mongoose

时间:2016-06-13 14:33:17

标签: node.js mongodb mongoose

最近我们重新设计了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")
    }
}

1 个答案:

答案 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
  }
}

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