摘要:本文主要带来 4 种 Kafka 网络中断和网络分区场景分析。
1. 单个 broker 节点和 leader 节点网络中断
网络中断前:
broker-1 和 broker-0(leader)间的网络中断后,单边中断,zk 可用(zk-1 为 leader,zk-0 和 zk-2 为 follower,zk-0 会不可用,但 zk 集群可用,过程中可能会引起原本连在 zk-0 上的 broker 节点会先和 zk 断开,再重新连接其他 zk 节点,进而引起 controller 切换、leader 选举等,此次分析暂不考虑这种情况),leader、isr、controller 都不变
az2 内的客户端无法生产消费(metadata 指明 leader 为 broker-0,而 az2 连不上 broker-0),az1/3 内的客户端可以生产消费,若 acks=-1,retries=1,则生产消息会失败,error_code=7(REQUEST_TIMED_OUT)(因为 broker-1 在 isr 中,但无法同步数据),且会发两次(因为 retries=1),broker-0 和 broker-2 中会各有两条重复的消息,而 broker-1 中没有;由于 broker-0 没有同步数据,因此会从 isr 中被剔除,controller 同步 metadata 和 leaderAndIsr,isr 更新为 [2,0]
网络恢复后,数据同步,更新 isr
2. 单个 broker 节点和 controller 节点网络中断
broker 和 controller 断连,不影响生产消费,也不会出现数据不一致的情况
而当发生 leader 和 isr 变化时,controller 无法将 leader 和 isr 的变化更新给 broker,导致元数据不一致
broker-0 故障时,controller(broker-2)感知,并根据 replicas 选举新的 leader 为 broker-1,但因为和 broker-1 网络中断,无法同步给 broker-1,broker-1 缓存的 leader 依