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

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

Docker 和 mongo-go-driver “服務器選擇錯誤”

Docker 和 mongo-go-driver “服務器選擇錯誤”

Go
心有法竹 2023-06-19 17:40:36
我使用 Docker 設置并運行了一個 MongoDB 副本,我可以通過控制臺或 Robo3T 客戶端進行訪問,并運行任何查詢。這些是容器:$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMESefe6ae03323d        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30001->27017/tcp   mongo157d2701c8a43        mongo               "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:30002->27017/tcp   mongo27553966b9ff5        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()// Pingerr = client.Ping(ctx, readpref.Primary())if err != nil {    t.Fatalf("Exit error Ping: %v", err)}錯誤如下: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
查看完整描述

1 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

這是由于hostnameDocker 主機未解決。在 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)。這里的問題是副本集設置了名稱mongo<N>,驅動程序(在 Docker 主機中運行)將無法解析這些名稱。您可以通過嘗試從 Docker 主機 ping 來確認這一點mongo1

您可以嘗試從與副本集共享同一 Docker 網絡的另一個 Docker 實例運行應用程序?;蛘撸薷?Docker 網絡以允許可解析的主機名。

這是由于連接方式的不同。當指定單個節點時,即mongodb://node1:27017在 shell 或 PyMongo 中,不會進行服務器發現。相反,它將嘗試連接到該單個節點(而不是作為副本集的一部分)。問題是您需要連接到副本集的主節點才能寫入(您必須知道是哪一個)。如果您想作為副本集連接,則必須定義副本集名稱。

與 相比mongo-go-driver,默認情況下它將執行服務器發現并嘗試作為副本集進行連接。如果您想作為單個節點連接,則需要connect=direct在連接 URI 中指定。


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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