Kafka工作流程及文件存储机制
Kafka工作流程
- Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的。
- topic 是逻辑上的概念,而 partition 是物理上的概念。
- 每个partition都有对应的.log文件,该 log 文件中存储的就是 producer 生产的数据。
- producer生产的数据会发送给topic的每个partition,并追加到partition的.log文件中。
- 消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。
- producer发送数据和消费者消费数据的对象都是partition中的leader,其他follower会实时从leader中同步数据,和leader中的数据保持一致。
- 每个partition中的数据是有序的。
Kafka文件存储机制
- 每个topic可以分为多个partition。
- Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。
- 每个partition可以分为多个segment。
- 每个segment大小是相同的,且都对应若一个.log和.index文件。
- .log和.index文件成对存在,.log文件记录的是producer生产的数据,.index文件记录的是.log文件中每条数据的物理偏移量。
- 每个partition的数据都位于同一个目录下,并以"topic名称_partition号"的格式命名。
- partition数据的全局存放路径可以在Kafka下bin/config/server.properties中配置,配置参数为:log.dirs=xxx/xxx/xxx
index文件和log文件
- index文件和log文件都以该segment的第一个消息的offset命名。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。
- .index文件存储大量的索引信息,.log文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message的物理偏移地址。
- 示例:查找offset为368722的数据
- 首先根据偏移量通过二分查找法快速定位到368722对应的.index文件和.log文件分别为:00000000000000368739.index和00000000000000368739.log;
- .index文件中每条索引数据的大小也是固定的,因此可以通过offset快速定位到所要查找索引的位置为:3,497。3表示:该索引对应的消息是该segment中的第三条数据,497表示:该索引对应的数据在00000000000000368739.log中的物理偏移量是497;
- 查找到了368722在00000000000000368739.log中的物理偏移量,也就找到了索要查找到的数据。
message物理结构
参数说明
关键字 | 解释 |
---|---|
8 byte offset | 在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message |
4 byte message size | message大小 |
4 byte CRC32 | 用crc32校验message |
1 byte “magic” | 表示本次发布Kafka服务程序协议版本号 |
1 byte “attributes” | 表示为独立版本、或标识压缩类型、或编码类型 |
4 byte key length | 表示key的长度,当key为-1时,K byte key字段不填 |
K byte key | 可选 |
value bytes payload | 表示实际消息数据 |
文章部分内容参考自:https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html