Kafka架构深入——工作流程
Kafka架构深入之工作流程以及文件存储
Kafka工作流程
Kafka集群Record流存储在称为topic的类别中,每个记录由一个键、一个值和一个时间戳组成。Kafka是一个分布式流平台:1)发布和订阅记录流,类似于消息队列或企业消息传递系统;2)以容错的持久方式存储记录流;3)处理记录流。 Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。 topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,所以每个Partition中的信息都有是有序的,且每条数据都有自己的offset。消费者组中每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。并且,自从0.9版本之后,offset信息将会存储于本地磁盘当中。
Kafka消息存储
同一个topic通常存储的是一类消息,每个topic内部实现又被分成多个partition,每个partition在存储层面是append log文件。而不同的topic存储在同一个文件夹下。 由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment对应两个文件——“.index”和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic+分区序号。例如:first这个topic存在多个分区,则其对应的文件为first-0,first-1…index 和 log 文件以当前 segment 的第一条消息的 offset 命名。“.index” 文件存储大量的索引信息,“.log” 文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移量。
# ls /root/data/kafka/first-0 00000000000000009014.index 00000000000000009014.log 00000000000000009014.timeindex 00000000000000009014.snapshot leader-epoch-checkpoint
每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。 由于索引文件是顺序存在的,所以查询索引文件时采用的是二分查找。 segment中index与data file对应关系物理结构如下: 上图中索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。 其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partiton表示第368772个message),以及该消息的物理偏移地址为497。
参考
https://www.bilibili.com/video/BV1a4411B7V9?p=12 https://www.iteblog.com/archives/2227.html