1、Broker注册

Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。在Zookeeper上会有一个专门用来进行Broker服务器列表记录的节点:
/brokers/ids
每个Broker在启动时,都会到Zookeeper上进行注册,即到/brokers/ids下创建属于自己的节点,如/brokers/ids/[0…N]。
Kafka使用了全局唯一的数字来指代每个Broker服务器,不同的Broker必须使用不同的Broker ID进行注册,创建完节点后,每个Broker就会将自己的IP地址和端口信息记录到该节点中去。其中,Broker创建的节点类型是临时节点,一旦Broker宕机,则对应的临时节点也会被自动删除。

2、Topic注册

在Kafka中,同一个Topic的消息会被分成多个分区并将其分布在多个Broker上,这些分区信息及与Broker的对应关系也都是由Zookeeper在维护,由专门的节点来记录,如:
/brokers/topics/[topic]

3、生产者负载均衡

一个topic存在多个分区,分区会分布在多个Broker上,因此生产者需要将消息合理的发送到这些分布式的Broker上。Kafka支持传统的四层负载均衡,也支持Zookeeper方式的负载均衡。
四层负载均衡:
根据生产者的IP地址和端口来为其确定一个相关联的Broker。一个生产者只会对应单个Broker,然后该生产者产生的消息都发往该Broker。每个生产者都需要和关联的Broker建立TCP连接。但是这样无法做到真正负载均衡,每个生产者产生的消息量,及每个Broker的消息存储量都不一样。
Zookeeper负载均衡:
使用Zookeeper进行负载均衡,由于每个Broker启动时,都会完成Broker注册过程,生产者会通过该节点的变化来动态地感知到Broker服务器列表的变更,这样就可以实现动态的负载均衡机制。

4、消费者负载均衡

与生产者类似,Kafka中的消费者同样需要进行负载均衡来实现多个消费者合理地从对应的Broker服务器上接收消息,每个消费者分组包含若干消费者,每条消息都只会发送给分组中的一个消费者,不同的消费者分组消费自己特定的Topic下面的消息,互不干扰。

5、分区与消费者的关系

consumer group 下有多个 Consumer(消费者)。
每个消费者组(consumer group),kafka 都会为期分配一个全局唯一的Group ID ,Group内部的所有消费者共享该ID。订阅的topic下每个分区只能分配给该消费组下的一个消费者。(不同消费者之间不影响)。
在Kafka中,规定了每个消息分区 只能被同组的一个消费者进行消费,因此,需要在 Zookeeper 上记录 消息分区 与 Consumer 之间的关系,每个消费者一旦确定了对一个消息分区的消费权力,需要将其Consumer ID 写入到 Zookeeper 对应消息分区的临时节点上,例如:
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id]

6、消费者注册

消费者服务器在初始化启动时加入消费者分组的步骤如下
注册到消费者分组。每个消费者服务器启动时,都会到Zookeeper的指定节点下创建一个属于自己的消费者节点,例如/consumers/[group_id]/ids/[consumer_id],完成节点创建后,消费者就会将自己订阅的Topic信息写入该临时节点。