2016-06-13 14 views
3

因此,最近我們重新設計了我們的MongoDB數據庫集羣,以使用SSL和副本集以及我們已經實現的分片。 SSL並不太難以工作,我們只需要分離私鑰和證書,然後一切正常。然而,讓我的Node.js應用程序連接到兩個mongos實例證明比我預期的更困難。使用mongoose將node.js連接到MongoDB中的分片複製集羣的正確方法

之前,我們實現副本集,我們剛剛經歷了兩個碎片,它們中的每運行一個mongos路由器,並在貓鼬我給它下面的連接字符串:

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

然後,在選擇反對連接,我通過如下:

{mongos: true} 

這似乎工作得很好。但是,在實現副本集之後,只要我傳遞了mongos選項,應用程序就不會連接。我們的集羣現在已經安裝完畢,因此有4個MongoDB服務器,每個服務器有2個副本,每個副本有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(),這裏是從第1主節點:

{ 
    "_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

你可以轉儲rs.config()輸出嗎? – profesor79

+0

所以我試圖從mongos shell運行rs.config(),但我得到這個: '2016-06-13T15:15:23.893 + 0000 E QUERY [thread1]錯誤:錯誤:{「$ err」:「不能使用'本地'數據庫通過mongos「,」代碼「:20}:' –

+0

道歉 - rs是爲副本集.....你可以運行'sh.status()' – profesor79

回答

0

好吧,所以我終於明白了。我瀏覽了服務器上的日誌,發現客戶端正在嘗試連接並且沒有使用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 
} 

我認爲,服務器對象可能是多餘的,但我把它放在