Kafka写入原理详解(图文全面总结)

Kafka是大型架构的必备中间件,下面我重点来详解Kafka写入原理@mikechen

Kafka

Apache Kafka 是一个高吞吐、可扩展、分布式的消息队列系统。

Kafka写入原理详解(图文全面总结)-mikechen

最初用于处理LinkedIn的活动流、和运营数据,现已广泛应用于实时日志分析、流处理…….等场景。

 

Kafka写入原理

在处理海量实时数据流的场景下,高吞吐量是 Kafka 的核心竞争力。

高效的写入能力,直接决定了 Kafka 能否支撑大规模的数据采集、和传输需求。

Kafka写入原理详解(图文全面总结)-mikechen

所以,要想掌握好Kafka,你需要深入理解Kafka的写入机制。

Kafka 的消息是顺序追加到日志文件中的(.log 文件),写入时不需要在文件中查找位置或修改已有内容。

Kafka写入原理详解(图文全面总结)-mikechen

传统的机械磁盘(HDD)的读写速度,受到多个物理因素的限制。

举一个例子,比如:寻道时间 (Seek Time), 磁头移动到目标磁道所需的时间,这是最耗时的操作。

随机写入操作需要磁头频繁地移动到不同的磁道和扇区,导致大量的寻道时间和旋转延迟,从而显著降低了写入性能。

相比之下,顺序写入操作磁头只需要很少的移动,甚至不需要移动,数据可以连续地写入相邻的扇区,极大地提高了写入效率。

当 Producer 发送消息到 Kafka Broker 的某个 Partition 时,Broker 会将这些消息顺序地追加到该 Partition 对应的日志文件 (Log File) 的末尾。

Kafka写入原理详解(图文全面总结)-mikechen

新的消息总是被写入到文件的尾部,而不是文件的中间或随机位置。

虽然 Kafka 的写入是顺序的,但为了保证读取性能,Kafka 还采用了缓存策略。

Kafka 的写入并不是直接把消息同步写入磁盘(调用 fsync),而是借助操作系统的页缓存(Page Cache),实现顺序写 + 异步落盘机制,从而达到性能与可靠性的平衡。

页缓存是操作系统提供的一种文件系统级缓存机制。当进程通过 write() 系统调用写入文件时,数据先被写入内核内存中的页缓存,再由操作系统异步写入磁盘。

流程,如下所示:

Producer
  ↓
Kafka Broker 接收数据
  ↓
写入 Partition 对应的 LogSegment(*.log)
  ↓
调用 Java FileChannel → mmap/buffer → write()
  ↓
数据写入 OS 页缓存(Page Cache)
  ↓
(异步)落盘 → 磁盘(fsync / flush / 内核调度)

当 Broker 将消息写入磁盘时,数据首先会被写入到 Page Cache 中。

然后由操作系统异步地将数据刷写到物理磁盘。这种延迟写入的方式可以提高写入吞吐量。

评论交流
    说说你的看法