目录

一、基本概念

二、存储位置及格式

1、存储位置

2、分区与存储方式的关系

三、操作演示

1、创建一个主题

2、查看数据目录中的效果

3、向此主题写入大批量数据

4、查看segment file

(1)查看log文件

(2)查看index文件

(3)查看timeindex文件

四、数据存储原理分析

1、说明

2、数据文件建立索引原理

3、数据消费查询原理

4、segment file中索引文件与数据文件的对应关系

5、Kafka高效文件存储设计特点


一、基本概念

1、Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群;

2、Topic:一类消息,Kafka集群能够同时负责多个topic的分发;

3、Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队;

4、Segment:每个partition又由多个segment file组成;

5、offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息;

6、message:这个算是kafka文件中最小的存储单位,即是 a commit log。

二、存储位置及格式

1、存储位置

kafka数据的存储位置,在config/server.properties中的log.dirs中配置;

本次演示kafka的日志存储配置为:log.dirs=/tmp/kafka-logs

2、分区与存储方式的关系

partition是以文件的形式存储在文件系统中,比如,创建了一个名为kafkaData的topic,有4个partition,那么在Kafka的数据目录中(由配置文件中的log.dirs指定的)中就有这样4个目录: kafkaData-0, kafkaData-1,kafkaData-2,kafkaData-3,其命名规则为<topic_name>-<partition_id>,里面存储的分别就是这4个partition的数据。

每个数据目录的子目录都有xx.index ,xx.log ,xx.timeindex三个文件组成

三、操作演示

1、创建一个主题

创建一个带有4个分区,2个副本的topic(kafkaData)

[root@master bin]# ./kafka-topics.sh --create --zookeeper master:2181,slaves1:2181,slaves2:2181 --replication-factor 2 --partitions 4 --topic kafkaData
Created topic "kafkaData".

2、查看数据目录中的效果

[root@master kafka-logs]# ls /tmp/kafka-logs/kafkaData-0
kafkaData-1[root@slaves1 bin]# ls /tmp/kafka-logs/kafkaData-1
kafkaData-2
kafkaData-3[root@slaves2 bin]# ls /tmp/kafka-logs/kafkaData-0
kafkaData-2
kafkaData-3

由上可以看出kafka的第一个分区kafka-0的两个副本分别在master、slaves2两个节点上;其他同理;

命令查看

[root@master bin]# ./kafka-topics.sh --describe --zookeeper master:2181,slaves1:2181,slaves2:2181 --topic kafkaData
Topic:kafkaData PartitionCount:4    ReplicationFactor:2 Configs:Topic: kafkaData    Partition: 0    Leader: 2   Replicas: 2,0   Isr: 2,0Topic: kafkaData    Partition: 1    Leader: 0   Replicas: 0,1   Isr: 0,1Topic: kafkaData    Partition: 2    Leader: 1   Replicas: 1,2   Isr: 1,2Topic: kafkaData    Partition: 3    Leader: 2   Replicas: 2,1   Isr: 2,1

Leader:指定主分区的broker id;
Replicas: 副本在那些机器上;
Isr:可以做为主分区的broker id;

3、向此主题写入大批量数据

此步骤省略;

4、查看segment file

以kafkaData-0为例:

使用kafka安装bin目录下的kafka-run-class.sh分别查看这些文件的内容:

(1)查看log文件

[root@master bin]# ./kafka-run-class.sh  kafka.tools.DumpLogSegments --files /tmp/kafka-logs/kafkaData-0/00000000000000000000.log  --print-data-log
...
offset: 7211 position: 448934 CreateTime: 1587632825139 isvalid: true payloadsize: 29 magic: 1 compresscodec: NONE crc: 995429819 payload: 阳光小区,11,1587632825139
offset: 7212 position: 448997 CreateTime: 1587632825139 isvalid: true payloadsize: 28 magic: 1 compresscodec: NONE crc: 2299568067 payload: 单身小区,5,1587632825139
offset: 7213 position: 449059 CreateTime: 1587632825139 isvalid: true payloadsize: 29 magic: 1 compresscodec: NONE crc: 2772987037 payload: 花花小区,12,1587632825139
offset: 7214 position: 449122 CreateTime: 1587632825139 isvalid: true payloadsize: 28 magic: 1 compresscodec: NONE crc: 2369864650 payload: 阳光小区,6,1587632825139
offset: 7215 position: 449184 CreateTime: 1587632825139 isvalid: true payloadsize: 28 magic: 1 compresscodec: NONE crc: 820724779 payload: 单身小区,4,1587632825139
...

payload:为消息体

(2)查看index文件

[root@master bin]# ./kafka-run-class.sh  kafka.tools.DumpLogSegments --files /tmp/kafka-logs/kafkaData-0/00000000000000000000.index  --print-data-log
...
offset: 1269114 position: 79002134
offset: 1269231 position: 79009410
offset: 1269316 position: 79014708
offset: 1269456 position: 79023419
offset: 1269715 position: 79039540
offset: 1269838 position: 79047192
offset: 1269933 position: 79053095
offset: 1270083 position: 79062430
...

(3)查看timeindex文件

[root@master bin]# ./kafka-run-class.sh  kafka.tools.DumpLogSegments --files /tmp/kafka-logs/kafkaData-0/00000000000000000000.timeindex  --print-data-log
...
timestamp: 1587632824453 offset: 1867
timestamp: 1587632824473 offset: 1975
timestamp: 1587632824507 offset: 1987
timestamp: 1587632824658 offset: 2657
timestamp: 1587632824759 offset: 3057
timestamp: 1587632824810 offset: 3468
...

注意:

segment file 组成:由2部分组成,分别为index file和data file,这两个文件是一一对应的,后缀”.index”和”.log”分别表示索引文件和数据文件;

segment file 命名规则:partition的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset,ofsset的数值最大为64位(long类型),20位数字字符长度,没有数字用0填充。

四、数据存储原理分析

1、说明

(1)在生产环境中,kafkaData-0下不会只存在一个index、log、timeindex文件;而是像这样:

(2)、我们将index文件称为索引文件,里面存储着大量元数据;log文件称为数据文件,里面存储着大量消息;

2、数据文件建立索引原理

数据文件分段使得可以在一个较小的数据文件中查找对应offset的Message了,但是这依然需要顺序扫描才能找到对应offset的Message。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。
索引文件中包含若干个索引条目,每个条目表示数据文件中一条Message的索引。索引包含两个部分(均为4个字节的数字),分别为相对offset和position。

相对offset:因为数据文件分段以后,每个数据文件的起始offset不为0,相对offset表示这条Message相对于其所属数据文件中最小的offset的大小。举例,分段后的一个数据文件的offset是从20开始,那么offset为25的Message在index文件中的相对offset就是25-20 = 5。存储相对offset可以减小索引文件占用的空间。
position,表示该条Message在数据文件中的绝对位置。只要打开文件并移动文件指针到这个position就可以读取对应的Message了。

3、数据消费查询原理

注意:Messagexxxx抽象表示某条消息具体内容;.log的第二列和.index的第一列表示数据文件中的绝对位置,也就是打开文件并移动文件指针需要指定的地方;

如果我们想要读取offset=368776的message(如图),步骤如下:

(1)查找segment file
00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1.同样,第三个文件00000000000000737337.index的起始偏移量为737338=737337 + 1,其他后续文件依次类推,以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。
当offset=368776时定位到00000000000000368769.index|log

(2)通过segment file查找message
通过第一步定位到segment file,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址,然后再通过00000000000000368769.log顺序查找直到offset=368776为止。

4、segment file中索引文件与数据文件的对应关系

segment的索引文件中存储着大量的元数据,数据文件中存储着大量消息,索引文件中的元数据指向对应数据文件中的message的物理偏移地址。以索引文件中的6,1407为例,在数据文件中表示第6个message(在全局partition表示第368775个message),以及该消息的物理偏移地址为1407。

5、Kafka高效文件存储设计特点

(1)Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。

(2)通过索引信息可以快速定位message和确定response的最大大小。

(3)通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。

(4)通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小。

欢迎加入【大数据技术】社区

Kafka的数据存储相关推荐

  1. Spark Stream整合flum和kafka,数据存储在HBASE上,分析后存入数据库

    开发环境:Hadoop+HBASE+Phoenix+flum+kafka+spark+MySQL 默认配置好了Hadoop的开发环境,并且已经安装好HBASE等组件. 下面通过一个简单的案例进行整合: ...

  2. 10-10-030-简介-Kafka之数据存储

    文章目录 1.视界 概念 2. partition中的数据文件 2.1.segment中的文件 2.2.message文件 2.3.数据文件的内部实现方法 3.查找 3.1.遇到的问题 3.2.如何去 ...

  3. Kafka的数据是如何存储的

    原文链接:(请尊重原创) https://www.jianshu.com/p/3e54a5a39683 摘要:消息存储对于每一款消息队列都非常重要,那么Kafka在这方面是如何来设计做到高效的呢? K ...

  4. Kafka数据存储概述

    Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(page cache)分别存储和缓存消息,摒弃了Java的堆缓存机制,同时将随机写操作改为顺序写,再结合Zero-Copy的特性极大地改善了 ...

  5. GeoMesa-空间数据存储引擎入门学习手册

    GeoMesa-空间数据存储引擎 geomesa简介.架构体系.数据存储.spark等 第一部分:GeoMesa简介 GeoMesa是一款开源的基于分布式计算系统的⾯面向海海量量时空数据查询与分析的⼯ ...

  6. Kafka数据存储详解

    1.存储格式概述 每一个partion(文件夹)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件里.但每一个段segment file消息数量不一定相等,这样的特性方便old s ...

  7. kafka架构与原理 ,消息的可靠性与一致性幂等性,数据存储、zookeeper、使用场景

    一.Kafka概述 Kafka作为一个商业级消息中间件 ,发布和订阅记录流,它类似于一个消息队列 先了解下Kafka的基本原理,然后通过对kakfa的存储机制.复制原理.同步原理.可靠性和持久性保证等 ...

  8. Kafka数据存储结构

    Kafka 的数据分为两部分:元数据.消息数据. 元数据:元数据包括集群信息.节点信息.队列信息.主从信息.分区信息.分区分布信息等,这类信息都存储在 Zookeeper 上,Kafka 的任何一个节 ...

  9. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

最新文章

  1. [算法也疯狂]实现假装商品抢购繁忙的效果(php版)
  2. python 列表去重(数组)的几种方法_python 列表去重(数组)的几种方法
  3. oracle中sql语句的优化(转帖)
  4. 打印菱形 java_怎么用java打印菱形?
  5. Python自定义模块
  6. Sketch 52 破解版 最佳Mac产品原型设计工具
  7. android手机usb设置在哪里,手机usb调试在哪,教您安卓手机怎么打开USB调试
  8. 吐血整理的大数据学习资源大全
  9. 主动降噪(ANC)算法开发参考书目
  10. 重磅!风再起· 2020——巴比特全球合作伙伴云端峰会下周启幕,12大主题穿越减半,招募计划今日启动...
  11. 黄金分割法_python
  12. 【总结】利用AWS实现高可用性和云灾备
  13. android 镂空字体下载,Android——自定义镂空掩饰控件
  14. Python WIFI密码破解程序
  15. java开发面试复试_【java开发初轮技术面试以后 复试一般问什么?】-看准网
  16. 手把手 | 事理图谱,下一代知识图谱
  17. Word 复制文字不满行解决方法
  18. MySQL 5.7.20 Group Relication(组复制)搭建手册
  19. STM32 电机教程 9 - BLDC电机基础
  20. 语音广播Jenkins任务状态

热门文章

  1. python的dropna函数_Pandas dropna()函数不工作
  2. CSDN博文精选 微信小程序全方位解析
  3. 2007年度中国最受尊敬基金公司候选名单出炉
  4. prometheus变量_详细解读 Prometheus 的指标类型
  5. Linux内核版本介绍与查询
  6. VS2010 OpenGL 应用程序无法正常启动(0xc000007b)报错
  7. C语言详解 FILE文件操作
  8. 国产UOS比肩Win10?统信软件放言:要做中国的微软
  9. java 跟软帝-攀哥学做编程 飞机大战4
  10. 关机状态下启动微型计算机叫什么,微机的冷启动方式是什么?