dsaf415212 2016-12-15 21:35
浏览 164

使用Golang mgo连接到MongoDB Atlas:永久性无可达服务器到副本集

I have a replica set from mongodb atlas, to which I can connect with ANY other language, and regular mongo client, with the url provided with the format :

"mongodb://user:pass@prefix1.mongodb.net:27017,prefix2.mongodb.net:27017,prefix3.mongodb.net:27017/test?&replicaSet=Cluster0-shard-0&authSource=admin"

No matter what I tried, adding ssl=true and removing, nothing works. It is always "no reachable server".

I tried every single combination for url, every combination for dialConfig, and also Dial and DialWithConfig configurations.

What could be the reason ?

  • 写回答

1条回答 默认 最新

  • dongqin1075 2017-03-01 03:40
    关注

    Using MongoDB Go driver mgo code snippet below to connect to MongoDB Atlas works, using your example data:

    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)
    

    Note that you can also specify only one of the replica set members as a seed. For example:

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

    See also:

    Update:

    You could also use ParseURL() method to parse MongoDB Atlas URI string. However, currently this method does not support SSL (mgo.V2 PR:304)

    A work around is to take out the ssl=true line before parsing.

    //URI without ssl=true
    var mongoURI = "mongodb://username:password@prefix1.mongodb.net,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)
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?