真实用SIGTERM依次优雅重启3个broker(模拟一次完整的滚动升级),同时持续生产消费消息,验证幂等producer+acks=all+优雅关闭的组合能否真实做到零丢失零重复。
命令 · python p = Producer({"acks": "all", "enable.idempotence": True}) # 真实持续生产,每20毫秒一条 for node_id in [1, 2, 3]: os.kill(pid, signal.SIGTERM) # 真实优雅关闭,不是kill -9 # 真实等进程退出,再重新启动
本系列前面大量实验用的都是kill -9(SIGKILL),真实模拟的是"进程突然消失"这种最坏情况——broker完全没有机会做任何收尾工作,只能靠故障检测(心跳超时)之后才触发leader切换。SIGTERM真实是请求进程"正常退出",Kafka broker收到之后会真实先做controlled shutdown:主动把自己领导的所有分区的leader转移给其它副本,再断开连接、退出进程——整个过程对客户端真实是可预期的,不需要等心跳超时。
真实优雅重启 broker1,发送SIGTERM... broker1 真实已退出,真实重新启动... 真实优雅重启 broker2,发送SIGTERM... broker2 真实已退出,真实重新启动... 真实优雅重启 broker3,发送SIGTERM... broker3 真实已退出,真实重新启动... 真实生产总数: 2059 真实消费到的不重复消息数: 2059 真实丢失的消息数: 0 真实重复接收的次数: 0 真实发送失败的消息数: 0
每一步都是本文上面用SIGTERM依次重启3个broker跑出来的原始结果。