本文主要聚焦 kafka 的日志存储以及日志清理相关。首先我们来看一张 kafak 的存储结构图。如上图所示、kafka 中消息是以主题 topic 为基本单位进行归类的,这里的 topic 是逻辑上的概念,实际上在磁盘存储是根据分区存储的,每个主题可以分为多个分区、分区的数量可以在主题创建的时候进行指定。
Kafka中的消息是存储在磁盘上的,一个分区副本对应一个日志(Log)。为了防止Log过大,Kafka又引入了 日志分段 (LogSegment)的概念,将Log切分为多个LogSegment ,相当于一个 巨型文件被平均分配为多个相对较小的文件 ,这样也便于消息的维护和清理。
与生产者一样,消费者主动的去kafka集群拉取消息时,也是从 Leader 分区去拉取数据。
在Kafka中,事件是时间戳、键值对和标头组成的数据记录,它支持多种应用场景,如用户行为跟踪或传感器数据。Kafka通过压缩或删除策略来管理日志,确保数据持久且高效存储。当代理节点出现问题时,Kafka的领导者选举机制会确保数据一致性,自动恢复到正常运行状态。
消息日志与管理Kafka通过消息日志持久化数据,消费者偏移量管理消息读取位置,可以灵活调整消费策略。总结与扩展本文介绍了Kafka在大数据领域的关键地位,从基础到实践,帮助读者理解其核心组件和操作流程。下篇将继续探讨高级应用,如集群高可用和延时队列等,敬请期待。
Kafka设计强调高吞吐量、高可用性、低延迟、分布式机制。其应用场景广泛,如异步数据生成、偏移量迁移、安全机制、连接器使用、机架感知、数据流、时间戳管理、消息语义、日志收集、消息系统、用户轨迹记录、运营监控数据收集、实时数据流处理、事件源等。
1、Kafka将消息存储在磁盘中,为了控制磁盘占用空间的不断增加就需要对消息做一定的清理操作。Kafka提供了两种日志清理策略。kafka有专门的任务来周期性删除不符合条件的日志分段文件,删除策略主要以下有3种。对于有相同key的不同value值,只保留最后一个版本。
2、Kafka和数据库在软件开发中扮演不同的角色,它们之间的关系可以描述如下:数据流处理:Kafka是一种高吞吐量、可持久化、分布式的消息队列系统,用于实时的数据流处理。它可以用于接收、存储和传输大量的实时数据流。在软件开发中,Kafka常用于处理实时的数据流,例如日志数据、事件数据等。
3、Kafka作为一个支持大数据量写入写出的消息队列,由于是基于Scala和Java实现的,而Scala和Java均需要在JVM上运行,所以如果是基于内存的方式,即JVM的堆来进行数据存储则需要开辟很大的堆来支持数据读写,从而会导致GC频繁影响性能。考虑到这些因素,kafka是使用磁盘存储数据的。
4、Kafka的核心组件包括生产者(Producer)、消费者(Consumer)和Broker。生产者负责生成数据并将其发送到Kafka集群;消费者则订阅并处理这些数据;而Broker则是Kafka集群中存储数据的服务器。Kafka的另一个关键特性是其分布式存储设计,这使得它能够在处理大量数据时提供高可用性和容错性。
1、在前面了解存储结构过程中,我们发现kafka记录log日志使用的结尾追加的方式,即 顺序写 。这样要比随机写块很多,这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。mmap,简单描述其就是将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。
2、因为每条消息都被 append 到该 Partition 中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是 Kafka 高吞吐率的一个很重要的保证)。
3、Kafka使用了顺序IO提高了磁盘的写入速度,Kafka会将数据顺序插入到文件末尾,消费者端通过控制偏移量来读取消息,这样做会导致数据无法删除,时间一长,磁盘空间会满,kafka提供了2种策略来删除数据:基于时间删除和基于partition文件的大小删除。
4、Kafka 之所以快,是因为它使用了 **分布式** 的方式来处理消息。Kafka 的生产者将消息发送到 Kafka 集群中的一个或多个 Broker,然后由 Kafka 的消费者来消费这些消息。Kafka 的 Broker 会将消息存储在磁盘上,以便在需要时进行读取。
5、kafka producer将消息发送给broker后,消息日志会被存储在broker的磁盘上,采用顺序写入的方式。顺序写可以加快磁盘访问速度,并且可以将将多个小型的逻辑写合并成一次大型的物理磁盘写入,官方数据显示顺序写比随机写入快6000倍以上。
6、顺序读写,是kafka利用磁盘特性的一个重要体现。 零拷贝 sendfile(in,out) 数据直接在内核完成输入和输出,不需要拷贝到用户空间再写出去。 kafka数据写入磁盘前,数据先写到进程的内存空间。