为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
心有法竹 2023-06-19 17:40:36
我使用 Docker 设置并运行了一个 MongoDB 副本,我可以通过控制台或 Robo3T 客户端进行访问,并运行任何查询。这些是容器:$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMESefe6ae03323d        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30001->27017/tcp   mongo157d2701c8a43        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30002->27017/tcp   mongo27553966b9ff5        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30003->27017/tcp   mongo3问题是当我尝试使用mongo-go-driver进行 ping 时出现错误(我尝试使用版本 1.0.0 和 1.0.2)// 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()// Pingerr = client.Ping(ctx, readpref.Primary())if err != nil {    t.Fatalf("Exit error Ping: %v", err)}错误如下: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
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这是由于hostnameDocker 主机未解决。在 Docker 中,实例mongo1mongo2mongo3可以通过这些名称访问。但是,无法从 Docker 主机访问这些名称。这行很明显:

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 网络以允许可解析的主机名。

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

与 相比mongo-go-driver,默认情况下它将执行服务器发现并尝试作为副本集进行连接。如果您想作为单个节点连接,则需要connect=direct在连接 URI 中指定。


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信