标签:kafka文件系统设计那些事 kafka文件系统设计 kafka文件系统
文件系统一般分为系统和用户2种类型,系统级文件系统:ext3,ext4,dfs,ntfs等等,,笔者并不会向大家介绍那种纷繁复杂的分布式或系统级文件系统,
而是从kafka架构高性能角度考虑,深入剖析kafka文件系统存储结构设计。
下面用图形表示介绍客户端处理几个过程如下:
图1
图2
目前假如kafka集群中只有一个broker,数据文件目录为message-folder,例如笔者创建一个topic名称为:report_push, partitions=4
存储路径和目录规则为:
xxx/message-folder
|--report_push-0
|--report_push-1
|--report_push-2
|--report_push-3
形象表示图如下:
图3
图4
每个partition(topic-name-index)目录中存储海量msg消息,那它是怎么存储的呢?文件存储结构是怎样?
这么多(海量)消息是存储在一个大文件中,类似DB那样存储,还是其他方式存储结构呢?笔者后续会像剥洋葱一样,给大家一层一层依次分解并分析。
这样做的目的是broker能快速回收磁盘空间,而且小文件也能mmap全部到内存。主要目的就是提高磁盘利用率和消息处理性能。
segment data file索引文件组成结构如下:读者从2.4节了解到kafka文件系统partition存储方式,下面向大家介绍一下partion文件存储中segement file组成结构。一个商业化消息队列的性能好坏,
其文件系统存储结构设计是衡量一个消息队列服务程序最关键指标之一,他也是消息队列中最核心且最能体现消息队列技术水平的部分。在本节中我们将走进segment file内部一探究竟。
segment file组成:由2大部分组成,分别为segment data file和segment index file,此2个文件一一对应,成对出现.
segment index file索引文件组成结构如下:
00000000000000000000.index 文件名称,文件串大小最大支持2^64bit
每次记录相应log文件记录的相对条数和物理偏移位置位置,共8bytes
4byte 当前segment file offset - last seg file offset记录条数 offset
4byte对应segment file物理偏移地址 position
………
00000000000000000000.log 文件名称,文件串大小最大支持2^64bit,与index对应
图5
参数说明:
4 byte CRC32:使用crc32算法计算除CRC32这4byte外的buffer。
1 byte “magic":表示数据文件协议版本号
1 byte “attributes":表示标识独立版本,标识压缩类型,编码类型。
key data:可选,可以存储判断或表示这个消息块的元数据信息。
payload data:消息体,该消息体可能会存储多条消息记录,内部是按照序号有序存储的。
图6
segment index file:
稀疏索引方式,减少索引文件大小,这样可以直接内存操作,稀疏索引只为数据文件的每个存储块设一个键-指针对,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间,通过二分查找快速找到segment data file物理位置,如果在index file没有找到data file具体位置,则data file相对位置继续顺序读取查找,直到找到为止。
图7
同一个topic下有不同分区,每个分区下面会划分为多个(段)文件,只有一个当前文件在写,其他文件只读。当写满一个文件(写满的意思是达到设定值)则切换文件,新建一个当前文件用来写,老的当前文件切换为只读。文件的命名以起始偏移量来命名。看一个例子,假设report_push这个topic下的0-0分区可能有以下这些文件:
? 00000000000000000000.index
? 00000000000000000000.log
? 00000000000000368769.index
? 00000000000000368769.log
? 00000000000000737337.index
? 00000000000000737337.log
? 00000000000001105814.index
? 00000000000001105814.log
………………..
其中 00000000000000000000.index表示最开始的文件,起始偏移量为0.第二个文件00000000000000368769.index的消息量起始偏移量为368769.同样,第三个文件00000000000000737337.index的起始偏移量为737337.
以起始偏移量命名并排序这些文件,那么当消费者要拉取某个消息起始偏移量位置的数据变的相当简单,只要根据传上来的offset**二分查找**文件列表,定位到具体文件,
然后将绝对offset减去文件的起始节点转化为相对offset,即可开始传输数据。例如,同样以上面的例子为例,假设消费者想抓取从第368969消息位置开始的数据,则根据368969二分查找,
定位到00000000000000368769.log这个文件(368969在368769和737337之间),根据索引文件二分搜索可以确定读取数据最大大小。
图8
基本不会有磁盘读的大量操作,都在内存进行,只有定期磁盘批量写操作。
高效文件系统特点
标签:kafka文件系统设计那些事 kafka文件系统设计 kafka文件系统
原文地址:http://blog.csdn.net/lizhitao/article/details/40543631