kafka基本概念

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设计的主要目标。QPS在百万级别。

3、扩展性

broker可以随时添加,topic的分区和副本数也可以增加。

4、多客户端支持

比如java客户端、go客户端

5、Kafka Streams

6、安全机制

7、数据备份

8、消息压缩

 

posted on 2020-03-22 13:33  koushr  阅读(314)  评论(0编辑  收藏  举报

导航