kafka 基本概念与术语
2025-01-22 08:19:30    2.7k 字   
This post is also available in English and alternative languages.

简单记录下kafka中的基本概念、术语。

Apache Kafka是一个消息引擎、分布式流处理平台。

  • 松耦合
    隔离上下游业务,减少系统之间交互,简化开发。

  • 削峰填谷

    当请求暴增,kafka可以缓冲(缓存)上游瞬时突发的流量,让下游系统无感知并平滑消费,避免下游系统遭到流量不规则冲击。

    对于那种发送能力很强的上游系统,如果没有消息引擎的保护,下游系统可能会直接被压垮导致全链路服务"雪崩";
    kafka够有效地对抗上游的流量冲击,真正做到将上游的“峰”填满到“谷”中,避免了流量的震荡;

上面两个是kafka最显而易见的作用,kafka还可以用作数据处理、流处理平台等。


1. 图例

baoker_topic_partition

cluster_producer_consumer

Topic和Partition的架构图(图片来自网络)

Topic和Partition的架构图-2(图片来自网络)


2. kafka broker

以下是kafka broker中相关的一些概念信息。

概念含义
broker一台kafka server就是一个broker
broker集群多个broker组成broker集群
topic(主题)发布、订阅的对象
partition(分区)一个topic中包含成多个partition,每个partition是一个有序的队列;
类似 elasticsearch 中的 sharding(分片);
replication(副本)partition的副本(备份)机制
ARassigned replicas
parition(分区)所属的全部副本
ISR + OSR
ISRin sync replica
与 Leader Replica(partition主副本)保持消息数据同步的Follower Replica(partition从副本)的集合
OSR与 Leader Replica(partition主副本)保持消息数据同步存在差距的Follower Replica(partition从副本)的集合
offset(partition offset)消息在partition中的位置
producer消息数据的生产者
ack(ack机制)producer(生产者)消息数据发送确认机制

2.1. broker

kafka在服务器上的进程被称为broker;

broker部分职责是接收和处理客户端发送过来的请求,以及对消息进行持久化;一个broker可以容纳多个topic。


2.2. broker集群(kafka集群)

多个broker可以组成集群;

集群中会选举出有一个broker同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来);


2.3. topic(主题)

topic是一个逻辑概念,代表的是一类消息数据,也可以认为是消息被发送到的目的地,通常用topic来区分实际业务;

在kafka中发布订阅的对象是topic,如果需要可以为每个业务、应用,甚至是某类数据创建专属的topic;kafka集群模式下,一个 topic可以横跨多个borker。

出于性能、高可用的考量,kafka采用的不是topic - message两级结构,而是topic - partition - message三级结构,以此分散负载。


2.4. partition(分区)

topic可以由一个或多个partition(分区)组成,可以简单粗暴的将partition(分区)理解成先入先出的队列;

producer(生产者)生产的消息数据以追加的形式写入partition(分区),然后consumer(消费者)从partition(分区)中按顺序读取,消息数据只会存在于一个partition(分区)中。

要注意,由于topic(主题)一般包含几个partition(分区),因此无法在整个topic(主题)范围内保证消息的顺序,但可以保证消息在单个partition(分区)内的顺序


2.5. replication(replica)

replication意味着partition(分区)拥有多个副本,是的,replication它作用于partition(分区)层面上并分布在多个borker中;

这样可以保证高可用,防止其中一个borker出现故障,无法为consumer提供服务;

replication(replica)存在的唯一意义就是数据冗余,防止数据丢失,保证高可用。

replication的数量是可以配置的,这些分区副本保存着相同的数据,但它们有不同的角色和作用;

  • Leader Replica(主副本、partition主副本)

    负责与外部交互。

  • Follower Replica(从副本、partition从副本)

    跟随 Leader Replica,只存储数据,不参与外部交互。

producer(生产者)生产的消息总是写到Leader Replica(partition主副本)中,而consumer(消费者)总是从 Leader Replica(partition主副本)中读消息;

Follower Replica(partition从副本)只做一件事:向Leader Replica(partition主副本) 发送请求,请求Leader Replica(partition主副本)把最新的消息发送给它,这样Follower Replica(partition从副本)中的数据才能与 Leader Replica(partition主副本)保持同步;

通过这种机制可以保证高可用;当某台机器挂掉后,consumer(消费者)从Leader Replica(partition主副本)无法读取消息时,kafka会从剩余的Follower Replica(partition从副本)中选举出新的leader,重新对外提供服务。


2.6. replication-factor(replica数量)

在手动创建topic(主题)时,有一个参数replication-factor,它决定了topic(主题)中partition(分区)的副本数量。

如果该参数设置为1,意味着消息数据只存在于Leader Replica(partition主副本),如果Leader Replica(partition主副本)所在的broker宕机,会直接导致数据丢失。

为了提高数据安全性,避免主题中消息数据丢失,建议将此参数设置大于1;例如将此参数设置成3,即一个Leader Replica(主副本、partition主副本)和2个Follower Replica(partition从副本)

假设一个topic(主题)通过手动创建,replication-factor设置为3,有2个partition(分区);
那这个topic一共有6个partition(分区),其中包含2个Leader Replica(partition主副本)和4个Follower Replica(partition从副本)。


2.7. AR

全称:assigned replicas

partition(分区)所属的全部副本。

AR = ISR + OSR


2.8. ISR

全称:in sync replica

partition(分区)所属,与Leader Replica(partition主副本)保持同步的Follower Replica(partition从副本)集合;

注意:ISR中也包含Leader Replica(partition主副本),ISR = leader replica + follower replicas,某些情况下ISR集合中可能只有leader 一个副本。

当Leader Replica(partition主副本)所在broker意外宕机,只有此集合中的Follower Replica(partition从副本)才有资格被选举成leader;

也只有该集合中所有副本(Leader + Follower)都成功接收到了同一条消息数据,kafka才会将该消息数据设置成"已提交"状态,即认为producer成功发送该消息数据(由producer#acks参数控制)。


2.9. OSR

全称:outof-sync replicas

理想状态下,partition(分区)所属的全部Follower Replica(partition从副本),都应该与Leader Replica(partition主副本)保持消息数据同步;

但总有各种原因,导致一部分Follower Replica(partition从副本)中同步的消息数据落后于Leader Replica(partition主副本)的进度;当滞后到一定程度,kafka会将这些Follower Replica(partition从副本)踢出ISR集合,转移到OSR集合。

当OSR集合中Follower Replica(partition从副本)同步的消息数据追上Leader Replica(partition主副本)后,kafka会将其重新添加回ISR中。

partition(分区)的副本支持动态增加,新增加的Follower Replica(partition从副本)中的消息数据肯定是追不上Leader Replica(partition主副本)的,因此也会先加入到OSR集合中。


2.10. offset

全称:partition offset

表示消息在partition(分区)中的位置,是一个单调递增且不变的值。

在<partition(分区)>中提到过,producer(生产者)生产的消息数据以追加的形式写入partition(分区);

写入partition(分区)的每条消息数据都会被分配一个唯一序列号,也就是offset;offset是从0开始顺序递增的整数;通过offset可以定位到某partition(分区)中的一条数据。

注意:consumer(消费者)中也有offset的概念,它们俩是不同的概念。


2.11. producer(生产者)

消息数据的生产者,向topic(主题)生产消息的应用程序称为producer(生产者);

节省内容篇幅,将其归类到kafka broker中


2.12. ack

在上面<ISR>小节中提到过一个场景:只有ISR集合中所有副本(Leader + Follower)都成功接收到了同一条消息数据,kafka才会将该消息数据设置成"已提交"状态,即认为producer成功发送该消息数据(由producer#acks参数控制)

上面这个过程,这就是ack机制的一部分;

具体来说:

  1. producer(生产者)发送一条消息数据给kafka集群;
  2. 消息数据会写入到指定的topic(主题)下的Leader Replica(partition主副本);
  3. producer(生产者)会等待Leader Replica(partition主副本)/ broker 返回写入结果(并不是无限等待,会有超时时间),以确保消息数据被成功提交;
  4. 上面这一切完成后,producer(生产者)才可以继续发新的消息。

kafka api中提供回调,让用户处理消息数据发送失败的情况;


3. kafka consumer

以下是kafka consumer中相关的一些概念信息。

概念含义
consumer(消费者)订阅主题的应用程序就被称为Consumer;
consumer group(消费组)多个consumer组成consumer group;
一种可扩展且具有容错性的消费者机制。
offset(消费者 offset)
rebalance(重平衡)消费组中某个consumer挂掉后,group中其他consumer自动重新分配订阅分区的过程

3.1. consumer(消费者)

消息/数据的消费者;

consumer(消费者)订阅topic(主题)并且处理消息,consumer(消费者)可以同时订阅多个topic(主题)。

consumer(消费者)通过检查消息的offset(偏移量)区分已经读取过的消息。

注意,此处的offset,并不是上面partition offset;

consumer(消费者)会把从每个partition(分区)中最后读取消息对应的offset保存到zookeeper或kafka中,如果消费者关闭或重启,保证读取状态不会丢失。


3.2. consumer group(消费组)

多个consumer(消费者)共同组成的一个consumer group(消费组),同时消费多个partition(分区)以实现高吞吐。

consumer group(消费组)中的consumer(消费者)订阅的都是相同的topic(主题),每个consumer(消费者)接收topic(主题)中某一个或多个分区的消息。

在一个 consumer group(消费组)中,一条消息只能被consumer group(消费组)中的consumer(消费者)消费。

consumer group(消费组)中的consumer(消费者)不能比订阅topic(主题)中的partition(分区)多,否则多出的consumer(消费者)会处于空等待状态,不会收到消息。


3.3. offset(consumer offset)

consumer(消费者)消费partition(分区)中消息的进度,每个consumer(消费者)都有自己的消费者位移。


3.4. rebalance(重平衡)

消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。
rebalance是consumer(消费者)端实现高可用的重要手段。


4. Reference