【发布时间】:2023-03-31 16:35:01
【问题描述】:
这可能是我误解了 Mongo 的工作原理/新的 Go 开发 - 但我无法从 Go 连接到我的 mongo 实例。当我使用 Studio 3T 连接到我的 Mongo 实例时,我可以正常连接、浏览表格等。但是如果我尝试使用 Go 模块进行连接,它会抱怨无法找到所有节点。它是否必须能够访问所有节点?我认为副本集本身应该处理复制?
例如,我有这个 Go 代码:
package main
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"log"
"time"
)
func main() {
log.Println("Hello World!")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://MongoInsance:27017"))
if err != nil {
log.Fatal("Failed to connect to Mongo DB", err)
}
if err := client.Ping(ctx, readpref.Primary()); err != nil {
log.Fatal("Not actually connected ", err)
}
res, err := client.ListDatabases(ctx, nil)
if err != nil{
log.Fatal("Failed to list databases")
}
for _, val := range res.Databases {
log.Println(val.Name)
}
defer disconnect(client, &ctx)
}
func disconnect(client *mongo.Client, ctx *context.Context) {
if err := client.Disconnect(*ctx); err != nil {
panic(err)
}
}
但是我在运行上述代码时得到的响应给出了错误:
Not actually connected server selection error: context deadline exceeded, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mqtt-ingester-db-mast:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-mast: no such host }, { Addr: mqtt-ingester-db-rep1:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep1: no such host }, { Addr: mqtt-ingester-db-rep2:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep2: no such host }, ] }
我真的需要公开所有副本集吗? 目前我有主节点和 2 个辅助节点在主机 MongoInstance 上的 docker 中运行,主节点连接到端口 27017:
docker-compose.yml
services:
...
mqtt-ingester-db-mast:
container_name: mqtt-ingester-db-mast
restart: always
image: mongo:latest
ports:
- 27017:27017
volumes:
- 'mongo_main:/data/db'
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
mqtt-ingester-db-rep1:
container_name: mqtt-ingester-db-rep1
restart: always
image: mongo:latest
expose:
- 27017
volumes:
- 'mongo_rep1:/data/db'
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
mqtt-ingester-db-rep2:
container_name: mqtt-ingester-db-rep2
restart: always
image: mongo:latest
expose:
- 27017
volumes:
- 'mongo_rep2:/data/db'
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
mqtt-ingester-setup:
image: mongo:latest
container_name: mqtt-ingester-setup
links:
- mqtt-ingester-db-mast:mqtt-ingester-db-mast
- mqtt-ingester-db-rep1:mqtt-ingester-db-rep1
- mqtt-ingester-db-rep2:mqtt-ingester-db-rep2
depends_on:
- mqtt-ingester-db-mast
- mqtt-ingester-db-rep1
- mqtt-ingester-db-rep2
volumes:
- ./mqtt-ingester:/scripts
restart: "no"
entrypoint: [ "bash", "/scripts/mqtt_ingester_setup.sh" ]
mqtt-ingester-explorer:
container_name: mqtt-ingester-explorer
restart: always
image: mongo-express:latest
ports:
- '8081:8081'
depends_on:
- mqtt-ingester-db-mast
links:
- mqtt-ingester-db-mast:mongo
...
【问题讨论】:
标签: mongodb go docker-compose