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

通过 docker 运行的 MongoDB 服务器无法相互看到(名称解析暂时失败)

通过 docker 运行的 MongoDB 服务器无法相互看到(名称解析暂时失败)

Go
饮歌长啸 2023-02-14 18:19:14
好的,我有一个在 M1 mac 上运行的 multipass vm。它托管一个 ubuntu 服务器。在这台 ubuntu 服务器上,我安装了 go、gin 和一系列其他相关技术。然后我去mongo。我首先创建复制集sudo docker network create mongoCluster然后我启动三个节点:sudo docker run -d -p 27017:27017 --name mongo1 --network mongoCluster -e MONGODB_INITDB_ROOT_USERNAME=myuser -e MONGODB_INITDB_ROOT_PASSWORD=mypassword -e MONGO_INITDB_DATABASE=task mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo1sudo docker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo2sudo docker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo3然后我初始化复制集sudo docker exec -it mongo1 mongosh --eval "rs.initiate({ _id: \"myReplicaSet\", members: [   {_id: 0, host: \"mongo1\"},   {_id: 1, host: \"mongo2\"},   {_id: 2, host: \"mongo3\"} ]})"运行sudo docker exec -it mongo2 mongosh --eval "rs.status()"显示我已经正确设置了 mongo1 作为 PRIMARY到目前为止,一切都很好!然后我启动我的应用程序并与 uri 建立连接:mongodb://myuser:mypassword@localhost:27017/?retryWrites=true&w=majority Mongo 抛出一个错误Failed to ping cluster,但它随后报告它已连接然后它抛出这个:Could not create Task: server selection error: context deadline exceeded, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mongo1:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo1: Temporary failure in name resolution }, { Addr: mongo2:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo2: Temporary failure in name resolution }, { Addr: mongo3:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo3: Temporary failure in name resolution }, ] }所以看起来各个节点看不到对方我已经在 googs 上搜索了一段时间,但似乎没有任何东西可以解决我的具体问题我什至花钱参加培训课程来解决这个问题,但我没有。请帮忙!
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

这里有几个问题。


首先和MONGODB_INITDB_ROOT_USERNAME都是MONGODB_INITDB_ROOT_PASSWORD错误的。他们应该是MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_USERNAME。


问题是mongo1启动后不久就会崩溃,因为它需要一个secret.key. 检查日志,您将看到错误。解决这个问题是另一个问题。


我建议先尝试不进行身份验证。这是有效的方法:


您缺少的步骤:


echo 127.0.0.1 mongo1 >> /etc/hosts

数据库启动脚本:


#!/bin/bash


docker container rm -f mongo1 mongo2 mongo3


docker run -d -p 27017:27017 --name mongo1 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all


docker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all


docker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all


docker exec -it mongo1 mongosh --eval "rs.initiate({

 _id: \"myReplicaSet\",

 members: [

   {_id: 0, host: \"mongo1\"},

   {_id: 1, host: \"mongo2\"},

   {_id: 2, host: \"mongo3\"}

 ]

})"

go中的测试程序:


package main


import (

    "context"

    "fmt"

    "time"


    "go.mongodb.org/mongo-driver/mongo"

    "go.mongodb.org/mongo-driver/mongo/options"

    "go.mongodb.org/mongo-driver/mongo/readpref"

)


const uri = "mongodb://mongo1:27017/task?replicaSet=myReplicaSet&retryWrites=true&w=majority"


func main() {


    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

    defer cancel()


    client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

    if err != nil {

        panic(err)

    }

    defer func() {

        if err = client.Disconnect(ctx); err != nil {

            panic(err)

        }

    }()


    if err := client.Ping(ctx, readpref.Primary()); err != nil {

        panic(err)

    }


    fmt.Println("Successfully connected and pinged")

}

运行这个,你应该得到一个成功的响应:


> go run ./main.go 

Successfully connected and pinged

另外我认为您不需要映射主机上的所有副本端口。这应该使事情更清洁。


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

添加回答

举报

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