Kafka 简介

181 阅读5分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

Kafka 是什么

Apache Kafka 是一种分布式的,基于发布/订阅的消息系统,由 Scala 语言编写而成。具备快速,可扩展,可持久化的特点。

Kafka 最初是由 LinkedIn 开发,最初2011年开源, 2012年12月从 Apache 孵化器毕业, 成为Apache 基金会的顶级项目。

Kafka 核心概念

消息

消息是 Kafka 中最基本的数据单元,消息由一串字节构成,其中主要是 key 和 value 组成,key 和 value 都是 byte 数组。key 的主要擢用是根据一定的策略,将此消息路由到指定的分区中。这样能保证包含相同一 key 的消息全部写到同一分区中,key 可以是 null, 消息的真正有效负载是 value 部分的数据。

Topic & 分区 log

Topic 是用于存储消息的逻辑概念, 可以看作是一个消息集合。

image.png

每个 Topic 可以包含多个分区(每个 Topic 至少包含一个分区),同一个 Topic 下不同分区包含的消息是不同的。每个消息被添加到分区时会分配一个 offset,它是消息在分区中的唯一编号。Kafka 通过 offset 保证消息在分区内的顺序,offset 顺序不跨分区,只保证在一个分区内是有序的。同一个 topic 多个分区内的消息,Kafka并不保证器顺序性。

分区逻辑上对于一个log, 当生产者消息写入分区时,实际上写入到 分区对于的 Log 中。 Log 是一个逻辑概念,可以对应磁盘上的一个文件夹。

Broker

一个单独的 Kafka 就是一个 Broker, Broker 的主要工作就是接收生产者发送过来的消息,分配 offset,然后保存到磁盘上; 同时接受消费者,其他 Broker 的请求,进行相应的处理并返回响应。

副本

副本是相对于分区而言的,Kafka 对于消息进行荣誉备份, 每个 Partion 可以多个副本,每个分区至少包含一个副本,当分区只包含一个副本时,就只有 Leader 副本,没有 Follower 副本。

所有读写请求都是由选举出来的 Leader 副本进行处理, 其他都是 Follwer 副本,Follwer 副本仅仅是从 Leader 副本把数据拉取到本地,同步更新到自己的 Log。

ISR

ISR (In-Sync Replica)集合表示的是 当前“可用” 且消息量与 Leader 差不多的副本集合,是整个副本集合的一个子集。写请求首先由Leader副本处理,之后Follower副本会从Leader上拉取写入的消息,这个过程会有一定的延迟,导致Follower副本中保存的消息略少于Leader副本,只要未超出阈值都是可以容忍的。如果一个Follower副本出现异常,比如:宕机,发生长时间GC而导致Kafka僵死或是网络断开连接导致长时间没有拉取消息进行同步,就会违反上面的两个条件,从而被Leader副本踢出ISR集合。当Follower副本从异常中恢复之后,会继续与Leader副本进行同步,当Follower副本“追上”(即最后一条消息的offset的差值小于指定阈值)Leader副本的时候,此Follower副本会被Leader副本重新加入到ISR中。

HW&LEO

HW (HighWaterMark) 和 LEO 与 ISR 时紧密相关的。HW 标记了一个特殊的 offset,当消费者处理消息的时候,只能拉去到 HW 之前的消息,HW 之后的消息对消费者不可见。 HW 是由一个 Leader 副本管理的。当 Follower 副本都拉取了 HW 指定消息进行同步后, Leader 会递增 HW 的值。

LEO

Log and Offset 所有副本都会有标记的一个 offset 标记,指向的是副本最后一个消息的 offset,当生产者向 Leader 副本追加消息的时候, Leader副本的 LEO 标记会递增。当 Follwer 副本的从 Leader 副本拉取到消息更新本地副本的时候, Follower 副本的 LEO 会增加。

image.png

  • ①Producer向此Partition推送消息。
  • ②Leader副本将消息追加到Log中,并递增其LEO。
  • ③Follower副本从Leader副本拉取消息进行同步。
  • ④Follower副本将拉取到的消息更新到本地Log中,并递增其LEO。
  • ⑤当ISR集合中所有副本都完成了对offset=11的消息的同步,Leader副本会递增HW。

Controler & Cluster

多个 Broker 可以构成一个 Cluster 对外提供服务, 每个 Cluster 当中会选取出一个 Broker 担任 Controller, Controller 时 Kafka 的指挥中心。其他 Broker 负责听从 Controller 指挥相应的功能。

生产者

生成者(Producer) 主要工作是生产消息,并将消息按照一定规则推送到 Topic 分区。这里的分区规则有很多种,可以是 按照 key 的 hash 值进行选择分区,也可以是 轮训全部分区的方式。

消费者

消费者的主要工作是从 Topic 拉取消息,并对消息进行消费。某个消费者消费到 Partion 的哪个位置的相关信息,是 Consumer 自己维护的。

Consumer Group

多个 Consumer 可以组成一个 Consumer Group , 一个 Consumer 只能属于一个 Consumer Group , Consumer Group 保证其订阅的 Topic 每个分区只被分配给此 Consumer Group 的一个消费者处理。 不同的 Consumer Group 订阅了同一个 Topic ,Consumer Group 之间不会干扰。

kafka 机器架构

综上所述,可以得出 Kafka 机器架构如下图所示:

image.png