MongoDB Java客户端自动故障转移失败

时间:2014-02-17 23:03:49

标签: java mongodb mongodb-java

我在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());

除非我取下(停止)第3个辅助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)

这似乎意味着副本集没有故障转移。我希望客户能够继续阅读和写作,直到我带来失败的&#39;服务器备份然后我希望重新同步。

我想我一定做错了,因为自动故障转移是MongoDB的基础,但任何人都可以告诉我它是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

  
    

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

  

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

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

您是否尝试过读取或写入以外的连接?我非常相信你可以。

  
    

我想我一定是做错了什么

  

不,除了理解警告的含义

之外没有

答案 1 :(得分:0)

如果您使用陈旧连接,则会收到该错误。当驱动程序检测到连接失败时,它将使用新连接重新填充池。如果您在几秒钟后重试(一旦服务器对任何主要选举进行了整理),您将看到java驱动程序重新连接到新主服务器并准备好写入。