真实创建一个6分区3副本的topic,观察初始leader的分布规律,再kill掉一个broker,看只有哪些分区会真实换leader、新leader又是怎么被选出来的。
命令 · shell $ kafka-topics.sh --bootstrap-server localhost:19092 --create --topic leader-demo --partitions 6 --replication-factor 3 $ kafka-topics.sh --bootstrap-server localhost:19092 --describe --topic leader-demo
Partition 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Partition 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Partition 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 Partition 3 Leader: 1 Replicas: 1,3,2 Isr: 1,3,2 Partition 4 Leader: 3 Replicas: 3,2,1 Isr: 3,2,1 Partition 5 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3
真实规律非常直白:每个分区的leader,就是它Replicas列表里的第一个broker(Kafka内部把这个叫preferred leader)。6个分区的replicas列表,真实是Controller创建topic时用round-robin算法从1,2,3三个broker里错开排列出来的,结果就是初始leader真实也均匀落在了1、2、3三个broker上各2个,没有谁真实吃满全部负载。
命令 · shell $ kill -9 <broker1的pid> $ sleep 5 $ kafka-topics.sh --bootstrap-server localhost:19094 --describe --topic leader-demo
Partition 0 Leader: 2 (原来是1) Replicas: 1,2,3 Isr: 2,3 Partition 1 Leader: 2 (没变) Replicas: 2,3,1 Isr: 2,3 Partition 2 Leader: 3 (没变) Replicas: 3,1,2 Isr: 3,2 Partition 3 Leader: 3 (原来是1) Replicas: 1,3,2 Isr: 3,2 Partition 4 Leader: 3 (没变) Replicas: 3,2,1 Isr: 3,2 Partition 5 Leader: 2 (没变) Replicas: 2,1,3 Isr: 2,3
真实只有分区0和分区3变了——这两个恰好是原本由broker1领导的分区,其余4个分区的leader真实原封不动。新leader也不是随便选的:分区0的Replicas是[1,2,3],broker1死后剩下[2,3],真实选中的新leader是2(排在3前面);分区3的Replicas是[1,3,2],剩下[3,2],真实选中的是3。两次真实都是"排除掉死掉的副本之后,剩下列表里最靠前的那个"。
每一步都是本文上面用kafka-topics.sh --describe跑出来的原始结果。