通过之前文章的介绍:
7.解析 Kafka 中的 Topic 和 Partition
我们已经了解了 ①Kafka 中 Topic 和 Partition 的概念 ②Kafka 分区在集群中是如何分配的 ③Kafka 消息的分发策略 ④Kafka 的 Rebalance 操作 ⑤Kafka 消费端如何确定它该消费哪个分区数据 等。。
接下来,让我们来了解一下 Kafka 的消息内部存储
1.Kafka 消息存储在哪里?
当 Kafka 发送端将消息发送至 Broker 上以后,会将消息持久化到磁盘上,以此来完成 Kafka 消息的持久化保存。Kafka 是使用日志的形式来保存生产者和消费者的消息,每条消息都包含一个 offset 值来保存它在当前分区的偏移量。
因为 Kafka 中存储的一般都是大数据,海量的消息内容。为了避免 log 日志文件的过大,log 文件并不是直接对应到一个磁盘上的日志文件,而是对应到磁盘上的一个目录。该目录的命名规则为 <topic_name-partition>_<id>,比如创建一个名为 test的 Topic,其中有 3 个partitions,那么在 Kafka 的数据目录(/tmp/kafka-log)中就有3个目 录,分别是 test-0~2(该数据目录可以在 conf/server.properties 配置文件中自定义)。如下图所示
2.Kafka 内部是如何存储消息的?
2.1 Kafka 采用顺序写入方式存储数据
由于消息在发送至 Broker 时,都会持久化到磁盘上。当消息被消费时,则会从磁盘上读取消息去消费。我们现在大部分企业仍然用的是机械结构的磁盘,我们如果把消息以随机的方式写入磁盘,那么磁盘首先要做的就是寻址,也就是定位到数据所在磁盘的物理地址,在磁盘上就要找到对应的柱面、磁头以及对应的扇区,这个过程相对内存来说会消耗大量的时间。为了规避随机读写带来的时间消耗问题,Kafka 采用顺序写入的方式存储数据
2.2 I/O操作造成的磁盘性能瓶颈,引出“零拷贝”技术
虽然 Kafka 采用顺序写入的方式存储数据,但是频繁的 I/O 操作仍然会造成磁盘的性能瓶颈问题。针对 I/O 性能问题,Kafka 还有一个更厉害的性能优化策略,这就是"零拷贝"技术的由来。
Kafka 消息存储原理,到此处就介绍完毕。如果本文对你有所帮助,那就给我点个赞呗 ^_^
如需了解 Kafka "零拷贝"技术,请点击链接跳转:【传送门】Kafka 的零拷贝技术
End