1-【源码剖析】kafka核心概念

发布于:2025-06-07 ⋅ 阅读:(27) ⋅ 点赞:(0)

从今天开始开始在csdn上记录学习的笔记,主要包括以下几个方面:

  • kafka
  • flink
  • doris

本系列笔记主要记录Kafka学习相关的内容。在进行kafka源码学习之前,先介绍一下Kafka的核心概念。

消息

消息是kafka中最基本的数据单元,由key和value组成,都是字节数组。key主要来实现路由功能,value是真正的有效负载。

topic&分区&Log

topic是用于存储消息的逻辑概念,是一个消息集合。

每个topic可以划分为多个分区,每个分区内的数据是不重叠的,每个消息在添加到分区时,都会分配一个编号offset,来保证消息在分区内的顺序。

分区在逻辑上对应着一个Log,当生产者将消息写入分区时,实际上是写入到了分区对应的Log中。Log是一个逻辑概念,可以对应磁盘上的一个文件夹,Log由多个Segment组成,每个Segment对应一个日志文件和索引文件。

保留策略&日志压缩

发送到kafka的数据会被保存下来,但不会像数据库那样永久保存,为了避免数据库被占满,kafka有相应的保留策略,周期性删除陈旧消息。kafka中有两种保留策略:基于时间和topic大小的保留策略。

kafka会对存储的消息进行压缩,以减少磁盘占用。

broker

一个单独的kafka server就是一个broker。broker的主要工作就是接收生产者发过来的消息,同时接收消费者的请求,返回存储的数据。一般一个broker占一台物理机器。

副本

kafka对消息进行了冗余备份,每个分区可以有多个副本,每个副本消息是一样的。每个分区至少有一个副本,所有副本中选取一个当做Leader,其它副本从Leader处拉取消息。
在这里插入图片描述

一般情况下,同一分区的多个副本会分配到不同的broker上。一个topic包括多个分区,每个分区的数据是不一样的,可以实现水平扩展,当数据量变大时可以增大分区的数量;每个分区有多个副本,多副本情况下可丢失其中某个副本。

ISR集合

ISR集合表示目前“可用”且消息量与leader差不多的副本集合,是整个副本集合的一个子集。ISR必须满足两个条件:1副本所在节点必须维持着与zookeeper的连接;2副本最后一条消息的offset与Leader副本的的最后一条消息offset不能超过指定的阈值。每个分区的Leader副本都会维护此分区的ISR集合。

HW&LEO

HW标记了一个特殊的offset,当消费者处理消息的时候,只能拉取到HW之前的数据,之后的数据对消费者来说是不可见的。HW是由Leader副本管理的,当ISR集合中全部的Follower副本都拉取HW指定的消息后,Leader副本会递增HW的值。

LEO是所有的副本都有的一个offset标记,它指向追加到当前副本的最后一个消息的offset。

在副本同步复制中,如果有一个副本出现故障,会拖慢整个系统的性能;在异步复制过程中,虽然Follower可以在Leader异步同步消息,但是可能存在宕机风险。通过 LEO 同步和 HW 计算,实现高效、可靠的消息传输。

HW定义消费者可见的数据边界,保障跨副本一致性。

LEO跟踪副本最新数据位置,驱动副本同步。

Cluster&Controller

多个broker可以做成一个集群Cluster,每个集群会选取一个broker来担任Controller。Controller是集群的指挥中心,负责管理分区的状态、副本状态、监听zookeeper中的变化等工作。

生产者

生产者主要是生产消息,并按一定的规则推送到topic的分区中。

消费者

消费者的主要工作是从topic中拉取消息。某个消费者消费到partition的哪个位置,是Consumer自己维护的。

Consumer Group

在kafka中,多个Consumer可以组成一个Consumer Group,一个Consumer只能属于一个Consumer Group。一条消息只能被一个组里的一个消费者消费。Consumer Group可以实现独占和广播的功能,如果想所有的消费者都能接收到某条消息,可以使用不同的消费者组。

参考书籍《Apache Kafka源码剖析》


网站公告

今日签到

点亮在社区的每一天
去签到