【Kakfa】Kafka 的Topic中 Partition 数据是怎么存储到磁盘的?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【4月更文挑战第13天】【Kakfa】Kafka 的Topic中 Partition 数据是怎么存储到磁盘的?

Kafka 的 Topic 中的 Partition 数据存储到磁盘的过程是 Kafka 中非常重要的一环,因为这直接影响到 Kafka 的性能和可靠性。Kafka 的设计理念之一是基于持久化日志的消息传递系统,因此 Partition 数据的存储方式是通过日志(Log)的方式进行的。

下面我将详细介绍 Kafka 中 Partition 数据是如何存储到磁盘的,并附上相关的示例代码。

1. 分区日志文件(Partition Log)

每个 Kafka 的 Topic 的 Partition 都有自己的分区日志文件,用于持久化存储该 Partition 的消息数据。这些分区日志文件被保存在 Kafka 服务器的磁盘上,通常位于 Kafka 的数据目录下。

2. 日志段(Log Segment)

分区日志文件由一个或多个日志段(Log Segment)组成,每个日志段都是一个独立的文件,用于顺序地存储一定数量的消息数据。每个日志段都有一个起始偏移量(Start Offset)和一个结束偏移量(End Offset),用于标识该日志段中存储的消息范围。

3. 消息追加写入

当生产者向某个 Partition 发送消息时,Kafka 会将这些消息以追加写入的方式写入到该 Partition 对应的分区日志文件的末尾。这意味着新的消息会被追加到当前日志段的末尾,并且保证了消息的顺序性。

4. 分段和滚动

当一个日志段达到一定的大小限制(通常是通过配置参数控制)或者一定的时间间隔后,Kafka 就会创建一个新的日志段,并将新的消息追加到新的日志段中。这种机制称为日志的分段(Segmentation)和滚动(Rolling),通过这种方式,Kafka 实现了日志的循环复用,避免了单个日志文件过大导致的性能问题。

5. 日志索引(Log Index)

为了加速消息的检索和查找,Kafka 维护了一个日志索引(Log Index)。日志索引记录了消息在分区日志文件中的位置(偏移量)和对应的物理偏移量(文件位置),以便快速地定位到消息所在的位置。日志索引通常采用稀疏索引的方式,记录了一些关键位置的偏移量信息,以减少索引的存储开销和提高检索效率。

6. 消息持久化和数据复制

一旦消息被写入到分区日志文件中,它就被认为是已经持久化了。即使在消息写入到磁盘之前,Kafka 也会将消息缓存在页面缓存中,以确保消息的可靠性。此外,Kafka 还支持数据复制机制,将消息复制到多个副本中,以提高数据的可用性和容错性。

示例代码

以下是一个简单的 Kafka 生产者示例代码,演示了如何向指定的 Topic 的 Partition 发送消息:

import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class KafkaProducerExample {
   

    public static void main(String[] args) {
   
        // 设置 Kafka 生产者的配置参数
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092"); // Kafka 服务器地址和端口号
        props.put("acks", "all"); // 等待所有副本确认
        props.put("retries", 0); // 不进行消息重试
        props.put("batch.size", 16384); // 消息批量发送大小
        props.put("linger.ms", 1); // 等待时间,控制批量发送

的时间
        props.put("buffer.memory", 33554432); // 缓冲区大小
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // Key 序列化器
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // Value 序列化器

        // 创建 Kafka 生产者
        Producer<String, String> producer = new KafkaProducer<>(props);

        // 发送消息
        try {
   
            for (int i = 0; i < 10; i++) {
   
                // 构造消息记录
                ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", Integer.toString(i), "Message " + i);
                // 发送消息
                producer.send(record);
            }
        } catch (Exception e) {
   
            e.printStackTrace();
        } finally {
   
            // 关闭生产者
            producer.close();
        }
    }
}

以上示例代码演示了如何创建一个 Kafka 生产者,并向指定的 Topic 的 Partition 发送消息。在实际生产环境中,可以根据具体的需求和场景对生产者的配置参数进行调整,并根据需要进行消息的生产和发送。

结论

Kafka 的 Topic 中的 Partition 数据存储到磁盘的方式是通过日志(Log)的方式进行的,Kafka 采用了基于持久化日志的存储模型。通过将消息以追加写入的方式存储到分区日志文件中,并维护日志索引,Kafka 实现了高吞吐量、低延迟和可持久化的特性,适合处理大规模的实时数据流。

相关文章
|
13天前
|
消息中间件 SQL 分布式计算
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
46 7
|
6天前
|
消息中间件 存储 运维
为什么说Kafka还不是完美的实时数据通道
【10月更文挑战第19天】Kafka 虽然作为数据通道被广泛应用,但在实时性、数据一致性、性能及管理方面存在局限。数据延迟受消息堆积和分区再平衡影响;数据一致性难以达到恰好一次;性能瓶颈在于网络和磁盘I/O;管理复杂性涉及集群配置与版本升级。
|
13天前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
20 4
|
13天前
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
44 4
|
13天前
|
消息中间件 存储 缓存
大数据-71 Kafka 高级特性 物理存储 磁盘存储特性 如零拷贝、页缓存、mmp、sendfile
大数据-71 Kafka 高级特性 物理存储 磁盘存储特性 如零拷贝、页缓存、mmp、sendfile
29 2
|
13天前
|
消息中间件 JSON 大数据
大数据-66 Kafka 高级特性 分区Partition 副本因子Replication Factor replicas动态修改 线上动态修改副本数
大数据-66 Kafka 高级特性 分区Partition 副本因子Replication Factor replicas动态修改 线上动态修改副本数
24 1
|
13天前
|
存储 消息中间件 大数据
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
25 1
|
13天前
|
存储 消息中间件 大数据
大数据-68 Kafka 高级特性 物理存储 日志存储概述
大数据-68 Kafka 高级特性 物理存储 日志存储概述
16 1
|
14天前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
18 1
|
2月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
159 9