Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

最近使用Mongo.Driver庫開發一個應用去連接mongodb的一個副本集,其中mongodb的副本集搭建在同一臺機器上(172.27.0.4,三個節點的端口分別時27014,27015,27016,關閉了認證並允許遠程連接),應用部署在另外一臺機器(172.27.0.5)。在使用MongoClient類時,傳入的連接URL為:

"
mongodb://172.27.0.4:27014,172.27.0.4:27015,172.27.0.4:27016"
(以ip加端口的格式,如圖1)。

Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

圖1 mongo客戶端

如果把應用也部署到mongodb的機器上,能連接成功,如果分開部署,連接會報如下異常:

System.TimeoutException”類型的異常在 MongoDB.Driver.Core.dll中發生,但未在用戶代碼中進行處理其他信息: A timeout occured after 3000ms selecting a server using CompositeServerSelector {

Selectors = ReadPreferenceServerSelector {

ReadPreference = {

Mode = Secondary, TagSets = []

}

}, LatencyLimitingServerSelector {

AllowedLatencyRange = 00: 00: 00.0150000

}

}.Client view of cluster state is {

ClusterId: "1",

ConnectionMode: "ReplicaSet",

Type: "ReplicaSet",

State: "Disconnected",

Servers: [{

ServerId: "{ ClusterId : 1, EndPoint : "

Unspecified / 172.27.0.4:27014 " }",

EndPoint: "Unspecified/172.27.0.4:27014",

State: "Disconnected",

Type: "Unknown",

HeartbeatException: "
MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. --->
System.Net.Sockets.SocketException: 不知道這樣的主機。

後來用命令行登陸到mongodb集群,並使用命令:rs.conf()檢查複製集配置,如圖2

Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

圖2 副本集配置

從圖1中副本集的配置可以看出(畫框處),端口為27014的節點的host配置為:"172_27_0_4:27014"(其他節點都是以 . 分割ip)。出現連接異常的問題就在於此(如果在配置中,節點的host使用主機名+端口的方式:"saf323asasa32:27014",在程序中以ip地址的方式去連接也會出現上面的連接錯誤)。因此,需要將配置中節點的host修改成標準的ip地址。具體操作依次執行如下命令:

cfg=rs.conf()

Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

獲取配置並複製給cfg

cfg.members[0].host = "172.27.0.4:27014"


Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

修改第一節點的host屬性

rs.reconfig(cfg)


Asp.Net Core 連接Mongodb 副本集 timeout Unspecified

重新進行配置

最後可以在執行rs.conf()進行修改後的配置查看是否修改成正確的ip:port的形式,在使用應用程序進行連接複製集就能成功連接了。最後附上出現該問題的原因鏈接:

https://github.com/mongodb/mongo-csharp-driver/blob/14e046f23640ff9257c4edf53065b9a6768254d4/Docs/reference/content/reference/driver/error_handling.md


分享到:


相關文章: