follower 变慢或卡住时,leader 什么时候放弃它?这篇把 syncLimit 与 tickTime 调小,暂停一个 follower,记录 leader 的 synced_followers 什么时候变、日志里怎么说。
+ -1001 ms leader 的 zk_synced_followers = 2 + 898 ms leader 的 zk_synced_followers = 1 + 5045 ms leader 的 zk_synced_followers = 2 → 暂停后 898 ms leader 判定该 follower 掉线(syncLimit × tickTime = 1000 ms);恢复后 41 ms 重新同步完成
syncLimit 以 tickTime 为单位,默认 5 × 2000 ms = 10 秒;这里为了能快速观察调成了 2 × 500 ms。生产环境里 JVM 的长 GC 停顿如果超过这个时间,follower 就会被踢出再重新同步(第 62 篇看 GC)。
Unexpected exception in LearnerHandler: at org.apache.zookeeper.server.quorum.LearnerHandler.run(LearnerHandler.java:657) Synchronously closing socket to learner 1. ******* GOODBYE /127.0.0.1:49719 ******** Notification: my state:LEADING; n.sid:1, n.state:LOOKING, n.leader:1, n.round:0x2, n.peerEpoch:0x1, n.zxid:0x0, message format version:0x2, n.config v Follower sid: 1 : info : 127.0.0.1:7400:7500:participant
暂停 0.5 s 后 synced_followers = 2 | follower Mode = follower