首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用猫鼬将node.js连接到MongoDB中的切分副本集群的正确方法

使用猫鼬将node.js连接到MongoDB中的切分副本集群的正确方法
EN

Stack Overflow用户
提问于 2016-06-13 14:33:16
回答 1查看 2.3K关注 0票数 4

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

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

代码语言:javascript
复制
mongodb://Host1:27017,Host2:27017/DatabaseName

然后,在连接的options对象中,我传递了以下内容:

代码语言:javascript
复制
{mongos: true}

这看起来挺好的。但是,在实现副本集之后,每当我传递mongos选项时,应用程序就不会连接。我们的集群现在已经设置好了,这样在两个副本集中就有4个MongoDB服务器,每个副本集有两个服务器。每个副本集中的主服务器也运行一个mongos路由器实例。我以为我应该能像以前那样连接,但是它从来没有连接过。如果我只使用一个没有选项的碎片创建连接,应用程序就会连接得很好。然而,这并不理想,因为关键在于路由器实例之间存在冗余。这里有人能提供一些洞察力吗?

下面是sh.status()的输出:

代码语言:javascript
复制
--- 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(),这里是第一个主节点的输出:

代码语言:javascript
复制
{
    "_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")
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 17:04:56

好吧,所以我终于想出来了。我查看了服务器上的日志,发现客户机正在尝试连接,并且没有使用SSL,因此服务器一直在引导。这让我感到困惑,因为我在服务器选项中设置了SSL,并且拥有正确的密钥和cert包,因为我能够连接到一个实例。然后,我查看了mongo驱动程序选项这里。,它表明您需要为mongos本身设置一些关于SSL的选项。在显式设置这些之后,我能够连接。

总之,此options对象允许我连接:

代码语言:javascript
复制
var options = {
  "server": {
    "ssl": true,
    "sslCA": sslCAbuffer,
    "sslCert": sslCertbuffer,
    "sslKey": sslKeybuffer
  },
  "mongos": {
    "ssl": true,
    "sslCA": sslCAbuffer,
    "sslCert": sslCertbuffer,
    "sslKey": sslKeybuffer
  }
}

虽然此options对象没有:

代码语言:javascript
复制
var options = {
  "server": {
    "ssl": true,
    "sslCA": sslCAbuffer,
    "sslCert": sslCertbuffer,
    "sslKey": sslKeybuffer
  },
  "mongos": true
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37792475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档