kafka之八 存储结构
存储结构
存储结构概述
- 每一个partition相当于一个巨型文件被平均分配到多个大小相等segment数据文件里面
- 每一段segment file消息数量不一定相等,这方方便old segment file高速被删除,默认1g
- 每一个partition只要支持顺序读写即可,segment的生命周期有服务端配置参数决定
- segment文件的存储结构
- 由index file和data file组成,成对出现,后缀为.index和.log
- segmentwe年命名规则,partition全局第一个segment从0开始,每一个segment文件名称为上一个segment文件最后一条消息的offset值
- 数值最大为64位long大小,19位数字字符长度,没有数字用0填充
日志索引
数据文件的分段
- kafka解决查询效率手段之一就是数据文件分段,平均按照offset来分段,然后
每段放在一个数据文件里面,用该段最小的offset命名,查找的时候就用二分法很快找到找哪个文件里
偏移量索引
- kafka为每个分段后的数据文件建立了索引文件,文件名和数据文件的名字一样,文件扩展名为,index
- 查找流程就是先用分区,分段,索引来达到高效性
日志清理
日志删除
- kafka日志管理器运行定制删除策略,默认的是删除修改时间在N天之前的日志,
- 第二个策略是保留最后N GB数据的策略,
- 避免删除时的阻塞读操作,采用了copy-on-write行驶的实现,读的是快照
- kafka吧topic中的partition大文件分成多个小文件段,容易定期删除或清理已经消费完的文件
log.cleanup.policy=delete 启动删除策略
log.retention.hours=16 清理超过指定时间的文件
log.retention.bytes=1073741824 超过指定大小,删除旧的消息
日志压缩
- 将数据压缩,只保留每个key最后一个版本的数据,在broker的配置中设置log.cleaner.enable=true启用cleaner
在topic中设置log.cleanup.policy=compact启动压缩策略 - 压缩后的offset可能是不连续的,因为消息会被merge了
- 适合特殊场景,如key是用户id,消息时用户的资料
- 压缩策略支持删除,当key最新版本没有内容,这个key会被删除
磁盘存优势
- kafka只能用文件追加的方式来写入消息,只能在日志文件的尾部追加新的消息,不允许修改已经写入的消息.所以是顺序读取比较快
- 大量使用页缓存,也是实现高吞吐的重要因素
- 用零拷贝技术提高性能,零拷贝:只将磁盘文件的数据复制到页面缓存一次,然后
将数据从页面缓存直接发送到网络中,避免重复复制操作