用 ZooKeeper 给自己的应用(而不是 ZooKeeper 集群本身)选 leader:主备切换、单实例定时任务都靠它。这篇起 5 个候选进程,量选举结果、kill -9 之后的空窗期、有没有两个 leader 重叠,以及主动让位和崩溃的差别。
当选者: ['A'] | /election 的子节点数 = 5 同一时刻只有一个在发心跳: True
配方和分布式锁几乎一样:临时顺序节点,序号最小的当选,别人只监听前一个。区别是「锁」被持有一小会儿,「leader」被持有到进程结束。
次 被杀 新 leader 空窗期 s(最后一次心跳 → 新 leader 开始) 期间是否有两个 leader 1 A B 3.52 没有 2 B C 3.04 没有 3 C D 3.05 没有 4 D E 3.03 没有 空窗期中位 3.04 s(会话超时 3 s + 选举)
空窗由会话超时决定:leader 被 kill -9 后,服务端要等会话过期才删除它的临时节点,下一个候选才被通知。中间这几秒没有 leader,业务必须能容忍;调小会话超时能缩短,但会增加误切换。
X 当选并在 1.6 秒后让位(进程退出时关闭会话):X 最后一次心跳到 Y 开始 = 0.01 s
进程收到退出信号时先关闭会话(或调用 resign),临时节点立刻删除。发布升级、滚动重启都应该走这条路径。