zoukankan      html  css  js  c++  java
  • 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,即只连接主节点,不连接副本。

  • 相关阅读:
    在iphone上安装多个微信 【微信营销必备】
    微信 5.3 for iPhone已放出 微信iphone版更新下载
    支付宝也要上"服务号"?斗战微信继续升级
    微信事业群WXG成立 致力于打造微信大平台
    Matlab绘图系列之高级绘图
    朱亚东 临睡前发点鸡汤^^
    邢波老师致广大学员的一封信(2010-10-26)
    那些逐渐消失的技艺
    Nine Great Books about Information Visualization
    linux在shell中获取时间
  • 原文地址:https://www.cnblogs.com/leanfish/p/10254711.html
Copyright © 2011-2022 走看看