Kafka Log存储解析以及索引机制

这篇具有很好参考价值的文章主要介绍了Kafka Log存储解析以及索引机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

  在Kafka架构,不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念,而Partition是物理上的概念。每个Partition逻辑上对应一个log文件,该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该log文件末端,且每条数据都有自己的offset。Kafka对于log文件是采取分片和索引机制。

2.Kafka的topic

启动kafka集群,集群中有三台Broker; 设置3个分区,3个副本;

2.1 创建hy-test-topic

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --replication-factor 3 --partitions 3 --topic hy-test-topic

2.2 发送消息到topic

public static void main(String[] args) {
    //1.创建kakfa生产者的配置对象
    Properties prop = new Properties();
    //2.给生产者配置对象添加配置信息
    prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop102:9092");
    prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
    prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
    prop.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
    prop.put(ProducerConfig.LINGER_MS_CONFIG, 1);
    prop.put(ProducerConfig.BUFFER_MEMORY_CONFIG,33554432);
    //3.创建生产者对象
    KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(prop);
    //4.调用send方法,发送消息
    for (int i = 0; i < 5; i++) {
        kafkaProducer.send(new ProducerRecord<String,String>("hy-test-topic",Integer.toString(i),Integer.toString(i)));
    }
    //5.关闭资源
    kafkaProducer.close();
}

查看log.dirs

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

2.3 查看topic的分区和副本

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic hy-test-topic

Kafka Log存储解析以及索引机制,kafka,kafka,分布式
可以看出:

  • 分区Partition-0 在broker.id=4中,其余都是副本 Replicas 2,3
  • 分区Partition-1 在broker.id=2中,其余都是副本 Replicas 3,4
  • 分区Partition-2 在broker.id=3中,其余都是副本 Replicas 4,2

通过zookeeper查看leader在那个broker上

[zk: localhost:2181(CONNECTED) 14] get /kafka/brokers/topics/hy-test-topic/partitions/0/state

{"controller_epoch":49,"leader":4,"version":1,"leader_epoch":0,"isr":[4,2,3]}

2.4 分区文件

Kafka Log存储解析以及索引机制,kafka,kafka,分布式
Kafka Log存储解析以及索引机制,kafka,kafka,分布式

名称 描述 类型 默认
log.segment.bytes 单个日志文件的最大大小 int 1073741824(1G)

继续发送消息会生成新的segment

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

可以看出

  • 第一个segment文件00000000000000000000.log快要达到 log.segment.bytes时,开始创建 00000000000000001187.log
  • .log.index.timeindex文件是一起出现; 并且名称是以文件第一个offset命名的。
  • .log存储消息文件
  • .index存储消息的索引
  • .timeIndex,时间索引文件,通过时间戳做索引

2.5 分区下文件内容

使用kafka自带工具bin/kafka-run-class.sh 来读取分区下的文件内容

2.5.1 消息文件.log
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

最后一行显示的是

baseOffset: 1186  position: 1072277020 CreateTime: 1695792070168
2.5.2 消息索引文件.index
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.index

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

offset: 1186 position: 1072277020
2.5.3 时间索引文件.timeindex
/opt/module/kafka/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.timeindex

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

2.5.4 Kafka如何查找指定offset的Message

借用博主@lizhitao 博客上的一张图来展示是如何查找Message的。

Kafka Log存储解析以及索引机制,kafka,kafka,分布式

比如:要查找绝对offset为7的Message:

  • 首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。
  • 打开这个Segment的index文件,用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。
  • 打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

该机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。

Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引来达到了查找的高效性。

参考链接:https://cloud.tencent.com/developer/article/1846773文章来源地址https://www.toymoban.com/news/detail-729782.html

到了这里,关于Kafka Log存储解析以及索引机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka源码解析之索引

    索引结构 Kafka有两种类型的索引: TimeIndex: 根据时间戳索引,可以通过时间查找偏移量所在位置,目录下以.timeindex结尾 Index: 根据偏移量索引,.index结尾 构建索引时机 由log.index.interval.bytes 参数控制,默认4KB构建一条索引 为什么默认值是4kb呢?这里认为与基于磁盘的读写单位

    2024年02月17日
    浏览(18)
  • 大数据课程I3——Kafka的消息流与索引机制

    文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州 ⚪ 掌握Kafka的消息流处理; ⚪ 掌握Kafka的索引机制; ⚪ 掌握Kafka的消息系统语义;  流程说明: 1. producer 要向Kafka生产消息,需要先通过 zookeeper 的 \\\"/brokers/.../state\\\" 节点找到该 partition 的 副本leader的位置信息

    2024年02月13日
    浏览(26)
  • Kafka(二)【文件存储机制 & 生产者】

    目录 一、Kafka 文件存储机制 二、Kafka 生产者 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 案例演示 2.2、带回调函数的异步发送 2.3、同步发送 API 3、生产者分区 3.1、分区的好处 3.2、生产者发送消息的分区策略 (1)默认的分区器 DefaultPartitioner

    2024年01月20日
    浏览(24)
  • Kafka3.0.0版本——文件存储机制

    1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念,而partition是物理上的概念。 每个partition对应于一个log文件 ,该log文件中存储的就是Producer生产的数据。 Producer生产的数据会被不断追加到该log文件末端 ,为防止log文件过大导致数据定位效率低下, Kafka采取了 分片和 索引

    2024年02月09日
    浏览(23)
  • Kafka:分布式流处理平台的深度解析

    在当今的大数据时代,数据处理和分析的重要性不言而喻。为了满足日益增长的数据处理需求,Apache Kafka 应运而生,成为了分布式流处理领域的佼佼者。本文将详细介绍 Kafka 的基本原理、核心组件、应用场景以及优势,帮助读者全面理解这一强大的数据处理工具。 一、Kaf

    2024年04月28日
    浏览(23)
  • 分布式存储系统举例剖析(elasticsearch,kafka,redis-cluster)

    1. 概述 对于分布式系统,人们首先对现实中的分布式系统进行高层抽象,然后做出各种假设,发展了诸如CAP, FLP 等理论,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我们对分布式系统的时序,复制模式,一致性等基础理论特别关注。 在共识算法的基础上衍生了选举

    2024年02月12日
    浏览(29)
  • 【分布式存储】数据存储和检索~倒排索引&pageRank

    通过前两篇的文章介绍,B+树主要针对的是读多写少的场景,而LSM针对的是写多读少的场景,其实在日常开发中,我们会将数据存储到搜索引擎中,然后进行数据的搜索,这种场景其实针对的是快速根据查询。对于MySQL这种B+树结构来说,其实没有办法保证快速查询。要

    2024年02月12日
    浏览(27)
  • 【分布式应用】kafka集群、Filebeat+Kafka+ELK搭建

    主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。 我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队

    2024年02月16日
    浏览(25)
  • (Kafka源码三)Kafka的缓存机制

    在Kafka的架构中,若没有缓存机制,在RecordAccumulator中对于不再使用的批次对象,需要进行回收,释放这些对象所占用的内存,为了降低GC的压力,Kafka作者设计了一个缓存池的机制,从而实现了实现消息批次的内存复用。本文主要讲解缓冲池的设计。 首先来看下kafka生产者到

    2024年04月15日
    浏览(16)
  • 分布式 - 消息队列Kafka:Kafka 消费者的消费位移

    01. Kafka 分区位移 对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中对应的位置。偏移量从0开始,每个新消息的偏移量比前一个消息的偏移量大1。 每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从 0 开始,假设一

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包