MongoDB副本集升级至4.4.5版本后多主节点异常问题问询
MongoDB副本集多主节点异常问题处理
问题现象
MongoDB副本集偶尔出现多个主节点异常,本次场景中mongo-b为真实可用主节点,mongo-c无响应但虚假持有主节点角色。
副本集总共有4个节点:3个普通节点+1个无投票权延迟节点。经排查不存在网络分区或连通性问题,该问题在集群从4.2.5版本升级到4.4.5版本后多次出现,当前临时修复方式为清理虚假主节点数据目录后重启节点。
副本集配置
{ "_id" : 0, "host" : "mongo-a:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 3, "host" : "mongo-h:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : true, "priority" : 0, "tags" : { }, "slaveDelay" : NumberLong(900), "votes" : 0 }, { "_id" : 5, "host" : "mongo-c:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 6, "host" : "mongo-b:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }
rs.status()部分返回结果
{ "_id" : 5, "name" : "mongo-c:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3435, "optime" : { "ts" : Timestamp(1637525581, 2), "t" : NumberLong(87) }, "optimeDurable" : { "ts" : Timestamp(1637525443, 1), "t" : NumberLong(87) }, "optimeDate" : ISODate("2021-11-21T20:13:01Z"), "optimeDurableDate" : ISODate("2021-11-21T20:10:43Z"), "lastHeartbeat" : ISODate("2021-11-24T07:08:32.108Z"), "lastHeartbeatRecv" : ISODate("2021-11-24T07:08:34.867Z"), "pingMs" : NumberLong(2355), "lastHeartbeatMessage" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1637524307, 1), "electionDate" : ISODate("2021-11-21T19:51:47Z"), "configVersion" : 23, "configTerm" : 87 }, { "_id" : 6, "name" : "mongo-b:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 7995003, "optime" : { "ts" : Timestamp(1637737714, 24), "t" : NumberLong(88) }, "optimeDate" : ISODate("2021-11-24T07:08:34Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1637525581, 1), "electionDate" : ISODate("2021-11-21T20:13:01Z"), "configVersion" : 23, "configTerm" : 88, "self" : true, "lastHeartbeatMessage" : "" }
原因分析
从返回的状态信息可以看出,虚假主节点mongo-c的configTerm为87,真实主节点mongo-b的configTerm为88,同时mongo-c的心跳延迟高达2355ms,说明该节点存在严重的性能阻塞,无法及时接收处理更高任期主节点的心跳报文,所以迟迟没有自动降级为从节点。该问题是MongoDB 4.4.0~4.4.8版本的已知缺陷,当节点出现IO阻塞、高CPU占用导致心跳处理延迟超过选举超时阈值时,就会出现无法识别更高任期主节点的情况。
解决方案
- 临时修复:无需清理数据目录,直接登录虚假主节点执行
rs.stepDown(120)强制降级即可,降级后节点会自动从真实主节点同步数据。 - 永久修复:将MongoDB集群升级到4.4.9及以上稳定版本,该版本已修复对应选举逻辑缺陷。
- 优化建议:可将副本集
electionTimeoutMillis配置从默认的10000ms适当上调到15000ms,避免偶发延迟触发不必要的选举;同时完善节点CPU、内存、IO资源监控,及时处理节点性能阻塞问题。
内容的提问来源于stack exchange,提问作者sadegh
相关产品推荐
相关产品推荐

