基本概念

Topic(主题)

消息通过主题分类,类比数据库表。
一个主题可以创建多个分区,需权衡吞吐量、内存及 Leader 选举所需时间。

Partition(分区)

一个主题的消息可以分为若干分区,一个分区就是一个顺序写入的提交日志(仅追加)。

  • 分区内消息有序,但多个分区下同一主题消息不能确保整体有序。
  • 通过分区实现数据冗余和伸缩性,由于主题的每个分区可以分布在不同服务器上,可以提供更高的性能。
  • 分区偏移量:分区元数据,不断递增的整数值,在创建消息时添加,在给定的分区内是唯一的,确保消息不被重读。区别于消费者位移(指示该消费者的消费进度),一旦消息写入分区,位移就不再变化。

副本是在分区的层级定义的,分区下可配置N个副本:1 个 Leader、N-1 个 Follower。

Replica(副本)

Kafka 的备份机制:把相同的数据拷贝到多台机器上。每个分区在创建时都要选举一个副本,称为领导者副本,其余的副本自动称为追随者副本。

  • 领导者(Leader):对外提供服务,即与客户端程序进行交互。
  • 追随者(Follower):只与 Leader 交互,异步拉取消息写入自己的提交日志中,不对外提供服务。

Batch(批次)

Kafka 的数据单元是消息,由字节数组组成。当消息以可控的方式写入不同的分区,会基于键生成散列值、对分区数取模,为消息选取分区。
批次即同属一个主题和分区的一组消息,分批次写入 Kafka 可以减少网络开销、提高效率:批次越大、单位时间内处理的消息越多、单个消息的传输时间越长。可通过对批次数据压缩,提高数据传输和存储能力。

Offset(偏移量)

生产者Offset
消息写入的时候,每一个分区都有一个offset,这个offset就是生产者的offset,同时也是这个分区的最新最大的offset。有些时候没有指定某一个分区的offset,这个工作kafka帮我们完成。
消费者offset
记录消费者消费到哪里了,也可能由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢 复后继续消费

Controller(控制器)

在Broker主从设计下,controller主要完成对集群broker和分区的管理如集群broker信息、分区选举ISR等

Segment

partition物理上由多个segment组成


角色

Producer(生产者)

生产者创建消息,默认把消息分布到所有分区上,也可以根据键和分区器直接写到指定分区上。

Consumer(消费者)

  • 消费者订阅主题消息,并按照生成顺序读取,通过检查偏移量(保存在 Zookeeper 或 Kafka 中持久化)判断消息是否已读取。
  • 支持多个消费者,消息可被多个消费者读取,之间互不影响;
  • 消费者通过消费者位移记录自己在分区的消费进度。

Consumer Group(消费者组)
消费者组内的共同读取一个主题,每个分区只能被一个消费者读取,即消费者对分区的所有权关系:目的是提升消费者端的吞吐量(TPS)。
一个消费者组可以包含一个或多个消费者,使用多分区+多消费者方式可以极大提高数据下游的处理速度。同一个消费组中的消费者不会重复消费消息,不同消费者组中的消息消费互不影响;Kafka 就是通过消费组的方式来实现消息 P2P 模式广播模式

Broker(中间人)

表示一台独立的 Kafka 服务器,需要处理以下请求:

  • 客户端请求
    • 生产者:接收生产者消息,为消息设置偏移量,并提交消息到磁盘保存。
    • 消费者:响应读取分区的请求,返回已经提交到磁盘的消息。
  • 分区副本请求
  • 控制器发送给分区首领的请求

Leader(领导者)

  • 每个分区都有一个leader以及0个或者多个follower
  • Leader副本才能对外提供读写服务,响应Clients端的请求

    Follower(追随者)

    1. Follower副本只是采用拉(PULL)的方式,被动地同步Leader副本中的数据,并且在Leader副本所在的Broker宕机后,随时准备成为Leader

核心概念

消息架构

Kafka 的三层消息架构:

  • 主题层,可以配置 M 个分区,每个分区可以配置 N 个副本。
  • 分区层,每个分区的 N 个副本中只能有一个领导者,对外提供服务;N-1 个追随者副本,提供数据冗余之用。
  • 消息层,分区中包含若干条消息,每条消息的位移从 0 开始依次递增。客户端只能与分区的领导者副本进行交互。

工作模型

(P2P)点对点

即消息队列模型,系统 A 发送得消息只能被系统 B 接收。
Kafka 通过消费者组实现点对点模型:多个消费者实例共同组成一个组消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费。

(Pub-Sub)发布-订阅

  • 区别于点对点模型,它有主题(Topic)的概念,即逻辑消息容器。
  • 发布者把消息分类,接收者对特定类型的消息进行订阅以便接收。
  • 对于多组发布者 - 接收者,引入一或多个中间人解耦,成为多个独立的发布订阅系统。

数据持久化

顺序写:Kafka 使用消息日志(Log)来保存数据,一个日志就是磁盘上一个消息物理文件:只能追加写(Append-only),避免了缓慢的随机 I/O 操作,实现高吞吐量。
定期删除:日志段(Log Segment)机制。在 Kafka 底层,一个日志细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka 会自动切分出一个新的日志段,并将老的日志段封存。在后台有定时任务检查老的日志段是否能够被删除,回收磁盘空间。

服务协调

Kafka 使用 Zookeeper 保存集群 Broker 和主题的元数据信息、消费者元数据及分区偏移量,实现服务协调。
Zookeeper 集群使用一致性协议,建议部署奇数个节点,确保大多数节点可用。
注意:在Kafka 2.8.0 版本,移除了对Zookeeper的依赖,通过KRaft进行自己的集群管理

Cluster(集群)

随着 Kafka 部署数量的增加,可部署多个集群,实现数据类型分离、安全隔离和多数据中心功能。
其中多数据中心需另外提供集群之间复制消息的功能,可通过 MirrorMaker 实现。