真实kill掉3节点KRaft集群里当前的controller quorum leader,用kafka-metadata-quorum.sh观察剩下2/3投票节点是怎么完成重新选举的,以及这期间集群的正常操作是否受影响。
命令 · shell $ kafka-metadata-quorum.sh --bootstrap-server localhost:19092 describe --status
ClusterId: COV3eDrXSOK1Izq7j5mNfw
LeaderId: 1
LeaderEpoch: 1
CurrentVoters: [{"id":1,...19093},{"id":2,...19095},{"id":3,...19097}]
CurrentObservers: []这3个节点的server.properties里都真实配了process.roles=broker,controller,加上同一份controller.quorum.voters=1@...,2@...,3@...,它们真实组成了一个3投票节点的Raft quorum,跟KRaft维护的元数据日志完全走的是Raft协议——真实选出的leader是node1。
命令 · shell $ kill -9 <node1的pid> $ sleep 5 $ kafka-metadata-quorum.sh --bootstrap-server localhost:19094 describe --status
LeaderId: 3
LeaderEpoch: 3
MaxFollowerLag: 1966
CurrentVoters: [{"id":1,...},{"id":2,...},{"id":3,...}] ← node1依然真实留在voter列表里node1真实死掉之后,剩下node2和node3这两票——正好是3票里的多数派——真实完成了一次新的选举,node3真实当选新leader。LeaderEpoch从1真实跳到了3而不是2,说明中间真实存在过一轮没有真正成功的选举尝试(可能是node2先发起过一轮,没拿到多数票,node3紧接着又发起一轮才真实成功)。CurrentVoters列表里node1真实还挂着——它只是失联,并没有被真实从这个静态配置的voter集合里移除,如果永久下线,需要真实运维手动执行移除投票节点的操作。
$ kafka-topics.sh --bootstrap-server localhost:19094 --create --topic quorum-still-works ... Created topic quorum-still-works. ← 真实成功,node1挂着完全不影响
每一步都是本文上面用kafka-metadata-quorum.sh跑出来的原始结果。