Kafka入门

1 定义

分布式流式平台。

(1) 三大能力

  • 发布、订阅流式记录,类似消息队列和企业消息系统。
  • 容错且持久地保存流式记录。
  • 即时处理流式记录。

(2) 两大用途

  • 构建可靠的实时流式数据管道
  • 构建实时流式数据转换/响应应用

(3) 概念

  • 运行在可扩展的集群上
  • 分类(主题)保存流式记录
  • 每条记录包括键名、键值和时间戳

(4) 五个核心API

kafka-apis

2 主题和日志

主题是Kafka对记录流的核心抽象,是记录发布的目录或者反馈。

一个主题可以有0或多个订阅者。

对于每一个主题,kafka集群维护如下的分区日志:

log_anatomy

每个分区是一个有序的、不可变的记录序列。记录持续追加到序列后。分区为每条记录分配一个唯一的id,叫offset。

无论是否被消费,kafka始终持久化发布的记录。可以使用可配置的保留时间,以删除超时的数据。Kafka性能与数据大小无关,因此可以长时间存储数据。

log_consumer

事实上,消费者保留的元数据只有offset。通常按照顺序逐一访问,但消费者可以自主决定访问的顺序等策略。

由于不影响主题中的数据,消费者间互不影响。

日志分区有以下作用:

(1) 避免单台服务器磁盘容量限制

(2) 作为并行的单位

3 分布

分区在集群节点间分布,同时分区又在节点间重复。

对于单个分区,有一个节点作为leader,其他作为follower;对于单个节点,可能是一些分区的leader,一些分区的follower。leader负责分区读写,follower被动复制分区。当一个分区的leader故障后,会有一个follower自动称为leader。这种机制保证了集群内的负载均衡和容错。

4 地理副本

Kafka MirrorMaker提供集群的地理副本功能。消息在多个数据中心或云区域间复制。可以使用主动/被动场景用于备份和恢复,或使用主动/主动场景用于将数据靠近用户,或支持数据本地化需求。

5 Producer

Producer负责按照某种分区函数将数据发布到分区中,可以是循环(有利于负载均衡)或其他某种。

6 Consumer

Consumer可以划分为Consumer Group。每个Consumer Group可以包含若干个Consumer。Consumer可以在不同的进程或机器上运行。

如果所有的Consumer在同一个Group中,记录将在Consumer间高效负载均衡。

如果所有的Consumer在不同的Group中,消息将广播给所有的Group。

consumer-groups

思考:单条消息每个Group发一次,Group内Consumer间消息负载均衡?

Group中加入新实例,将分摊组内其他实例的分区;实例故障,将把自身的分区分摊给其他实例。

Kafka只提供单个分区的顺序,不保证同一topic中分区间的顺序。可以设置主题只有一个分区来实现。尽管这意味着一个Group只有一个Consumer实例。

思考:如果是多个实例,一个分区中的特定消息只会发给Group中的一个实例,其他实例接收不到,并且实例间难以知晓顺序。

7 多租期

可以将kafka用于多租期解决方案,通过配置能够生产或消费数据的主题。

支持配额操作。管理员可以定义和加强请求的配额,以控制broker资源。

详见security documentation

8 保障

  • 同一生产者生产的消息,在同一分区中按照发送的先后追加。
  • 消费者所见的消息按照日志中的顺序排列。
  • 在不丢失记录的前提下,具有N个分区的主题允许有N-1台服务器失效。

9 消息系统

消息系统通常有两种模型:队列和发布/订阅。

(1) 队列

多个消费者从服务器读取,每条消息只到达其中一个消费者。

优点:允许在多个消费者之间划分数据处理任务

缺点:不能有多个订阅者。一旦消息被读取就消失了。

(2) 发布/订阅

消息被广播给所有消费者。

优点:允许广播给多个订阅者

缺点:不能划分数据处理任务

(3) 消费组

Kafka使用消费组结合以上两种概念。

Kafka允许在组内多个消费者间划分处理任务。

Kafka允许在消费组间广播消息。

(4) 顺序保证

传统队列模式中,虽然按序分发消息,但是由于网络异步,无法保证到达多个消费者的先后顺序。通常限制只有为只有一个消费者,但是处理不再是并行的。

kafka可以同时实现顺序保证和负载均衡。每个主题的一个分区只能被一个消费组中的一个消费者消费。

10 存储系统

与消费解耦的,允许发布消息的任何消息队列可以视为一种空中消息的存储系统。

写入Kafka的数据被存储并副本到磁盘。Kafka允许生产等待消息被确保副本并持久化后的通知。

Kafka使用的磁盘结构可以应对不同的数据量。

Kafka保存并允许客户端控制读取位置,因此可以被视为一种特殊用途的分布式文件系统。其致力于高性能、低延迟提交日志存储、副本、传播。

详见Kafka’s commit log storage and replication design

11 流式处理

Kakfa通过Streams API提供记录流处理功能。其构建在Kafka核心概念之上,使用Producer和Consumer用于输入,使用Kafka用于状态存储,使用此昂通的组机制用于在不同实例间容错。

12 结合消息、存储和流式处理

存储功能可以管理历史数据,消息功能可以管理未来数据,流式处理可以处理数据。三者结合可以处理过去与未来产生的数据。

详见documentation

参考资料