首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker和mongo-go-driver“服务器选择错误”

Docker和mongo-go-driver“服务器选择错误”
EN

Stack Overflow用户
提问于 2019-05-31 18:38:14
回答 1查看 10.2K关注 0票数 5

我使用Docker创建了一个MongoDB副本集,我可以使用控制台或Robo3T访问并运行任何查询。

容器如下所示:

代码语言:javascript
复制
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
efe6ae03323d        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30001->27017/tcp   mongo1
57d2701c8a43        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30002->27017/tcp   mongo2
7553966b9ff5        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30003->27017/tcp   mongo3

问题是当我尝试使用mongo-go-driver (我尝试使用版本1.0.0和1.0.2) ping时出现错误。

代码语言:javascript
复制
// Create MongoDB client    
client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:30001"))
if err != nil {
    t.Fatalf("Exit error: %v", err)
}

ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
err = client.Connect(ctx)
if err != nil {
    t.Fatalf("Exit error: %v", err)
}

ctx, cancel = context.WithTimeout(context.Background(), time.Minute)
defer cancel()

// Ping
err = client.Ping(ctx, readpref.Primary())
if err != nil {
    t.Fatalf("Exit error Ping: %v", err)
}

Ping调用引发的错误如下:

代码语言:javascript
复制
Exit error Ping: server selection error: server selection timeout
        current topology: Type: ReplicaSetNoPrimary
        Servers:
        Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
        Addr: mongo3:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo3: no such host
        Addr: mongo1:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo1: no such host

感谢大家的支持!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 13:35:27

这是由于Docker主机未解析hostname造成的。在Docker中,可以通过这些名称访问实例mongo1mongo2mongo3。但是,无法从Docker主机访问这些名称。这一点通过这一行很明显:

代码语言:javascript
复制
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host

MongoDB驱动程序将尝试从给定的副本集成员执行server discovery;它将查找副本集中的所有其他节点(通过rs.conf)。这里的问题是副本集被设置为名称mongo<N>,驱动程序(在Docker主机上运行)将无法解析这些名称。您可以通过尝试从Docker主机ping mongo1来确认这一点。

您可以尝试从与副本集共享相同Docker网络的另一个Docker实例运行应用程序。或者,修改Docker网络以允许可解析的主机名。

更新:

关于您对为什么使用mongo shell或PyMongo的评论。

这是由于连接模式的不同造成的。当指定单个节点时,即shell或PyMongo中的mongodb://node1:27017,不进行服务器发现。相反,它将尝试连接到该单个节点(不作为副本集的一部分)。问题是您需要连接到副本集的主节点才能写入(您必须知道是哪一个)。如果要作为副本集连接,则必须定义副本集名称。

mongo-go-driver不同,在默认情况下,它将执行服务器发现并尝试作为副本集进行连接。如果希望作为单个节点进行连接,则需要在连接URI中指定connect=direct。另请参阅Example Connect Direct

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56393513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档