给3节点集群真实加入第4个broker,验证已有topic是否会自动重新平衡;再把这个broker真实kill掉,看它领导的分区和Replicas列表分别发生了什么变化。
命令 · shell $ kafka-server-start.sh node4/server.properties & # node.id=4,真实新加入的broker $ kafka-topics.sh --bootstrap-server localhost:19092 --describe --topic order-demo
broker4加入后,order-demo分区分配(跟加入前完全一样): Partition 0 Leader: 3 Replicas: 3,1,2 Partition 1 Leader: 2 Replicas: 1,2,3 Partition 2 Leader: 2 Replicas: 2,3,1
broker4真实注册进了集群(能在broker列表里查到它),但已经存在的order-demo这个topic,三个分区的Replicas列表里真实都不包含4——Kafka不会因为集群多了一台机器,就自动重新平衡已有数据。新broker刚加入时是真实空的,不会自动分担任何已有topic的负载,这是需要额外操心的一步。
$ kafka-topics.sh --create --topic after-join-topic --partitions 4 --replication-factor 2 Partition 0 Leader: 4 Replicas: 4,1 Partition 1 Leader: 1 Replicas: 1,2 Partition 2 Leader: 2 Replicas: 2,3 Partition 3 Leader: 3 Replicas: 3,4
broker4加入之后创建的这个新topic,round-robin真实覆盖了全部4个broker——分区0真实以broker4为leader,分区3真实把broker4也算进了副本。Controller的分区分配算法真实只在"创建新分区"这一刻才会考虑当前有哪些broker可用,不会主动回头重新分配已经存在的分区。
命令 · shell $ kill -9 <broker4的pid> $ kafka-topics.sh --describe --topic after-join-topic
Partition 0 Leader: 1 Replicas: 4,1 Isr: 1 ← Replicas真实还写着4 Partition 3 Leader: 3 Replicas: 3,4 Isr: 3 ← 同样还留着4
每一步都是本文上面用一个新broker加入又死亡跑出来的原始结果。