我有设置有3个服务器的mongodb 3.4版副本, 我想模拟网络连接问题 我的应用是用mongo java驱动程序用Java编写的
当我在主服务器中间拔出以太网电缆时 编写像插入这样的操作,mongo驱动程序将永远等待TCP连接恢复,并且我的应用程序卡住,直到我重新连接回以太网电缆。艰难的mongodb副本已选出新的主服务器的事件
应用程序会通知我哪些选项,mongodb服务器已关闭,我需要重新连接到新的主服务器?
我试图更改操作系统tcp_keepalive_time
,但是由于我需要很短的确认时间,因此它会广泛影响我的系统。
谢谢, 沙龙
更多信息:
连接字符串:
mongodb://192.168.12.31:27017,192.168.12.32:27017,192.168.12.33:27017
我只有3台服务器,没有仲裁器。我有变量MongoCollection<Document> collection
,我正在做find
,这需要很长时间,在中间,当客户端等待服务器响应时,我从主mongo服务器上拔了以太网电缆。 mongo驱动程序将永远等待。命令是:
collection.find(matchCriteria)
如果我逻辑上退出主服务器,则会得到MongoSocketReadException
。我不想最小化驱动程序的socketTimeOut
,因为有时我的操作很长,并且希望能够尽快恢复工作。如果在连接所有服务器时都有新的选举和新的主要选举,则当前操作将失败,并且新选举之后的下一个操作将以新的主要选举成功。这是
rs.conf()
:
rs0:PRIMARY> rs.conf()
{
"_id" : "rs0",
"version" : 11,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.12.31:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.12.32:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.12.33:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 1000,
"heartbeatTimeoutSecs" : 2,
"electionTimeoutMillis" : 5000,
"catchUpTimeoutMillis" : 60000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5bd6f31118b9c73f4dda22f8")
}
}