Mongo集群Java连接时MongoException$Network、UnknownHostException错误

今天在 Java 连接 Mongo 集群时报了一个超时的错误,但是在本地客户端连接单节点的时候却能连上,具体报的错误如下:

Caused by: com.mongodb.MongoTimeoutException: Timed out after 60000 ms while waiting for a server that matches {serverSe
lectors=[ReadPreferenceServerSelector{readPreference=primaryPreferred}, LatencyMinimizingServerSelector{acceptableLatenc
yDifference=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.Unkn
ownHostException: mongo.50}}, {address=mongo.66:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoExcep
tion$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo.66}}, {address=mongo.67:270
17, 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 这种地址做对应即可解析。

你可能感兴趣的:(MongoDB)