Kafka 高性能之 Page Cache 的应用哲学

《Kafka 高性能 7 大秘诀架构设计》系列第 5 弹《kafka 高性能之 Page Cache 的应用哲学》,在说 Page Cache 之前,先回顾下上一篇《Kafka 高性能之 Segment 消息存储机制的奥妙》。码哥补充一些关于稀疏索引的设计哲学,给大家加餐。

kafka 消息存储设计

Kafka 的消息存储会按照该 Topic 的 Partition 进行保存,即每个 Partition 都有属于自己的日志,在 Kafka 中被称为分区日志(partition log)。

每条消息在发送前会根据负载均衡策略计算出要发往的目标 Partition 中,broker 收到消息之后把该条消息按照追加的方式顺序写入对应 Partition 的日志文件中,充分了利用磁盘顺序写访问快的特性。如图 1 所示。

图 1

从图 2 可以看到磁盘顺序写的性能远高于磁盘随机写,甚至比内存随机写还快。

图 2,引自《武哥漫谈 IT》

Chaya:"具体的存储文件有哪些组成的?"

如果每个 partition 对应一个日志文件,文件可能会变得很大,对于消息的过期清除和检索都是一个大难题,因此 Kafka 会将每个分区的日志文件继续细分成若干个日志文件,这些日志文件也称作日志段文件(segment file),每个日志段文件都会伴随一个索引文件和时间戳索引文件。

log 文件

.log 后缀文件保存了 Kafka 消息的记录,而且每个 log 文件都有对应的消息记录范围,名字的数字代表了消息记录的初始位移值,并且随着消息数量的增多而增大,因此,每个新创建的分区一定会包含 0 的 log 文件。

索引文件

每个 log 文件都会包含两个索引文件,分别是 .index 和 .timeindex,在 Kafka 中它们分别被称为位移索引文件和时间戳索引文件,位移索引文件可根据消息的位移值快速地从查询到消息的物理文件位置,时间戳索引文件可根据时间戳查找到对应的位移信息。

稀疏索引

Chaya:"为什么不创建一个哈希索引,从 offset 到物理消息日志文件偏移量的映射关系?"

万万不可,Kafka 作为海量数据处理的中间件,每秒高达几百万的消息写入,这个哈希索引会把把内存撑爆炸。

稀疏索引不会为每个记录都保存索引,而是写入一定的记录之后才会增加一个索引值,具体这个间隔有多大则通过 log.index.interval.bytes 参数进行控制,默认大小为 4 KB,意味着 Kafka 至少写入 4KB 消息数据之后,才会在索引文件中增加一个索引项。

哈希稀疏索引把消息划分为多个 block ,只索引每个 block 第一条消息的 offset 即可 。稀疏哈希索引如图 3 所示。

图 3

有了稀疏索引,当给定一个 offset 时,Kafka 采用的是二分查找来扫描索引未见定位不大于 offset 的物理位移 position,再到日志文件找到目标消息。

利用稀疏索引,已经基本解决了高效查询的问题,但是这个过程中仍然有进一步的优化空间,那便是通过 mmap(memory mapped files) 读写上面提到的稀疏索引文件,进一步提高查询消息的速度

相关推荐
wWYy.7 小时前
分布式:数据复制
分布式
正儿八经的少年13 小时前
分布式 ID
分布式
七夜zippoe14 小时前
深入解析CANN仓库中的HCCL分布式通信库
pytorch·分布式·cann·hccl·通信库
AI人工智能+电脑小能手14 小时前
【大白话说Java面试题 第188题】【08_Kafka篇】第4题:Kafka 大量消息积压时该如何处理?
java·性能优化·kafka·故障排查·消息积压
富士康质检员张全蛋14 小时前
Kafka的操作 消费者组 消费位置查看
分布式·kafka
翔云12345614 小时前
Kafka + Flink实时时流处理场景
flink·kafka
运维行者_14 小时前
如何查看每个IP的带宽使用情况?NetFlow 技术实战指南
开发语言·网络·分布式·后端·架构·带宽
笨鸟先飞的橘猫14 小时前
游戏后端分布式学习——一致性协议Raft
分布式·学习·游戏
谢白羽14 小时前
vllm源码剖析14-vLLM 分布式推理-专家并行EP
笔记·分布式·llm·论文·vllm
翔云12345616 小时前
Kafka 使用场景
kafka