1 kafka文件存储机制
1.1 kafka文件存储的基本结构
说明:a、在kafka文件存储中,同一个topic下有多个不同的partition,每个partition为一个
为一个目录,partition的命名规则为topic名称+有序序号,第一个partition从0开
始,序号最大值为partitions数量减1;
b、每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(段)数
据文件中。但每个segment file的消息数量不一定相等。这种特性方便old segment
file快速被删除,默认保留七天的数据;
![](http://i.imgur.com/aqd9k1j.png)
c、每个partition只需要支持顺序读写就行了,segment文件的生命周期由服务端配置参数决
定。
![](http://i.imgur.com/37t0HAy.png)
注:针对一个topic里面的数据,只能做到partition内部有序,不能做到全局有序。只有一种情
况下才能保证全局有序,就是只有一个partition。
1.2 Kafka Partition Segment
a、Segmemt file组成:由2部分组成,分别为index file和data file,此两个文件一一对应成
对出现,后缀".index"和".log"分别表示为segment索引文件和数据文件;
![](http://i.imgur.com/1L4khKo.png)
b、Segment file命名规则是partition全局的第一个segment从0开始,后续每个Segment file
文件名为上一个Segment file最后一个消息的offset的值。数值最大为64位long大小,19位
数字字符长度,没有数字用0填充;
c、索引文件存储大量元数据,数据文件存储大量的消息,索引文件中的元数据指向对应数据文件中
message的物理偏移地址;
![](http://i.imgur.com/MjWEBBf.png)
d、Segment data file由许多message组成,物理结构如下:
![](http://i.imgur.com/5g6Bcpc.png)
1.3 Kafka查找Message
示例:读取offset=368776的message,需要通过下面两步查找:
![](http://i.imgur.com/1L4khKo.png)
第一步:查找segment file
00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0
00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1
00000000000000737337.index的起始偏移量为737338=737337 + 1
其他后续文件依次类推。
以起始偏移量命名并排序这些文件,只要根据offset **二分查找**文件列表,
就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index
和对应log文件;
第二步:通过segment file查找message
当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址
然后再通过00000000000000368769.log顺序查找直到offset=368776为止。