【问题标题】:MongoDB Java Client Automatic Failover FailingMongoDB Java 客户端自动故障转移失败
【发布时间】:2014-02-18 11:12:18
【问题描述】:

我在 localhost 上有一个 3 节点副本集设置:

mongod --port 27017 --dbpath C:/data/repset/rsdb0 --replSet rs0
mongod --port 27018 --dbpath C:/data/repset/rsdb1 --replSet rs0
mongod --port 27019 --dbpath C:/data/repset/rsdb2 --replSet rs0

在我的 Java 客户端中,我正在连接到副本集:

List<ServerAddress> addrs = new ArrayList<>();
addrs.add( new ServerAddress( "HOST" , 27017 ) );
addrs.add( new ServerAddress( "HOST" , 27018 ) );
addrs.add( new ServerAddress( "HOST" , 27019 ) );

MongoClient mongo = new MongoClient( addrs );
System.out.println(mongo.getReplicaSetStatus());

除非我关闭(停止)第三个辅助 mongodb 实例(端口 27019 上的那个),否则一切正常。这是为了模拟服务器故障。

然后当我运行上面的 java 代码时,我得到:

Feb 17, 2014 10:51:18 PM com.mongodb.ConnectionStatus$UpdatableNode update
WARNING: Server seen down: HOST/192.168.0.5:27019
java.net.ConnectException: Connection refused: connect
   at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)

这似乎意味着副本集没有故障转移。我希望客户端继续读取和写入,直到我恢复“失败”的服务器,然后我希望重新同步。

我想我一定是做错了什么,因为自动故障转移是 MongoDB 的基础,但是谁能告诉我它是什么?

谢谢!

【问题讨论】:

    标签: java mongodb mongodb-java


    【解决方案1】:

    这似乎意味着副本集没有故障转移。

    应该故障转移的不是副本集,而是驱动程序。

    什么告诉你它不是?警告只是通知您其中一个节点处于DOWN 状态。您还没有进行任何操作,因此没有什么可以进行故障转移的。

    您是否尝试在连接到设备之外进行读取或写入?我非常相信你可以。

    我想我一定是做错了什么

    不,你没有,除了理解警告的含义

    【讨论】:

    • 当场,在执行操作时,他们继续工作,就好像什么事都没发生过一样。故障转移是一种享受
    【解决方案2】:

    如果您使用过时的连接,您会收到该错误。当驱动程序检测到失败的连接时,它将使用新连接重新填充池。如果您在几秒钟内重试(一旦任何主选举都被服务器整理出来),您将看到 java 驱动程序重新连接到新的主节点并准备好写入。

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2014-01-09
      • 2015-06-13
      • 2015-10-24
      相关资源
      最近更新 更多