kafka-Zookeeper
1.kafka总体架构
kafka总体架构.png
一个典型的kafka体系架构包含:
1)若干个Producer(消息生产者)
2)若干个Broker (作为kafka节点的服务器)
3)若干个Consumer (Group)
4)一个Zookeeper集群
kafka通过Zookeeper管理集群配置、选举leader以及在consumer group发生变化时进行Rebalance(消费者的负载均衡)
2.kafka的broker节点
image.png
Kafka 中涉及的术语
1)Producer :生产者,即消息的发送者,push消息到kafka集群中的broker
2)Broker:kafka集群由多个kafka实例(server)组成,每个实例构成一个broker,说白了就是服务器
3)Topic:producer向kafka集群push的消息会被归为某一类别,即Topic,这本质上只是一个逻辑概念,面向的对象是Producer和consumer,Producer只需要关注将消息push到哪一个topic中,而consumer只需要关注自己订阅了哪个topic
4)Partition:每一个Topic又被分为多个Partitions,即物理分区;出于负载均衡的考虑,同一个Topic的partitions分别存储于Kafka机制中的replicas来设置备份的数量
5)Consumer:消费者,从Kafka集群的broker中pull消息、消费消息
6)Consumer Group: high-level consumer API中,每个consumer都属于一个consumer-group;每条消息只能被consumer-group中的一个Consumer消费,但可以被多个consumer-group消费
7)replicas:partition的副本,保障partition的高可用
8)leader:replicas中的一个角色,Producer和consumer只跟leader交互
9)follower:replicas中的一个角色,从leader中复制数据,作为副本,一旦leader挂掉,会从它的follows中选举出一个leader继续提供服务
10)controller,kafka集群中的一个服务器,用来进行leader election以及各种failover
11)Zookeeper:kafka通过Zookeeper来存储集群的meta信息
Topic & Partition
一个topic可以认为是一类消息,每个topic将被分为多个partition
image.png
HW&ISR
image.png
目前,有两个地方会对Zookeeper的节点进行维护
1.Controller来维护,kafka集群中的其中一个Broker会被选举为Controller,主要负责Partition管理和副本
kafka架构中Zookeeper以怎样的形式存在
1).Broker在Zookeeper中注册
2).Topic在Zookeeper中的注册
数据的一致性,基于Zookeeper,kafka为每一个partition找一个节点作为leader,其余备份为follower;producer push 的消息写入partition (分区)时,作为leader的broker(kafka节点)会将消息写入自己的分区,同时还会将此消息复制到各个follower,实现同步。如果某个follow挂掉,leader会再找一个替代并同步消息;如果leader挂了,follower们会选举出一个新的leader替代,继续业务,这些都是由Zookeeper完成的。
2.借助Zookeeper实现负载均衡
Consumer会注册监听事件,当消费者发生变化时,同一group的其余消费者会得到通知。当然,消费者还要监听broker列表的变化
3.记录Partition与Consumer的关系
consumer group下有多个consumer(消费者),对于每一个消费者组(Consumer group),kafka都会为其分配一个全局唯一的group ID,group内部的所有消费者共享该ID,订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以分给其他Group)
4.全程解析(Producer-kafka-consumer)
4.1 producer发布消息
producer采用push模式将消息发布到broker,每条消息都会被append到partition中,属于顺序写磁盘。producer发送消息到broker时,会根据分区算法选择将其存储到哪一个partition。
其路由机制为:
1).指定了partition,则直接使用
2).未指定parttition,但指定key,通过key进行hash选出一个partition
3).partition和key都未指定,使用轮询选出一个partition
写入流程:
1).producer先从Zookeeper的"/brokers/.../state"节点找到该parttion的leader
2).producer将消息发送给该leader
3).leader将消息写入本地log
4).followers从leader pull消息,写入本地log后leader发送ACK
5).leader收到所有的ISR中的replica的ACK后,增加HW(high watermark),最后commit 的offset,并向producer发送ACK。