持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
4. Kafka 底层数据结构存储
Kafka 底层数据存储以 partition 日志文件存储。
- 每一行数据都有一个序号
offset来代表这个消息在日志文件里的位置
Kafka 通过 NIO 的 ByteBuffer 将消息以二进制形式存储到 partition 日志中,二进制形式相对 Java 对象要节约近40%的空间:
5. Kafka 分布式存储
假如一个 Topic 的数据大小为 TB 级别,不可能将 TB 级别数据存储到一台 Kafka Broker 机器上:
Kafka将一个逻辑上的Topic数据拆分成多个分区partition- 不同的分区
partition部署到不同的机器上
- 生产数据:可以将同一
topic上数据写入到不同的partition机器上。 - 消费数据:根据主题从不同
partition上消费数据。
6. Kafka 高可用保证
高可用:就是 多副本冗余。
每个分区 partition 有多个副本:
- 主分区:
leader partition,有且仅有一个,负责对外提供数据读写。 - 副本分区:
follower partition,可以有多个,主要复制数据。
当一个 Kafka 进程宕机了,会根据情况重新选举一个 leader partition。
完整流程如下:
7. Kafka 数据不丢失保证
Kafka 保证数据不丢失,采用了 ISR(In-sync replicas)列表机制:
-
ISR列表构成:每个leader partition中有一个ISR列表,里面至少有一个follower如果一个
leader里面的ISR列表没有follower,是不允许其他应用往Kafka写数据 -
写成功标识:一条数据写入
leader partition,并将数据同步给其下的ISR列表中所有follower -
leader 选举:当leader partition所在broker机器宕机了,通过ZK进行leader选举,只能从ISR列表里选举新的leader。
8. Kafka 集群写入实现负载均衡
通过将 leader partition 分布在不同的机器上来实现请求负载均衡:
- 数据写入
Topic,实际上是写入Topic里的partition。 leader partition负责数据的读和写。
9. Kafka 无状态架构
Kafka Broker 维护的元数据存储在 ZK 中,扩容时,只需从 ZK 中读取数据即可。
10. Kafka 节点故障感知
每个 Kafka Broker 都会将其元信息注册在 ZK 上,通过 ZK 可以:
- 维持各节点心跳:每个
Kafka Broker要定时给ZK发送心跳 - 发现新节点、节点宕机
- 进行
leader partition选举