2016-12-15 9 views
3

他の言語と通常のmongoクライアントとの接続が可能なmongodb atlasのレプリカセットを用意しています。Golang mgoを使用してMongoDB Atlasに接続する:レプリカセットを永続的に到達不可能なサーバ

「のMongoDB://ユーザー:[email protected]:27017、prefix2.mongodb.net:27017、prefix3.mongodb.net:?27017 /テスト&さらにreplicaSet = Cluster0-シャード - 0 &認証発信元=管理者 "

私が何を試しても、ssl = trueを追加して削除すると、何も動作しません。常に「到達可能なサーバーなし」です。

私はurl、dialConfigのすべての組み合わせ、およびDialとDialWithConfigの設定について、あらゆる組み合わせを試しました。

何故その理由が考えられますか?あなたの例のデータを使用して、MongoDB Atlas作品に接続するには、以下のMongoDB Go Drivermgo)コードスニペットを使用して

+0

これに関するアップデートはありますか? – Marcel

答えて

6

:あなたはまた、シードとしてレプリカセットのメンバーを1つだけ指定することができます

import (
    "gopkg.in/mgo.v2" 
    "crypto/tls" 
    "net" 
) 

tlsConfig := &tls.Config{} 

dialInfo := &mgo.DialInfo{ 
    Addrs: []string{"prefix1.mongodb.net:27017", 
        "prefix2.mongodb.net:27017", 
        "prefix3.mongodb.net:27017"}, 
    Database: "authDatabaseName", 
    Username: "user", 
    Password: "pass", 
} 
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { 
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig) 
    return conn, err 
} 
session, err := mgo.DialWithInfo(dialInfo) 

注意。たとえば、次のように

Addrs: []string{"prefix2.mongodb.net:27017"} 

も参照してください:

更新

ParseURL()メソッドを使用して、MongoDB Atlas URI文字列を解析することもできます。ただし、現在このメソッドはSSLをサポートしていません(mgo.V2 PR:304

回避するには、解析する前にssl=true行を取り出してください。

//URI without ssl=true 
var mongoURI = "mongodb://username:[email protected],prefix2.mongodb.net,prefix3.mongodb.net/dbName?replicaSet=replName&authSource=admin" 

dialInfo, err := mgo.ParseURL(mongoURI) 

//Below part is similar to above. 
tlsConfig := &tls.Config{} 
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { 
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig) 
    return conn, err 
} 
session, _ := mgo.DialWithInfo(dialInfo) 
+0

代わりに 'dialInfo'がこの方法で生成された場合、接続文字列がどのように見えるかについてアドバイスできますか? 'dialInfo、err:= mgo.ParseURL(url)'。感謝。 – Marcel

+1

@Marcel更新された回答を参照してください。 –

関連する問題