持续创作,加速成长!这是我参与「掘金日新计划 · 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
选举