kafka的存储方式与区块链一样,都是文件存储,通过响应的.log和.index文件来存储,每一个partition为一簇.log和.index文件,一组.log和.index构成了一个segement,partition便是由多个segement组成
每有一条新消息,都会追加到partition的末尾,也会追加存储到该partition的存储文件中,当这个文件大于1G时,会创建一个新的.log文件。
如何找到一条消息呢?
除了.log文件外,还会有一个同名的.index文件来存储消息的索引信息
index文件的序号就是对应.log文件中第一条消息在所有消息中的相对偏移量(第n条消息)
例如000000000170410.log中存储的第一条消息是message-170411
举个例子:
现在我们要找到1560140921的消息:
1.定位到具体的segment日志文件,采用二分法先定位到index索引文件
由于log日志文件的文件名是这个文件中第一条消息的offset-1。
因此可以根据offset定位到这个消息所在日志文件:00000000001560140916.log
2.计算查找的offset在日志文件的相对偏移量
segment文件中第一条消息的offset = 1560140917
计算message相对偏移量:
需要定位的offset - segment文件中第一条消息的offset + 1 = 1560140921 - 1560140917 + 1 = 5
查找index索引文件, 可以定位到该消息在日志文件中的偏移字节为456。
直接读取文件夹00000000001560140916.log中偏移456字节的数据即可。