美文网首页
kafka分区、分段、稀疏索引实现高性能查询

kafka分区、分段、稀疏索引实现高性能查询

作者: 机灵鬼鬼 | 来源:发表于2019-07-24 13:49 被阅读0次

    我们以几张图来总结一下Message是如何在Kafka中存储的,以及如何查找指定offset的Message的。

    Message是按照topic来组织,每个topic可以分成多个的partition,比如:有5个partition的名为为page_visits的topic的目录结构为:

    partition是分段的,每个段叫LogSegment,包括了一个数据文件和一个索引文件,下图是某个partition目录下的文件:

    可以看到,这个partition有4个LogSegment。

    比如:要查找绝对offset为7的Message:

    1. 首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。

    2. 打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。

    3. 打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

    这套机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。

    一句话,Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。

    其中kafka的log.dirs目录中replication-offset-checkpoint文件记录了所有topic的offset,从零开始

    在broker的log存储文件下,除了存储这各个topic的文件夹,还存在这几个checkpoint文件。分别是

    recovery-point-offset-checkpoint 负责记录topic已经被写入磁盘的offset

    replication-offset-checkpoint 负责记录已经被复制到别的topic上的文件

    __consumer_offsets存储各个topic的offset。但是,他的只有一份。

    logStartOffset 日志段集合中第一个日志段(segment)的基础位移,也就是这个日志对象的基础位移

    LogEndOffset 下一条将要被加入到日志的消息的位移

    相关文章

      网友评论

          本文标题:kafka分区、分段、稀疏索引实现高性能查询

          本文链接:https://www.haomeiwen.com/subject/gliccctx.html