Mongo集群Java連接時UnknownHostException錯誤


今天在 Java 連接 Mongo 集群時報了一個超時的錯誤,但是在本地客戶端連接單節點的時候卻能連上,具體報的錯誤如下:

Caused by: com.mongodb.MongoTimeoutException:
Timed out after 60000 ms while waiting for a server that matches
{serverSelectors=[ReadPreferenceServerSelector{readPreference=primaryPreferred}, LatencyMinimizingServerSelector{acceptableLatencyDifference=15 ms}]}.
Client view of cluster state is {type=ReplicaSet, servers=[{address=mongo.50:27017, type=Unknown,state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket},
caused by {java.net.UnknownHostException: mongo.50}},
{address=mongo.66:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket},
caused by {java.net.UnknownHostException: mongo.66}},
{address=mongo.67:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused
by {java.net.UnknownHostException: mongo.67}}]

 

檢查了配置文件中的 IP 地址是沒有問題的,但是為什么報錯中,會出現 mongo.50 mongo.66 mongo.67 這三個地址解析不出的錯誤呢?這三個地址又是怎么來的呢?Mongo 集群是 3 台機器,IP 的最后分別是 50、66、67,猜測會不會是集群配置的問題。

StackOverflow 上有一個類似的問題:(https://stackoverflow.com/questions/27607773/com-mongodb-mongotimeoutexception-when-using-mongoclient-with-list-serveraddress)

其實是由於 Mongo 的副本集方式是在客戶端決定連接到哪個 Mongo 服務器的,每個 Mongo 服務相互監聽,如果發現主服務掛了就做選舉新的主,新主確定后通知客戶端,因為在創建副本集的時候用的是域名的方式所以客戶端拿到的主地址也是域名。
所以,Java 客戶端拿到集群配置的 mongo.50 集群中配置的地址是無法解析的。
那么只需要下面再多做一步,配置本機的 hosts 文件即可。將對應的 IP 和 mongo.50 這種地址做對應即可解析。

或者去掉?replicaSet=rs0,即只連接主節點,不連接副本。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM