• 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,即只连接主节点,不连接副本。

  • 相关阅读:
    简单的代码
    js精度缺失问题
    maven将Jar安装进仓库
    上传图片,手机端压缩
    处理登录时,AJAX的状态码无权限情况
    处理html换行问题
    VMWARE网络配置内网与外网互ping
    hbase和ZooKeeper集群安装配置
    Hadoop集群部署
    redis主从配置+sentinel哨兵
  • 原文地址:https://www.cnblogs.com/leanfish/p/10254711.html
Copyright © 2020-2023  润新知