Kafka 学习笔记之 数据存储与高效读写

本文详细介绍了Kafka的数据存储结构,包括topic与partition的逻辑与物理概念,以及segment的存储方式,强调了Kafka如何通过segment保证数据查询效率。同时,文章探讨了Kafka的高效读写机制,包括顺序写和零拷贝,解释了它们如何提升数据读写性能,以确保大数据场景下的高吞吐量。
摘要由CSDN通过智能技术生成

前言

​ 上一篇笔记中概述了一下什么是消息队列以及 kafka 的组织架构,这篇笔记就来整理一下 kafka 是如何存储数据,以及其怎么保证了大数据场景下的高效读写,文中如有错误与纰漏欢迎指正,共同进步!

kafka 数据存储结构

topic 与 partition

​ 在 kafka 的架构中有讲到作为基于订阅/发布模式的消息队列 kafka 的所有操作都是面向 topic 的,而为了水平扩展的弹性和增大吞吐量在 kafka 中又可以将一个 topic 分成多个 partition 分布在不同的机器上。因此 topic 实际上是逻辑上的概念,而 partition 则是物理上的概念,要证实这一点我们只需要看看 kafka 如何保存数据文件即可。我在自己的 kafka 服务其上面建立了一个名为 first 的 topic 并设置备份因子为 2,可以看到在 1 号和 2号 broker 上分别存有 0 号分区和 1 号分区的数据,接下来我们去看看其是如何存储的。

在这里插入图片描述

1 号 broker 2 号 broker
在这里插入图片描述 在这里插入图片描述

​ 可以看到每个分区存储的文件夹的命名实际上是主题名-分区号,由此可以看到 partition 对应的是物理的存储,而由于这样的情况 kafka 中每个 partition 的数据是有序的但是并不是连续有序的,因此在分布式的 kafka 集群中(有不只一个 partition) 想要全局有序的消费数据是做不到的。不过到这里也只是一个文件夹,究竟怎么存的还没看到呢那接下来就来说明一下 kafka 的数据存储单元 segment。

segment

​ 首先思考一个问题,kafka 作为一个消息队列其只支持持久化的数据存储 (默认存 168 h 即 7 天),而随着数据量的增大势必会导致读取数据的速度变慢,而为了应对这种情况 kafka 使用了一种其称为 segment 的结构来存储数据具体可见下图:

在这里插入图片描述

​ 上图中一个 topic 分为了多个 partition 而一个 partition 中存储着当前 partition 的数据文件,为了解决之前提到的数据文件过大影响效率的问题 kafka 将数据文件设计成了 segment 的形式,上图中可以看到 log-data 被分为多个 segment(每个 segment 默认大小 500 MB),而一个 segment 由一个 .log 文件和 .index 文件组成,其中 .log 文件存储真实的数据而 .index 文件则作为索引来提高查询效率,具体的 segment 组成见下图,可以看到 segment 中的文件命名是通过一串数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值