什么是 Apache Kafka?
· 阅读需 5 分钟
Apache Kafka 是一个分布式流(streaming)平台。
为什么使用 Apache Kafka?
它的抽象是一个==队列==,它的特点包括
- 分布式发布-订阅(pub-sub)消息传递系统,可将 N ^ 2 的关系简化成 N.发布者和订阅者可以按自己的速率运行。
- 超快速的零复制(zero-copy)技术
- 支持可容错的数据持久化
它可以被应用于
- 按主题打日志
- 消息系统
- 异地备份
- 流处理
为什么 Kafka 如此的快?
Kafka 使用零复制技术,其中,CPU 不会执行数据跨存储区复制副本(replica)的任务。
不使用零复制技术:
使用零复制技术:
构架
从外部看,生产者写给 kafka 集群,而用户从 kafka 集群读取内容。
数据按照主题存储,并分割为可复制副本的分区。
- 生产者将消息发布到特定主题中。
- 首先写入内存缓冲区中并更新到磁盘中。
- 为了实现快速写,使用 append-only 的序列写。
- 写入后方可读取。
- 消费者从特定主题中提取消息。
- 使用“偏移指针”(偏移量为 SEQ ID)来跟踪/控制其唯一的读取进度。
- 一个主题包括分区和负载均衡,其中,每个分区是一个有序,不变的序列的记录。
- 分区决定用户(组)的并行性。同一时间内,一个用户只可以读取一个分区。
如何序列化数据? Avro
它的网络协议是什么? TCP
分区内的存储布局是怎样的 y? O(1)磁盘读取
如何容错?
==同步副本(ISR)协议==. 其容许 (numReplicas - 1) 的节点挂掉。每个分区有一个 leader, 一个或多个 follower.
总副本量 = 同步的副本 + 不同步的副本
- ISR 是一组活的并且与 leader 同步的副本(注意领导者总是在 ISR 中)。
- 当发布新消息时,leader 在提交消息之前等待,直到它到达 ISR 中的所有副本为止。
- ==如果 follower 同步失败,它将从 ISR 中退出,然后 leader 继续用 ISR 中较少的副本提交新消息。注意,此时系统运行在低副本数量的状态下== 如果一个 leader 失败了,另一个 ISR 将被选成为一个新的 leader 。
- 未同步的副本不断的从 leader 那里拉出消息。一旦追赶上 leader ,它将被添加回 ISR。
Kafka 是 CAP 定理中的 AP 或 CP 系统吗??
Jun Rao 认为它是 CA,因为“我们的目标是支持在单个数据中心内的 Kafka 集群中进行复制,其中网络分区很少见,因此我们的设计侧重于维护高可用性和强一致性的副本。”
然而,它实际上取决于配置。
-
如果使用初始配置(min.insync.replicas=1, default.replication.factor=1),你将获得 AP 系统(最多一次)。
-
如果想获得 CP,你可以设置 min.insync.replicas=2,topic replication factor 为 3,然后生成一个 acks=all 的消息将保证 CP 设置(至少一次),但是,如果没有足够的副本(副本数< 2)用于特定主题/分区时,则无法成功地写。