🗒️Kafka 源码阅读-基本概念介绍

type
status
date
slug
summary
tags
category
icon
password
原文

1. kafka 的基本组成

Kafka kRaft 的体系架构包含了若干的生产者、消费者、Broker节点、Controller 节点。
  • 生产者 Producer :负责发送消息到 Broker 节点
  • 消费者 Consumer :接受消息的一方,消费者连接到 Kafka 上接受消息,进而进行相应的业务处理
  • Broker 节点:处理消息存储与读写请求。
    • 对于 Kafka 而言,Broker 可以简单的看作一个独立的 kafka 服务节点或 Kafka 服务示例。一个或多个 Broker 可以组成了一个 Kafka集群。一般而言,我们习惯用 broker 来表示服务代理的节点。
  • Controller 节点:负责元数据的管理(如 Topic 的创建、分区分配),通过 Raft 协议选举 Leader。
 

2.主题与分区

2.1 主题(Topic)

Kafka 中的消息都是以 Topic 为单位进行归类,生产者负责将消息发送到特定的主题。发送的每一条消息都需要指定一个主题,而消费者负责订阅主题并进行消费。
主题是一个逻辑上的概念,它可以拥有多个分区,一个分区只属于单个主题,分区也成为主题分区(Topic-Partition)。同一主题下的不同分区包含的消息时不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候会被分配一个特定的偏移量(offset)。offset 是消息在分区中的唯一表示,Kafka通过它来保证消息再分区内的顺序性,不过 offset并不跨越分区,也就是说,Kafka 保证的分区有序而不是主题有序
消息顺序追加到每个分区日志文件的尾部。Kafka 的分区可以分布在不同的服务器(broker)上,也就是说,一个主题可以横跨多个 broker,以此来提供比单个 broker 更强大的性能。
每一条消息被发送到 broker 之前,会根据分区规则选择存储在哪个具体的分区。如果分区规则设置的合理,所有的消息都可以均匀分配到不同的分区中。如果一个主题只对应一个文件,那么这个文件所在的机器的 I/O将成为这个主题的性能瓶颈,而分区解决了这个问题。在创建主题的时候可以通过指定的参数来设置分区的个数,也可以在完成之后去修改分区数量,通过增加分区的数量实现水平的扩展。
💡
分区就是消息的负载均衡。
Kafka 为分区引入了多副本机制(Replica)机制,通过增加副本的数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样),副本之间是一主多从的关系。其中 Leader 副本负责处理读写请求,Follower 副本负责与 Leader 副本的消息同步。副本处于不同的 broker 中,当 Leader 副本出现故障时,从 Follower副本中重新选举新的 Leader 的副本对外提供服务。
💡
这里的Broker整个的运行是否采用 Raft,这里先标注下,待补充
Kafka 的消费端也具备一定的容灾能力。Consumer 使用 pull 模式从服务端拉取消息,并且保存消费的具体位置,当消费者宕机后恢复上线时可以根据之前保存的消费位置重新拉取需要的消息进行消费,这样就不会造成消息丢失。

2.2 ISR机制

分区的所有副本统称为 AR(Assigned Replicas)。所有与 Leader 副本保持一定程度同步的副本(包括 Leader 在内)组成 ISR(In-Sync Replicas),ISR集合是 AR 集合中的一个子集。消息会发送到 Leader 副本,然后 Follower 副本才能从 Leader 副本中拉取消息进行同步,同步期间内 follower 副本相对于 Leader 副本而言会有一定程度的落后。这个“一个程度的同步”指的是可忍受的滞后范围,这个可以通过参数进行配置(replica.lag.time.max.ms)。与 Leader副本同步滞后的过多的副本(不包括 Leader)组成 OSR(Out-of-Sync Replicas)。AR=ISR+OSR。在正常情况下,所有的副本都应该与 Leader 副本保持一定程度的同步,即 AR=ISR,OSR 为空。
💡
ISR 机制的本质是Quorum 机制的变体,通过动态副本集合取代固定多数派,在保证一致性(非强一致性)的同时提升灵活性。(妙啊)
这里是提升性能的一个关键地方,如果真是严格的共识算法,那么吞吐量肯定会差很多。
Leader 副本负责维护和跟踪 ISR 集合中所有 Follower 副本的滞后状态,当 Follower 副本落后太多或失效时,Leader 副本会把它从 ISR 集合中剔除。如果 OSR 集合中有 Follower 副本“追上”了 Leader 副本,那么 Leader 副本会把它从 OSR 集合转移至 ISR 集合。
默认情况下(unclean.leader.election.enable=true ),当Leader副本发生故障时,只有 ISR 集合中的副本才有资格被选举为新的 Leader,而在 OSR 集合中的副本没有任何机会(可以通过修改参数改变➊)。
💡
待补充:选举机制
➊: 如果参数改变,意味着消息会丢失。
ISR 机制的好处是减少无效的请求以及动态调整节点。
ISR 与 HW和LEO也有紧密关系。HW(High Watermark)的缩写,俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个 offset之前的消息。
分区日志偏移量说明
分区日志偏移量说明
日志文件表示有 9 条消息,第一条消息的 offset(LogStartOffset)为 0,最后一条消息的 offset 为 8,虚线框为 9 表示的 下一条消息要写入的位置。日志的 HW 为 7,表示消费者只能拉取 offset 0 至 6 之间的消息,offset 6之后的消息对消费者不可见。LEO(Log End Offset),它表示当前日志文件中下一条待写入的消息的 offset。LEO的大小相当于当前日志分区最后一条小的 offset+1。分区 ISR 集合中的每个副本都会维护自身的 LEO,而 ISR 集合中最小的 LEO 即为分区的 HW,对于消费者而言只能消费 HW 之前的消息。
💡
可以理解为每个分区有自己的 commitIndex,最小的 CommitIndex 的对消费者可见(这个取决于配置 ack=all)。
 
Prev
kafka 源码阅读-生产者
Next
权限模型-ABAC模型
Loading...