Lor*_*oro 4 go mongodb mongodb-query docker
我使用 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
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试使用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)
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
谢谢大家的支持!
Wan*_*iar 14
这是由于hostnameDocker 主机未解决。在 Docker 中,可以通过这些名称访问实例mongo1、mongo2和mongo3。但是,无法从 Docker 主机访问这些名称。这行很明显:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Run Code Online (Sandbox Code Playgroud)
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 中指定。另见示例连接直接
| 归档时间: |
|
| 查看次数: |
9407 次 |
| 最近记录: |