【问题标题】:Correct way to connect node.js to a sharded replica cluster in MongoDB using mongoose使用 mongoose 将 node.js 连接到 MongoDB 中的分片副本集群的正确方法
【发布时间】:2016-06-13 14:33:16
【问题描述】:

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

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

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

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

{mongos: true}

这似乎工作得很好。但是,在实现副本集之后,每当我通过 mongos 选项时,应用程序就永远不会连接。我们的集群现在已设置好,因此在 2 个副本集中有 4 个 MongoDB 服务器,每个副本集 2 个服务器。每个副本集中的 master 也运行一个 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")
    }
}

【问题讨论】:

  • 你能转储 rs.config() 输出吗?
  • 所以我尝试从 mongos shell 运行 rs.config(),但我得到了这个:2016-06-13T15:15:23.893+0000 E QUERY [thread1] Error: error: { "$err" : "can't use 'local' database through mongos", "code" : 20 } :
  • 道歉 - rs 用于副本集.....你能运行sh.status()
  • 我编辑了帖子以包含 sh.status 和 rs.status

标签: node.js mongodb mongoose


【解决方案1】:

好吧,我终于想通了。我浏览了服务器上的日志,发现客户端正在尝试连接并且没有使用 SSL,因此一直被服务器引导。这让我感到困惑,因为我在服务器选项中设置了 SSL 并拥有正确的密钥和证书包,因为我能够很好地连接到单个实例。然后我查看了 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
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多