Curator 有两套选主:LeaderLatch(当选后一直当,直到你关闭)和 LeaderSelector(按次轮流)。这篇都跑一遍:主动让位多快、服务端不可达时 leader 的反应、轮转是否公平、进程崩溃后多久换主。
启动后 leader = C0;hasLeadership 为 true 的候选数 = 1;getParticipants = [C0*, C1, C2, C3, C4] close() C0 → 新 leader C1,11 ms close() C1 → 新 leader C2,6 ms close() C2 → 新 leader C3,6 ms close() C3 → 新 leader C4,8 ms
与 kazoo 的 Election 同源(临时顺序节点,序号最小者当选);Curator 的 LeaderLatch 提供 hasLeadership() 和监听回调。
0.0s isLeader 0.5s 冻结服务端 5 s 4.1s notLeader 4.1s STATE SUSPENDED 5.5s 解冻 5.9s STATE RECONNECTED 5.9s isLeader 最后 hasLeadership = true
默认的 ConnectionStateErrorPolicy 把 SUSPENDED 也当成「可能丢了领导权」,所以 leader 在 SUSPENDED 时就停手。这避免了「leader 已不是 leader 还在干活」的窗口,代价是网络抖动会让 leader 短暂中断(这里恢复后又当选)。
各候选当 leader 的次数:{S0=7, S1=7, S2=6};前 12 次轮换顺序:[S0, S1, S2, S0, S1, S2, S0, S1, S2, S0, S1, S2]kill -9 P2 → 新 leader P0,最后一次心跳到新 leader 开始 2.56 s kill -9 P0 → 新 leader P4,最后一次心跳到新 leader 开始 3.49 s kill -9 P4 → 新 leader P3,最后一次心跳到新 leader 开始 3.49 s 期间同时有两个进程在发 leader 心跳的采样点数:0
和会话超时的关系:临时节点要到会话过期才删除,所以空窗至少接近会话超时。要更快的切换,只能缩短会话超时(代价是更容易误判)。