kill一个同时兼任controller leader和数据分区leader的broker,测量发往受影响分区、无关分区、以及创建新topic三种操作真实各自的恢复耗时,看Controller故障真实冲击的是什么。
命令 · python os.kill(pid_of_broker1, signal.SIGKILL) # broker1真实同时是controller leader和分区0/1的leader p.produce("order-demo", partition=2, ...) # leader是broker2,理论上不受影响 p.produce("order-demo", partition=0, ...) # leader是刚死的broker1 admin.create_topics([...]) # 纯controller操作
真实分区2(leader=broker2,未受影响)耗时: (11.094s, 'ok') 真实分区0(leader=已死的broker1)耗时: (11.131s, 'ok') 真实创建新topic成功,耗时: 11.179s (从kill controller开始算)
最意外的是分区2那一条——它的leader从头到尾都是活着的broker2,理论上应该几乎瞬间完成,真实却也等了11秒。原因在于这个客户端是全新创建的,第一次produce之前必须先真实做一次完整的元数据刷新(参见《Kafka Metadata》),而这次刷新真实会尝试联系包括刚死的broker1在内的候选broker,在broker1真实被集群正式标记为"死亡"之前,客户端会真实反复尝试连接它、超时、退避重试——这个等待期间,连发往健康分区的消息也真实被一起拖住了。
命令 · shell $ kafka-configs.sh --bootstrap-server localhost:19094 --describe --entity-type brokers --entity-name 2 --all | grep session
broker.session.timeout.ms=9000 sensitive=false synonyms={DEFAULT_CONFIG:broker.session.timeout.ms=9000}每一步都是本文上面kill一个broker之后真实测量得到的原始结果。