使用Golang连接到MongoDB Atlas mgo:永久不可访问服务器到副本集 [英] Connecting to MongoDB Atlas using Golang mgo: Persistent no reachable server to replica set

查看:1497
本文介绍了使用Golang连接到MongoDB Atlas mgo:永久不可访问服务器到副本集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个来自mongodb地图集的副本集,我可以用任何其他语言连接到这个副本集,以及常规的mongo客户端,并提供以下格式的url: mongodb的://用户:pass@prefix1.mongodb.net:27017,prefix2.mongodb.net:27017,prefix3.mongodb.net:27017 /试验&安培; replicaSet = Cluster0-碎片-0安培; authSource =管理员



无论我尝试什么,添加ssl = true并删除,都无效。它总是无法访问服务器。



我尝试了每个组合的url,每个组合都用于dialConfig,还有Dial和DialWithConfig配置。
$ b

可能是什么原因?使用

docs.mongodb.com/ecosystem/drivers/go/rel =nofollow noreferrer> MongoDB Go Driver mgo )以下代码段连接到 MongoDB Atlas ,使用您的示例数据:
$ b $

  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},
数据库:authDatabaseN ame,
用户名:user,
密码: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无ssl = true 
var mongoURI =mongodb://用户名:密码@prefix1.mongodb.net,prefix2.mongodb .net,prefix3.mongodb.net / dbName?replicaSet = replName& authSource = admin

dialInfo,err:= mgo.ParseURL(mongoURI)

//下面的部分与上面类似。
tlsConfig =& tls.Config {}
dialInfo.DialServer = func(addr * mgo.ServerAddr)(net.Conn,error){
conn,err:= tls.Dial (tcp,addr.String(),tlsConfig)
返回conn,err
}
会话,_:= mgo.DialWithInfo(dialInfo)


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 ?

解决方案

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)

这篇关于使用Golang连接到MongoDB Atlas mgo:永久不可访问服务器到副本集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆