? ? ? 最近使用Mongo.Driver庫開發(fā)一個(gè)應(yīng)用去連接mongodb的一個(gè)副本集,其中mongodb的副本集搭建在同一臺(tái)機(jī)器上(172.27.0.4补箍,三個(gè)節(jié)點(diǎn)的端口分別時(shí)27014,27015,27016,關(guān)閉了認(rèn)證并允許遠(yuǎn)程連接)哩掺,應(yīng)用部署在另外一臺(tái)機(jī)器(172.27.0.5)太援。在使用MongoClient類時(shí),傳入的連接URL為:"mongodb://172.27.0.4:27014,172.27.0.4:27015,172.27.0.4:27016"(以ip加端口的格式球涛,如圖1)断楷。
如果把應(yīng)用也部署到mongodb的機(jī)器上铃辖,能連接成功新思,如果分開部署窖梁,連接會(huì)報(bào)如下異常:
System.TimeoutException”類型的異常在 MongoDB.Driver.Core.dll中發(fā)生,但未在用戶代碼中進(jìn)行處理其他信息: 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: 不知道這樣的主機(jī)夹囚。
后來用命令行登陸到mongodb集群纵刘,并使用命令:rs.conf()檢查復(fù)制集配置,如圖2
從圖1中副本集的配置可以看出(畫框處)荸哟,端口為27014的節(jié)點(diǎn)的host配置為:"172_27_0_4:27014"(其他節(jié)點(diǎn)都是以 . 分割ip)假哎。出現(xiàn)連接異常的問題就在于此(如果在配置中,節(jié)點(diǎn)的host使用主機(jī)名+端口的方式:"saf323asasa32:27014"鞍历,在程序中以ip地址的方式去連接也會(huì)出現(xiàn)上面的連接錯(cuò)誤)舵抹。因此,需要將配置中節(jié)點(diǎn)的host修改成標(biāo)準(zhǔn)的ip地址劣砍。具體操作依次執(zhí)行如下命令:
cfg=rs.conf()
cfg.members[0].host = "172.27.0.4:27014"
rs.reconfig(cfg)
最后可以在執(zhí)行rs.conf()進(jìn)行修改后的配置查看是否修改成正確的ip:port的形式惧蛹,在使用應(yīng)用程序進(jìn)行連接復(fù)制集就能成功連接了。最后附上出現(xiàn)該問題的原因:timeout Unspecified