Kafka技术知识总结之七——Kafka磁盘存储

本文深入解析Kafka如何利用页缓存和零拷贝技术实现每秒上百万的高并发写入。通过顺序写磁盘和优化数据传输流程,大幅提升了Kafka的写入效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇《Kafka技术知识总结之六——Kafka负载均衡策略》

七. 磁盘存储

参考地址:
《Kafka如何实现每秒上百万的高并发写入》
《深入理解 Kafka:核心设计与实践原理》5.5 章节

Kafka 在大数据领域有极为广泛的运用,配置良好的 Kafka 集群甚至可以做到每秒几十万、上百万的超高并发写入。通常磁盘写入是一种非常缓慢的操作,Kafka 的高并发写入主要是依靠页缓存零拷贝两种技术实现的。

7.1 页缓存

操作系统本身有一层缓存,叫做页缓存 (Page Cache),又被称为 OS Cache,即为操作系统自己管理的缓存。页缓存可以将磁盘中的数据缓存到内存中,将对磁盘的访问转换为对内存的访问。
Kafka 大量使用了页缓存,Kafka 在准备将消息写入磁盘中时,可以直接写入页缓存中,接下来操作系统自己决定什么时候将页缓存中的数据真正刷入磁盘中。这样的设计使得 Kafka 将消息写入磁盘的效率大幅提升。
Kafka页缓存

此外 Kafka 写入数据时采用了文件追加的方式写入消息,在日志文件的尾部追加新消息,属于典型的顺序写盘的操作,它依赖于硬盘来存储和缓存消息。通常来说,内存的读写效率要高于磁盘,但磁盘的顺序读写效率也是非常高的,顺序写磁盘的速度甚至高于随机写内存的速率。所以 Kafka 使用了顺序写磁盘的方式做持久化工作。

7.2 零拷贝 (Zero-Copy)

页缓存技术主要用于消息写入 Kafka Broker 端的磁盘,零拷贝技术用于 Kafka Broker 将消息推送给下游消费者。

7.2.1 传统 IO

Kafka Broker 将消息发送给下游的消费者,如果在什么优化都不做的情况下,应该是如下流程:

  1. Kafka Broker 从磁盘中读取消息数据到系统内存;(内核模式)
  2. 系统内存拷贝数据到 Kafka Server 服务的缓存中(内核模式 -> 应用模式)
  3. Kafka Server 服务将缓存中的消息数据复制到操作系统的 Socket 缓存中(应用模式 -> 内核模式)
  4. Socket 缓存将消息数据通过网卡发送出去(内核模式)

上面未优化的过程中,步骤 2 与步骤 3 是没有必要的,这两个步骤中间发生了两次没有必要的上下文切换,而上下文切换是十分消耗性能的。上下文切换状态如下图所示:
传统IO上下文切换

注:传统的拷贝方法为:

  1. 当设备接收到数据,向 CPU 报告中断;
  2. CPU 处理中断;
  3. CPU 将数据从设备寄存器数据读到内存;

传统拷贝方法的步骤 2, 3 是先等待 CPU 中断处理完毕后,再将数据读入内存。而每次的 IO 中断都会带来 CPU 的上下文切换
在现代操作系统中引入了直接内存访问 (DMA, Direct Memory Access) 技术,它允许不同速度的硬件装置沟通,不需要依赖 CPU 的大量中断负载,数据的读写请求由 DMA 控制器接管,减少了 CPU 的负担。

7.2.2 零拷贝技术

参考地址:
《零拷贝简述》
高性能IO背后原理—零拷贝技术概述

Kafka 为了解决这个问题,在读消息时引入了零拷贝技术。零拷贝技术跳过了步骤 2 与步骤 3,跳过了两个上下文切换的步骤,将内核中的数据直接传输给 Socket 缓存,如下图所示。
无描述符零拷贝
上图中的 transferTo() 方法调用过程中的步骤如下:

  1. transferTo() 方法触发 DMA 引擎,将文件内容拷贝到一个读取缓冲区;(内核模式)
  2. 内核将数据拷贝到 Socket 缓冲区;(内核模式)
  3. DMA 引擎将数据从 Socket 缓冲传到网卡设备。(内核模式)

这样就将上下文切换次数减少到两次,即只留下必须的两次切换。但依旧还有优化的内容。因为步骤 2 中的拷贝过程属于重复拷贝,可以将该步骤进行优化。步骤如下:

  1. transferTo() 方法触发 DMA 引擎,将文件内容拷贝到内核缓冲区;(内核模式)
  2. 关于数据的位置和长度的信息的描述符被追加到了 Socket 缓冲;
  3. DMA 引擎将数据从 Socket 缓冲传到网卡设备。(内核模式)

通过使用拷贝描述符的方法取代了拷贝数据,消除了剩下的最后一次 CPU 拷贝。

### Kafka 工作原理及架构详解 #### 1. Kafka 的定义与特点 Kafka 是一种高吞吐量、分布式的发布订阅型消息系统,能够处理大量的实时数据流[^1]。其核心目标是实现高效的数据传输和持久化存储,支持大规模分布式系统的运行需求。 以下是 Kafka 的主要特性: - **高吞吐量**:即使在非常高的数据速率下也能保持稳定的性能。 - **可扩展性**:通过水平扩展来增加容量和支持更多的客户端连接。 - **持久性和可靠性**:所有的消息都会被持久化到磁盘并复制多个副本以防止数据丢失。 - **低延迟**:能够在毫秒级时间内完成消息的生产和消费操作。 这些特性的背后依赖于 Kafka 特定的设计理念和技术实现方式[^2]。 --- #### 2. Kafka 的基础架构 Kafka 的整体架构由以下几个关键组件构成: ##### (1) 生产者(Producer) 生产者负责向 Kafka 集群中的特定主题(Topic)发送消息。为了提高效率,生产者会批量提交消息,并可以选择同步或异步的方式进行写入[^3]。 ##### (2) 消费者(Consumer) 消费者从指定的主题读取消息。每个消费者属于某个消费者组(Group),同一组内的不同消费者可以分区(Partition)地消费同一个 Topic 中的消息,从而达到负载均衡的效果。 ##### (3) 主题(Topic) 和 分区(Partition) Topic 是逻辑上的队列名称,而 Partition 则是对该队列的实际物理划分。每条记录会被分配给其中一个 Partition 存储起来。这种设计使得单个 Topic 能够跨越多台服务器,极大地提升了系统的并发能力。 ##### (4) 经纪人(Broker) Broker 即为 Kafka 实例本身,在集群环境中可能有多个 Broker 同时工作。它们共同管理着所有 Topics 及其实现细节,比如如何分发请求以及维护元数据信息等。 ##### (5) ZooKeeper ZooKeeper 提供了一个集中化的配置管理和协调服务,用于跟踪 Brokers 状态变化情况、选举 Leader Partitions 并通知相关方做出相应调整[^4]。 --- #### 3. Kafka 的工作流程 整个过程大致分为三个阶段——发送数据、保存数据和消费数据。 ##### (1) 发送数据 当 Producer 准备好要发布的消息之后,它会选择合适的 Target Partition 将其投递给对应的 Broker 上面去执行后续动作;与此同时还可以设置 Key 来决定具体路由规则以便更好地控制顺序关系或者一致性哈希算法随机散列等方式来进行分配。 ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') future = producer.send('my-topic', b'raw_bytes') result = future.get(timeout=60) ``` ##### (2) 保存数据 一旦接收到新的 Entry 请求后,Targeted Partition 所属的那个 Replica Set 当前担任 leader 角色便会立即追加至本地日志文件末尾处形成不可变序列形式永久保留下来直到满足预设条件才会触发删除机制清除过期项目。 ##### (3) 消费数据 Consumers 订阅感兴趣的一个或几个 topics ,并通过 poll() 方法定期拉取最新可用 offset 对应位置开始逐条解析直至结束为止 。值得注意的是 Offset Management 默认交给了 Consumer Group 自己内部解决冲突问题确保不会重复计算相同内容两次以上。 ```python from kafka import KafkaConsumer consumer = KafkaConsumer('my-topic', group_id='my-group', bootstrap_servers=['localhost:9092']) for message in consumer: print("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition, message.offset, message.key, message.value)) ``` --- #### 4. 总结 综上所述,Apache Kafka 不仅具备强大的功能还拥有灵活易用 API 接口方便开发者快速集成进现有业务体系当中发挥重要作用。通过对上述知识点的学习可以帮助我们更加深入理解这个开源软件背后的运作机理及其优势所在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值