Kafka的Topic和Partition

Topic

  • Topic是Kafka数据写入操作的基本单元,可以指定副本
  1. 一个Topic包含一个或多个Partition,建Topic的时候可以手动指定Partition个数,个数与服务器个数相当
  2. 每条消息属于且仅属于一个Topic
  3. Producer发布数据时,必须指定将该消息发布到哪个Topic
  4. Consumer订阅消息时,也必须指定订阅哪个Topic的信息

Partition

  • 每个Partition只会在一个Broker上,物理上每个Partition对应的是一个文件夹
  • Kafka默认使用的是hash进行分区,所以会出现不同的分区数据不一样的情况,但是partitioner是可以override的
  • Partition包含多个Segment,每个Segment对应一个文件,Segment可以手动指定大小,当Segment达到阈值时,将不再写数据,每个Segment都是大小相同的
  • Segment由多个不可变的记录组成,记录只会被append到Segment中,不会被单独删除或者修改,每个Segment中的Message数量不一定相等

  • 清除过期日志时,支持删除一个或多个Segment,默认保留7天的数据
  • Kafka实际是用先写内存映射的文件,磁盘顺序读写的技术来提高性能的。Producer生产的消息按照一定的分组策略被发送到broker中的partition中的时候,这些消息如果在内存中放不下了,就会放在partition目录下的文件中,partition目录名是topic的名称加上一个序号。在这个目录下有两类文件,一类是以log为后缀的文件,另一类是以index为后缀的文件,每一个log文件和一个index文件相对应,这一对文件就是一个Segment File,其中的log文件就是数据文件,里面存放的就是Message,而index文件是索引文件。Index文件记录了元数据信息,指向对应的数据文件中Message的物理偏移量。
  • LogSegment文件命名的规则是,partition全局的第一个Segment从0(20个0)开始,后续的每一个文件的文件名是上一个文件的最后一条消息的offset值,这样命名的好处是什么呢?假如我们有一个Consumer已经消费到了offset=x,那么如果要继续消费的话,就可以使用二分查找法来进行查找,对LogSegment文件进行查找,就可以定位到某个文件,然后拿x值去对应的index文件中去找第x条数据所在的位置。Consumer读数据的时候,实际是读Index的offset,并且会记录上次读到哪里。

  • 再详细的分析一下Index文件,上图的左半部分是Index文件,里面存储的是n对key-value,其中key是Message在log文件中的编号,比如1,3,6,8.....,表示第1条、第3条、第6条、第8条消息等,但是因为Index文件中并没有为数据文件中的每条消息都建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中,但缺点是没有建立索引的Message不能一次定位到其在log文件中的位置,这种情况下就需要做一次顺序扫描,不过这次顺序扫描的范围就会很小了。value值表示该消息的物理偏移地址。
  • 虽然Kafka是顺序写入数据的,但是难以保证全局的消费是有序的。当有多个partition的时候,message在分组存到partition中的时候就已经是无序了,比如0-10这部分消息存到partition1,11-20被存到partition2等。唯一能保证的是,针对一个topic里的数据,在partition的内部消息消费的有序性,全局有序是做不到的。

一个Message由固定长度的header和一个变长的消息体body组成

8 byte offset在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message
4 byte message sizemessage大小
4 byte CRC32用crc32校验message
1 byte “magic"表示本次发布Kafka服务程序协议版本号
1 byte “attributes"表示为独立版本、或标识压缩类型、或编码类型。
4 byte key length表示key的长度,当key为-1时,K byte key字段不填
K byte key可选
value bytes payload表示实际消息数据。

参考
Kafka文件的存储机制:https://www.cnblogs.com/jun1019/p/6256514.html
https://baijiahao.baidu.com/s?id=1608205621370302980&wfr=spider&for=pc

https://blog.csdn.net/lrxcmwy2/article/details/82853300

Kafka的生成者、消费者、broker的基本概念:https://blog.csdn.net/u010020099/article/details/82290403

Kafka的Topic、Partition和Message的更多相关文章

  1. Kafka Topic Partition Offset 这一长串都是啥?

    摘要:Offset 偏移量,是针对于单个partition存在的概念. 本文分享自华为云社区<Kafka Topic Partition Offset 这一长串都是啥?>,作者: gent ...

  2. Kafka Topic Partition Replica Assignment实现原理及资源隔离方案

    本文共分为三个部分:   Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案   1. Kafka Topic创建方式 ...

  3. kafka消息存储与partition副本原理

    消息的存储原理: 消息的文件存储机制: 前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式.通过 ll /tmp/kafka-logs/ ...

  4. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据

    将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...

  5. 【帖子】怎么彻底删除kafka的topic,然后重建?

    怎么彻底删除kafka的topic,然后重建? 网上都说用kafka-run-class.shkafka.admin.DeleteTopicCommand 命令删除topic,但是并没有成功,用kaf ...

  6. (一)kafka修改topic分区的位置

    (一)kafka修改topic分区的位置 环境:kafka_2.10-0.8.2.1 + JDK1.7.0_80 1. 查看分区topic的分区分布 $ le-kafka-topics.sh --de ...

  7. kafka删除topic的方法及我在kafka上边的一些经验

    我在本地做kafka的producer调试,每隔一段时间后,所使用的topic管道就会堆积数据,而且我这边使用的是  kafka   bin 下的consumer命令单独消费的,每次都是  --fro ...

  8. 052 kafka对topic的增删改查操作

    一:create 1.开始使用命令 2.创建 bin/kafka-topics.sh --create --topic beifeng --zookeeper linux-hadoop01.ibeif ...

  9. kafka集群partition分布原理分析

    1. Kafka集群partition replication默认自动分配分析 下面以一个Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication ...

随机推荐

  1. HQL基本语法及应用案例

    HQL基本语法及应用案例 摘自:<大数据技术体系详解:原理.架构与实践> 一.HQL基本语法 HQL是Hive提供的数据查询语言,由于Hive巨大的影响力,HQL已被越来越多的Hive O ...

  2. java基础(10)---stream流

    一.stream的应用场景 for遍历的冗余场景:  stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...

  3. Webpack快速入门

    什么是Webpack 顾名思义它是一个前端打包工具,通过给定的入口文件自动梳理所有依赖资源(包括css.图片.js等),并按照配置的规则进行一系列处理(转es5.压缩等),打包生成适合现代生产环境要求 ...

  4. Sql中的left函数、right函数

    DB2中left()函数和right()函数对应oracle中的substr()函数 DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LE ...

  5. 更改intellij高亮字体背景颜色

    intellij工具中依次进入file -> settings -> editor -> colors & fonts -> general,在右侧窗口中将result ...

  6. CSS精灵图(王者荣耀案例)

    首先,我们应该知道引入精灵图的原因: 具体是因为,网页上面的每张图片都要经历一次请求才能展示给用户,小的图标频繁的请求服务器,降低页面的加载速度,为了有效地减少服务器接收和发送请求的次数,提高页面的加 ...

  7. C语言中一个字符对应一个ascii码;占一个1个字节8个二进制位;存到内存中也是用ascii的十进制的二进制表示

    /** 只读变量和常量 const 只读 const int a; int const a;//同上面的代码行是等价的,都表示一个常整形数. int *const a;//const具有"左 ...

  8. 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

    在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...

  9. 洛谷 P2251 质量检测 题解

    P2251 质量检测 题目背景 无 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, ...

  10. python-图像目标监测(1)识别答题卡

    # -*- coding: utf-8 -*- """ Created on Thu Dec 20 16:05:10 2018 @author: leizhen.liu ...