【Kafka】核心原理(二)

258 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

4. Kafka 底层数据结构存储

Kafka 底层数据存储以 partition 日志文件存储。

  • 每一行数据都有一个序号offset 来代表这个消息在日志文件里的位置

2022-05-2922-27-17.png Kafka 通过 NIOByteBuffer 将消息以二进制形式存储到 partition 日志中,二进制形式相对 Java 对象要节约近40%的空间:

partition.png

5. Kafka 分布式存储

假如一个 Topic 的数据大小为 TB 级别,不可能将 TB 级别数据存储到一台 Kafka Broker 机器上:

  • Kafka 将一个逻辑上的 Topic 数据拆分成多个分区 partition
  • 不同的分区 partition 部署到不同的机器上

2022-05-2922-48-48.png

  • 生产数据:可以将同一 topic 上数据写入到不同的 partition 机器上。
  • 消费数据:根据主题从不同 partition 上消费数据。

partition写入与消费.gif

6. Kafka 高可用保证

高可用:就是 多副本冗余。

每个分区 partition 有多个副本:

  • 主分区:leader partition,有且仅有一个,负责对外提供数据读写。
  • 副本分区:follower partition,可以有多个,主要复制数据。

当一个 Kafka 进程宕机了,会根据情况重新选举一个 leader partition

2022-05-2923-37-39.png

完整流程如下:

partition高可用.png

7. Kafka 数据不丢失保证

Kafka 保证数据不丢失,采用了 ISR(In-sync replicas)列表机制:

  1. ISR 列表构成:每个 leader partition 中有一个 ISR 列表,里面至少有一个 follower

    如果一个 leader 里面的 ISR 列表没有 follower ,是不允许其他应用往 Kafka 写数据

  2. 写成功标识:一条数据写入 leader partition,并将数据同步给其下的 ISR 列表中所有 follower

  3. leader 选举:当 leader partition 所在 broker 机器宕机了,通过 ZK 进行 leader 选举,只能从 ISR 列表里选举新的 leader

8. Kafka 集群写入实现负载均衡

通过将 leader partition 分布在不同的机器上来实现请求负载均衡:

  • 数据写入 Topic ,实际上是写入 Topic 里的 partition
  • leader partition 负责数据的读和写。

9. Kafka 无状态架构

Kafka Broker 维护的元数据存储在 ZK 中,扩容时,只需从 ZK 中读取数据即可。

2022-05-2923-59-39.png

10. Kafka 节点故障感知

每个 Kafka Broker 都会将其元信息注册在 ZK 上,通过 ZK 可以:

  • 维持各节点心跳:每个 Kafka Broker 要定时给 ZK 发送心跳
  • 发现新节点、节点宕机
  • 进行 leader partition 选举

2022-05-2923-59-39.png