Kafka_深入探秘者(6):kafka 物理存储
一、kafka 存储结构
1、kafka 存储结构概述图
2、kafka 存储结构概述
-
每一个 partion (文件夹)相当于一个巨型文件被平均分配,到多个大小相等 segment(段) 数据文件里。但每一个段 segment file 消息数量不一定相等,这样的特性方便 old segment file 高速被删除。(默认情况下每一个文件大小为1G)。
-
每一个 partiton 仅仅须要支持顺序读写即可了。segment 文件生命周期由服务端配置参数决定。
3、partiton 中 segment 文件存储结构
-
1)segment file 组成: 由 2 大部分组成。分别为 index file 和 datafile,此2个文件-一相应,成对出现,后缀”.index”和”.log” 分别表示为 segment 索引文件、数据文件。
-
2)segment 文件命名规则: partion 全局的第一个 segment 从 0 开始,兴许每一个 segment 文件名称为上一个 segment 文件最后一条消息的 offset 值。
-
3)数值最大为64位 long 大小。19位数字字符长度,没有数字用0填充。
二、kafka 日志索引
1、akafka 存储 数据文件的分段
Kafka 解决查询效率的手段之一是将数据文件分段,比如有100条 Message,它们的 offset 是从0到99。假设将数据文件分成5段,第一段为0-19,第二段为20-39,以此类推,每段放在一个单独的数据文件里面,数据文件以该段中最小的 offset 命名。这样在查找指定 offset 的 Message 的时候,用二分查找就可以定位到该 Message 在哪个段中。
2、kafka 存储 偏移量索引
数据文件分段使得可以在一个较小的数据文件中查找对应 offset 的 Message 了,但是这依然需要顺序扫描才能找到对应 offset 的 Message。为了进一步提高查找的效率,Kafka 为每个分段后的数据文件建立了索引文件,文件名与
数据文件的名字是一样的,只是文件扩展名为.index。
3、文件索引图
4、kafka 文件索引查找概述:
比如: 要查找绝对 offset 为 7 的 Message:
-
1)首先是用二分查找确定它是在哪个 LogSegment 中,自然是在第一个 Segment 中。打开这个 Segment 的 index 文件,也是用二分查找找到 offset 小于或者等于指定 offset 的索引条目中最大的那个 offset。自然 offset 为6的那个索引是我们要找的,通过索引文件我们知道 offset 为6的 Message在 数据文件中的位置为 9807。
-
2)打开数据文件,从位置为 9807 的那个地方开始顺序扫描直到找到 offset 为 7 的那条 Message。
-
3)这套机制是建立在 offset 是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。
-
4)Kafka 的 Message 存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。
三、kafka 日志清理、总结
1、kafka 日志删除清理
Kafka 日志管理器允许定制删除策略。目前的策略是删除修改时间在N天之前的日志(按时间删除),也可以使用另外一个策略:保留最后的N GB数据的策略(按大小删除)。为了避免在删除时阻塞读操作,采用了 copy-on-write 形式的实现,删除操作进行时,读取操作的二分查找功能实际是在一个静态的快照副本上进行的,这类似于 java 的 CopyOnWriteArrayList。
2、Kafka 消费日志删除思想:
Kafka 把 topic 中一个 parition 大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。
3、kafka 日志删除清理代码:
# 切换目录
cd /usr/local/kafka/
# 编辑配置文件,配置kafka日志删除清理
vim kafka-01/conf/server.properties
# 修改以下几项内容:
# 启用删除策路
log.cleanup.policy=delete
# 直接删除,删除后的消息不可恢复。可配置以下两个策略: 清理超过指定时间清理:
log.retention.hours=16
# 超过指定大小后,删除旧的消息:
log.retention.bytes-1073741824
4、kafka 日志压缩
将数据压缩,只保留每个 key 最后一个版本的数据。首先在 broker 的配置中设置 log.cleaner.enable=true 启用 cleaner,这个默认是关闭的。在 Topic 的配置中设置 log.cleanup.policy=compact 启用压缩策略。
5、磁盘存储优势
- 1)kafka 采用消息顺序追加技术 提升存储性能。
Kafka 在设计的时候,采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且不允许修改已经写入的消息,这种方式属于典型的顺序写入此判断的操作,所以就算是 Kafka 使用磁盘作为存储介质,所能实现的吞吐量也非常可观。
-
2)Kafka 中大量使用页缓存,这也是 Kafka 实现高吞吐的重要因素之一。
-
3)除了消息顺序追加,页缓存等技术,Kafka 还使用了零拷贝技术来进一步提升性能。
“零拷贝技术"只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术“只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。
6、kafka 物理存储 总结
- 1)Kafka 自身的日志格式、日志索引、日志清理等方面的内容,
- 2)kafka 底层物理存储
- 3)kafka 文件索引查找
上一节关联链接请点击
# Kafka_深入探秘者(5):kafka 分区