当前位置: 首页 > 面试题库 >

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

谷星文
2023-03-14
问题内容

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

容器如下所示:

$ 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
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()

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

Ping调用引发的错误如下:

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

谢谢大家的支持!


问题答案:

这是由于无法hostname从Docker主机解决的。在Docker中,实例mongo1,,mongo2mongo3可通过这些名称访问。但是,无法从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)。这里的问题是副本集设置为name
mongo<N>,驱动程序(在Docker主机中运行)无法解析这些名称。您可以通过尝试mongo1从Docker主机ping来确认这一点。

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

更新:

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

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

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



 类似资料:
  • 不返回任何文档。我还没有展开以包括字段。 我希望at仍然至少返回一个文档,但什么也没有显示。有人对我做错了什么(或者我如何做得更好)有什么建议、建议或指导吗?

  • 问题内容: 我想通过HTTP将数据推送到浏览器而不杀死django / python应用程序。 我决定使用彗星服务器,在我的应用程序和客户端之间代理请求(尽管我仍然没有真正弄清楚它)。 我研究了以下引擎:轨道彗星ejabberd码头 有没有人有使用这些服务器和部署它们的经验?关于这些主题的任何见解和链接都将很棒。谢谢。 问题答案: 我建议您在divmod中研究Twisted,twisted.web

  • 最近我使用的是mongodb java异步驱动程序,它是最新发布的。我正在写一些简单的测试代码,它们是: 所以您可以看到没有调用回调函数。有人知道为什么吗?

  • 我的Kubernetes集群运行在谷歌云下。我有部署运行端口443和LoadBalancer公开它到互联网。 我是这样创建的: 运行此命令后,loadbalancer将指向部署。现在,我创建了,并希望更改loadbalancer以指向新的部署()。 注意:删除和重新创建部署是释放外部IP地址,我想避免它。 如何在不丢失外部IP的情况下修补现有服务以指向另一个部署?

  • 有人能提供链接或代码片段吗? 附注:在官方mongodb站点中有同步事务示例,但我需要在Scala中的异步、非阻塞事务示例。

  • END OF LIFE NOTICE Version v2.2.0 was the final feature release of the MongoDB Perl driver andversion v2.2.2 is the final patch release. As of August 13, 2020, the MongoDB Perl driver and related libr