bigywater.tech
ZooKeeper · 46

数据落后节点重新同步

follower 变慢或卡住时,leader 什么时候放弃它?这篇把 syncLimit 与 tickTime 调小,暂停一个 follower,记录 leader 的 synced_followers 什么时候变、日志里怎么说。

898 ms
暂停 follower 到 leader 判定它掉线(syncLimit × tickTime = 1000 ms)
41 ms
恢复后重新同步完成
0.5 s 不够
短于 syncLimit × tickTime 的停顿不会被踢出

暂停多久会被判定掉线

实测 · 本机执行输出
  + -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

分步演示

syncLimit
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群,tickTime=500、syncLimit=2、initLimit=4;暂停用 SIGSTOP / SIGCONT;synced_followers 每 50 ms 采样
    • 没有验证:默认值(syncLimit=5、tickTime=2000)下的行为、慢但没有停顿的 follower(网络延迟高)、leader 被暂停的情形、syncLimit 与会话超时的相互作用
    京ICP备2026067502号-1京公网安备11010502063487号