2016-06-13 3 views
3

最近、私たちがすでに実装していたシャーディングに加えて、MongoDBデータベースクラスタをSSLとレプリカセットを使用するように再設計しました。 SSLが機能するにはそれほど難しくありませんでした。私たちは秘密鍵と証明書を分割するだけでした。しかし、両方のmongosインスタンスに接続するためにNode.jsアプリケーションを取得することは、予想以上に困難であることが判明しています。mongooseを使用してnode.jsをMongoDBの断片化されたレプリカクラスタに接続する方法

我々はレプリカセットを実装する前に、私達はちょうど2個の破片、mongosルータを実行しているそれらのそれぞれを持っていた、とマングースで、私はそれを次の接続文字列を与えたが:

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

その後、オプションでは、に反対します接続、私は以下を渡した:

{mongos: true} 

これはうまくいくようです。しかし、レプリカセットが実装された後、mongosオプションを渡すたびに、アプリケーションは決して接続されません。私たちのクラスタは、それぞれ2台のサーバからなる2つのレプリカセットに4つのMongoDBサーバが存在するように設定されています。各レプリカセットのマスターは、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

あなたがrs.configを()の出力をダンプするだろうか? – profesor79

+0

mongosシェルからrs.config()を実行しようとしましたが、これが表示されます: '2016-06-13T15:15:23.893 + 0000 E QUERY [thread1]エラー:エラー:{" $ err ":" 20}: ' –

+0

apologies - rsはレプリカセットです.....' sh.status() 'を実行することができます – profesor79

答えて

0

よし私はついにそれを理解しました。私はサーバーのログを調べて、クライアントが接続しようとしていて、SSLを使用していないことがわかったので、サーバーによって起動されていました。これは私には混乱していました。なぜなら、サーバーオプションにSSLを設定し、正しいキーと証明書のバンドルを持っていたからです。そして、私はそれはあなたがSSLに関するmongos自身のために設定する必要があるオプションがあることを示してhere.のmongoドライバオプションを通じて見えました。これらを明示的に設定した後、私は接続することができました。要約すると

、このオプションのオブジェクトは、私が接続を許可:

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 
} 

私は、サーバーオブジェクトは、おそらく冗長であると思うが、私はそれを左に。

関連する問題