kafka关键特⾊
• 可伸缩架构
• 高吞吐量
• consumer自动负载均衡
• 支持集群多副本
而本博客是一个kafka文件系统深入过程。
存储结构
目的:提高磁盘利用率和消息处理性能。
1. 在kafka文件系统中,同一个topic下有多个不同partition,每个partition创建一个目录。即topic下有分区的子目录。
2. 每个partion相当于一个巨型文件被平均分配到多个大小相等的多个segment(段)文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。即分区目录下log文件大小一样。而且一个分区段文件(log文件)对应一个索引文件(index文件)
3. 每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。
4. index为稀疏索引结构,并不存储每条记录的元数据信息。
如何在partition中快速定位segment file
- 同一个topic下有不同分区,每个分区下面会划分为多个(段)文件,只有一个当前文件在写(一个分区对应一个消费者),其他文件只读。当写满一个文件(写满的意思是达到设定值)则切换文件,新建一个当前文件用来写,老的当前文件切换为只读。文件的命名以起始偏移量来命名。删除文件时,使用了写时复制技术。
- 当消费者要拉取某个消息起始偏移量位置的数据变的相当简单,只要根据传上来的offset⼆分查找文件列表,定位到具体文件,然后根据索引文件⼆分搜索,定位到index中的offset,读取log文件的偏移量,定位到log,即可开始传输数据。
高效文件系统特点
1.一个大文件分成多个小文件段。
2.多个小文件段,容易定时清除或删除已经消费完文件,减少磁盘占用
3.index,log全部映射到memory直接操作,使用零拷贝加页缓存技术,避免segment file被交换到磁盘增加IO操作次数。
4.根据索引元数据信息,可以确定consumer每次批量拉取最大msg chunk数量。
5.索引文件元数据存储用的是相对前个segment file的 offset存储,节省空间⼤小