概要:1、topic中partition存储分布
2、partiton中文件存储方式
3、partiton中segment文件存储结构:组成、命名、index log关系、msg组成
4、在partition中怎样通过offset查找message:先找segment,在找msg
5、实际执行效果(读少,批量定期写多,和msg设计有关)
总结 Kafka高效文件存储设计特点:
1、topic中parition大文件分成多个小文件,easy定期删除消费完文件,降低磁盘占用
2、索引信息,高速定位message和确定response最大大小
3、index元数据所有映射到memory,避免segment file的IO磁盘
4、稀疏索引,降低index文件元数据占空间
前复习概念
Broker:消息处理结点,一个Kafka节点就是一个broker,多个broker组成Kafka集群
Topic:一类消息,比如page view日志、click日志等都能够以topic的形式存在。Kafka集群能够同一时候负责多个topic的分发。
Partition:多segment组成有序队列。一个topic多个partition,每个partition
Segment:partition物理上由
offset:partition中消息连续序列号
一、topic中partition存储分布
如仅一个broker。xxx/message-folder为数据文件存储根文件夹,在Kafka broker中server.properties文件配置(參数log.dirs=xxx/message-folder)。
同一topic下多个不同partition,每个partition为一个文件夹,topic名+有序序号,0开始
如2个topic名为report_push、launch_info, partitions数量都为4,存储路径和文件夹规则为:
二、partiton中文件存储方式
1、每个partion平均分到,多个大小相等segment(段)里
2、但segment file消息数量不一定相等,方便old segment file高速被删除(默认每一个文件1G)
3、每个partiton顺序读写即可。segment生命周期由服务端配置决定,方便高速删除,提高磁盘利用率
三、segment文件存储结构
1、由index file和data file成对组成,后缀”.index”和“.log”
2、命名规则:partion第一个segment从0开始,每个名称为上一个segment文件最后消息offset值(最大为64位long,19位,没有用0填)
如下:topicXXX包括1 partition,每个segment 500MB,producer向broker写入大量数据:
3、index<—->data file相应关系:
1)索引文件:存大量元数据,指向相应数据文件message物理偏移地址
2)数据文件:存大量消息,
例:数据3, 497,表示第3个message(全局partiton表示第368772个message)、偏移地址497
4、消息结构:
CRC32:用crc32校验message
magic:Kafka服务程序协议版本号
attributes:独立版本号、或标识压缩类型、或编码类型
K byte key 可选
value bytes payload:实际消息数据
四、partition怎样通过offset找message
读offset=368776 message,2个步骤查找
1、查找segment file(以起始排序,依据offset 二分查找)
上述为例00000000000000000000.index表示开始,offset为0.第二个00000000000000368769.index偏移量为368770 = 368769 + 1.相同,第三个文件00000000000000737337.index偏移量为737338=737337 + 1,依次类推。
368776定位到00000000000000368769.index|log
2、通过segment file查找message
通过00000000000000368769.log顺序查找直到offset=368776为止
优点:稀疏索引,降低索引文件大小:通过mmap直接内存操作,稀疏索引为每个message设置元数据指针,比稠密索引省空间,但查找消耗时间
五、实际执行效果
Kafka集群:由2台虚拟机组成
cpu:4核 物理内存:8GB 网卡:千兆网卡 jvm heap: 4GB
大量读磁盘少,主要是定期批量写磁盘操作,因此操作磁盘非常高效。跟读写message设计相关:
1、写message:1)消息从java堆转入page cache(即物理内存),2)page cache异步刷盘
2、读message:1)从page cache转入socket发出 2)page cache没找到,磁盘IO Load到page cache, 从socket发出
https://www.cnblogs.com/cynchanpin/p/7339537.html