亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 docker 運行的 MongoDB 服務器無法相互看到(名稱解析暫時失?。?/h1>

好的,我有一個在 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 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號