1、主题
Kafka将一组消息抽象归纳为一个主题(topic),也就是说,一个主题就是对消息的一个分类。生产者将消息发送到特定主题,消费者订阅主题或主题的某些分区进行消费。
2、消息
消息是Kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。每一条消息称为Record。
3、分区和副本
Kafka将一组消息归纳为一个主题,而每个主题又被分成一个或多个分区(partition)。每个分区由一系列有序、不可变的消息组成,是一个有序队列。每个分区在物理上对应一个文件夹,分区的命名规则为topic-partitionNum,分区编号从0开始,如test-0,test1。每个分区又有一个或多个副本(replica),分区的副本分布在集群的不同代理上,以提高可用性。从存储角度上分析,
4、Leader副本和Follower副本
由于Kafka副本的存在,就需要保证一个分区的多个副本之间数据的一致性。Kafka会选择该分区的一个副本作为Leader副本,而该分区其他副本即为Follower副本,只有Leader副本才负责处理客户端读/写请求,Follower副本从Leader副本同步消息。副本Leader和Follower的角色不是固定不变的,如果Leader失效,会通过相应的选举算法从其他Follower副本中选出新的Leader副本。
5、
控制器
在启动Kafka集群时,每一个代理都会实例化并启动一个KafkaController,并将该代理的brokerId注册到ZooKeeper的/brokers/ids节点中。Kafka集群中各代理会根据选举机制选出其中一个代理作为Leader,即Leader控制器,简称控制器。当控制器宕机后其他代理再次竞选出新的控制器。控制器负责主题的创建和删除、分区和副本的管理以及代理故障转移等。
Kafka控制器的选举依赖于ZooKeeper。Kafka控制器选举的核心思想就是各代理通过争抢向/controller节点请求写入自身的信息,先成功写入的代理即为Leader。
Kafka控制器对分区的管理包括对分区创建和删除的管理,分区Leader选举的管理,分区自动平衡、分区副本重分配的管理等。
分区Leader的选举
Kafka提供了5种分区选举器,当分区的状态发生变化时,根据分区所处状态选用不同的选举器为分区选出Leader副本。选举器用PartitionLeaderSelector表示,有5个实现类:
1、OfflinePartitionLeaderSelector:
2、ReassignedPartitionLeaderSelector:
3、PreferredReplicaPartitionLeaderSelector:
4、ControlledShutdownLeaderSelector:
5、NoOpLeaderSelector:
协调器
Kafka提供了消费者协调器、组协调器(GroupCoordinator)和任务管理协调器(WorkCoordinator)。
消费者协调器ConsumerCoordinator在客户端,是KafkaConsumer的一个成员变量。消费者协调器主要负责向组协调器发起加入消费组、离开消费组(如当消费者取消订阅时)以及提交消费偏移量等请求。
消费者也分Leader消费者和Follower消费者。当消费者协调器向组协调器请求加入消费组后,组协调器会为同一个组下的消费者选出一个Leader。Leader消费者的消费者协调器还负责执行分区的分配。Leader消费者会在请求组协调器的时候把分配结果带过去,Follower消费者请求组协调器,组协调器会把Leader消费者发送过来的分配结果返回给各Follower消费者。
组协调器GroupCoordinator在服务端,负责处理消费者提交的请求。组协调器首先会从与之建立连接的消费者中选出一个作为Leader消费者,然后把Leader消费者制定的分区分配方案响应给各消费者。同时,组协调器还会处理消费者提交偏移量的请求,把消费偏移量保存到Kafka的内部主题中,并通过心跳检测来检测消费者与自己的连接状态。
副本管理器
Leader副本选举见上面分区选举器。
副本管理器除了负责将消息写入Leader副本外,还负责处理Follower副本的FetchRequest。
Leader副本负责处理分区的所有读写请求。Follower副本作为消费者从Leader副本拉取消息进行同步。
在Kafka中拉取消息的角色有两个,一个是Kafka的消费者客户端,另一个就是Follower副本。副本管理器是通过FetchRequest的replicaId来区分拉取请求的角色。每个副本都有一个非负的replicaId,而消费者客户端的replicaId为-1。消费者会拉取HW位置之前的位置,而Follower副本会拉取HW之后的消息。
LEO:Log End Offset,表示最后一条消息的位置,分区的每个副本都有自己的LEO。
HW:High Watermark,其实就是ISR副本中最小的LEO。HW之前的消息表示已提交的消息 ,对消费者是可见的,消费者最多只能消费到HW所在的位置,HW之后的消息表示还没有被Follower副本同步完成。
分区数与消费者线程的关系
partition.assignment.strategy,这个消费者配置项用来设置消费者线程与分区的映射关系。Kafka内置了range和round-robin两种分配策略,默认是range。注意是range,不是random。最开始一直以为是随机呢
range:对应RangeAssignor。
round-robin:对应RoundRobinAssignor。这个就比较简单了,把主题分区按照名称排好序,把
Kafka特性
1、消息持久化
2、高吞吐量
高吞吐量是Kafka设计的主要目标。Kafka将数据写到磁盘,充分利用磁盘的顺序读写,从而减少磁盘寻道时间。同时,Kafka在数据写入及数据同步时采用了零拷贝技术,采用sendFile()函数调用,sendFile()函数是在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率很高。Kafka还支持数据压缩及批量发送,同时Kafka将每个主题划分为多个分区。这一系列的实现使得Kafka具有很高的吞吐量。QPS在百万级别。
3、扩展性
kafka扩容之后,分区副本会自动移动到新的节点上去吗???
4、多客户端支持
5、Kafka Streams
6、安全机制
7、数据备份
8、轻量级
9、消息压缩