跳到主要内容

什么是 Apache Kafka?

Apache Kafka 是一个分布式流(streaming)平台。

为什么使用 Apache Kafka?

它的抽象是一个==队列==,它的特点包括

  • 分布式发布-订阅(pub-sub)消息传递系统,可将 N ^ 2 的关系简化成 N.发布者和订阅者可以按自己的速率运行。
  • 超快速的零复制(zero-copy)技术
  • 支持可容错的数据持久化

它可以被应用于

  • 按主题打日志
  • 消息系统
  • 异地备份
  • 流处理

为什么 Kafka 如此的快?

Kafka 使用零复制技术,其中,CPU 不会执行数据跨存储区复制副本(replica)的任务。

不使用零复制技术:

使用零复制技术:

构架

从外部看,生产者写给 kafka 集群,而用户从 kafka 集群读取内容。

数据按照主题存储,并分割为可复制副本的分区。

Kafka Cluster Overview

  1. 生产者将消息发布到特定主题中。
    • 首先写入内存缓冲区中并更新到磁盘中。
    • 为了实现快速写,使用 append-only 的序列写。
    • 写入后方可读取。
  2. 消费者从特定主题中提取消息。
    • 使用“偏移指针”(偏移量为 SEQ ID)来跟踪/控制其唯一的读取进度。
  3. 一个主题包括分区和负载均衡,其中,每个分区是一个有序,不变的序列的记录。
    • 分区决定用户(组)的并行性。同一时间内,一个用户只可以读取一个分区。

如何序列化数据? Avro

它的网络协议是什么? TCP

分区内的存储布局是怎样的 y? O(1)磁盘读取

如何容错?

==同步副本(ISR)协议==. 其容许 (numReplicas - 1) 的节点挂掉。每个分区有一个 leader, 一个或多个 follower.

总副本量 = 同步的副本 + 不同步的副本

  1. ISR 是一组活的并且与 leader 同步的副本(注意领导者总是在 ISR 中)。
  2. 当发布新消息时,leader 在提交消息之前等待,直到它到达 ISR 中的所有副本为止。
  3. ==如果 follower 同步失败,它将从 ISR 中退出,然后 leader 继续用 ISR 中较少的副本提交新消息。注意,此时系统运行在低副本数量的状态下== 如果一个 leader 失败了,另一个 ISR 将被选成为一个新的 leader 。
  4. 未同步的副本不断的从 leader 那里拉出消息。一旦追赶上 leader ,它将被添加回 ISR。

Kafka 是 CAP 定理中的 AP 或 CP 系统吗??

Jun Rao 认为它是 CA,因为“我们的目标是支持在单个数据中心内的 Kafka 集群中进行复制,其中网络分区很少见,因此我们的设计侧重于维护高可用性和强一致性的副本。”

然而,它实际上取决于配置。

  1. 如果使用初始配置(min.insync.replicas=1, default.replication.factor=1),你将获得 AP 系统(最多一次)。

  2. 如果想获得 CP,你可以设置 min.insync.replicas=2,topic replication factor 为 3,然后生成一个 acks=all 的消息将保证 CP 设置(至少一次),但是,如果没有足够的副本(副本数< 2)用于特定主题/分区时,则无法成功地写。

References: