kafka的索引机制
概述
数据文件的分段和索引
kafka解决查询效率的手段之一是将数据文件分段存储,可以配置每一个文件的大小。每一个端单独放在一个.log的文件中,数据文件命名是20个字符的长度,以每一个分段文件开始的最下offset来命名,其他位置用0填充。最初始的文件是00000000000000000000.log命名的,比如下一个log中的第一条消息的offset是18987,则该log文件的命名是00000000000000018987.log
其中每一个log文件的大小默认是1GB,没生成一个log文件就会对应产生一个index文件,是和log文件的命名相同的。这样在进行消息检索的时候可以快速利用二分的方法进行查找,定位到某一个分段文件中。
数据文件的分段使得可以在一个较小的数据文件中找到对应的offset的message了。在index文件中的索引实际也是稀疏性的,并不是全部都建立索引的。(这也是考虑到index文件在加载到内存的时候,能不占用大量的内存和CPU资源)索引文件中包含的若干条目,每个条目表示的数据文件中的一条message的索引——是当前的message在数据文件的offset和在文件的position(message在文件中的绝对位置信息)的对应关系。如下图所示:
其中00000000000000000000.index文件中的3,4597对应到00000000000000000000.log文件中的第三条消息,并且该消息的绝对位置是4597。但是如果消费者想要 获取5,7912的话,此时index文件中并没有5,所以根据二分查找,先找到3的位置,在进行顺序扫描从而找到5,7912的message。
index文件中并没有为每一条message建立索引。而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引,这样的话就是避免了索引文件占用过多的空间和资源,从而可以将索引文件保留到内存中。缺点是没有建立索引的数据在查询的过程中需要小范围内的顺序扫描操作。
索引文件映射到内存的话,从而提高了查找的速度信息。