zoukankan      html  css  js  c++  java
  • 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设计的主要目标。Kafka将数据写到磁盘,充分利用磁盘的顺序读写,从而减少磁盘寻道时间。同时,Kafka在数据写入及数据同步时采用了零拷贝技术,采用sendFile()函数调用,sendFile()函数是在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率很高。Kafka还支持数据压缩及批量发送,同时Kafka将每个主题划分为多个分区。这一系列的实现使得Kafka具有很高的吞吐量。QPS在百万级别。

    3、扩展性

    kafka扩容之后,分区副本会自动移动到新的节点上去吗???

    4、多客户端支持

    5、Kafka Streams

    6、安全机制

    7、数据备份

    8、轻量级

    9、消息压缩

  • 相关阅读:
    什么是多线程中的上下文切换?
    什么是基本表?什么是视图?
    什么是存储过程?用什么来调用?
    随意写文件命令?怎么向屏幕输出带空格的字符串,比如” hello world”?
    NULL 是什么意思 ?
    Mock 或 Stub 有什么区别?
    什么叫视图?游标是什么?
    什么是微服务中的反应性扩展?
    什么是线程组,为什么在 Java 中不推荐使用?
    Java 中用到的线程调度算法是什么?
  • 原文地址:https://www.cnblogs.com/koushr/p/12545635.html
Copyright © 2011-2022 走看看