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

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

MongoDB Go驅動程序在不應該的時候尋找本地主機

MongoDB Go驅動程序在不應該的時候尋找本地主機

Go
拉風的咖菲貓 2023-07-17 17:09:50
我不是 Go 人,只需要使用用 Go 編寫的插件,我在插件和 MongoDB 之間遇到了一些麻煩。錯誤是:server selection error: server selection timeoutcurrent topology: Type: UnknownServers:Addr: localhost:27017, Type: Unknown, State: Connected, Avergage RTT: 0, Last error: dial tcp 127.0.0.1:27017: connect: connection refusedexit status 1我的配置:time=“2019-09-03T16:29:35Z” level=debug msg=“Host: ip-XXX-XX-XX-XXX.sa-east-1.compute.internal”time=“2019-09-03T16:29:35Z” level=debug msg=“Port: 27017”time=“2019-09-03T16:29:35Z” level=debug msg=“Username: user”time=“2019-09-03T16:29:35Z” level=debug msg=“Password: user123*”time=“2019-09-03T16:29:35Z” level=debug msg=“DBName: dbBackend”執行連接的插件代碼段:addr := fmt.Sprintf("mongodb://%s:%s", m.Host, m.Port)to := 60 * time.Secondopts := options.ClientOptions{    ConnectTimeout: &to,}opts.ApplyURI(addr)if m.Username != "" && m.Password != "" {    opts.Auth = &options.Credential{        AuthSource:  m.DBName,        Username:    m.Username,        Password:    m.Password,        PasswordSet: true,    }}client, err := mongo.Connect(context.TODO(), &opts)if err != nil {    return m, errors.Errorf("couldn't start mongo backend. error: %s\n", err)}err1 := client.Ping(context.TODO(), nil)if err1 != nil {        log.Fatal(err1) // error happens here} log.Debugf("MONGO CONNECTED")m.Conn = clientreturn m, nil如果我正在設置 mongoDB 服務器的地址,我只是無法意識到為什么 mongo 驅動程序會在本地主機上查找。
查看完整描述

1 回答

?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

為什么 mongo 驅動程序在 localhost 上尋找,如果我正在設置 mongoDB 服務器的地址。

當mongo-go-driver的客戶端連接到MongoDB部署時,它將執行服務器發現和監控以發現一個或多個服務器(MongoDB本質上是一個分布式數據庫)。早期步驟之一是通過在所有服務器上調用?isMaster 命令來開始監視拓撲。根據isMaster的輸出,客戶端將嘗試聯系這些服務器。對于副本集(您的情況),客戶端會努力連接到主服務器(從?isMaster.primary)。

但是,主機名地址不是可從客戶端計算機解析的完全限定域名 (FQDN)??蛻舳说挠嬎銠C嘗試連接到定義為副本集的主副本集,因此無法建立連接。此外,這就是為什么您會看到消息狀態,其中 但是 .即使在能夠選擇要執行命令的服務器 (localhostcurrent topology: Type: UnknownState: Connectedping)

您可以通過為副本集配置中的成員字段的值設置可解析的主機名來解決此問題。此外,如果可能,請使用邏輯 DNS 主機名而不是 IP 地址,因為這可以避免由于 IP 地址更改而導致的配置更改。

您可以使用?rs.reconfig()?更改副本集主機名,即:

cfg?=?rs.conf()
cfg.members[1].host?=?"<RESOLVABLE?HOSTNAME>:<PORT?NUMBER>"
rs.reconfig(cfg)

在您的情況下,只有一個副本集成員,這很簡單。但是,如果您處于生產模式并且有多個成員,則可以按照更改副本集中的主機名中概述的步驟進行操作,其中有兩個選項:

  • 在不中斷可用性的情況下更改主機名

  • 同時更改主機名(一次性)

說了上面的所有解釋, 或者,由于副本集部署只有一臺服務器(開發模式),因此可以通過?ClientOptions.SetDirect()?將連接模式設置為它指定客戶端是否應直接連接到服務器,而不是自動發現群集中的其他服務器(盡管這意味著您沒有冗余),即:direct

opts?:=?options.ClientOptions{?ConnectTimeout:?&timeoutVariable}
opts.SetDirect(true)
opts.ApplyURI(addr)

client,?err?:=?mongo.Connect(connect.TODO(),?&opts)


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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