Kafka的Topic、Partition和Message
Kafka的Topic和Partition
Topic
- Topic是Kafka数据写入操作的基本单元,可以指定副本
- 一个Topic包含一个或多个Partition,建Topic的时候可以手动指定Partition个数,个数与服务器个数相当
- 每条消息属于且仅属于一个Topic
- Producer发布数据时,必须指定将该消息发布到哪个Topic
- 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的更多相关文章
- Kafka Topic Partition Offset 这一长串都是啥?
摘要:Offset 偏移量,是针对于单个partition存在的概念. 本文分享自华为云社区<Kafka Topic Partition Offset 这一长串都是啥?>,作者: gent ...
- Kafka Topic Partition Replica Assignment实现原理及资源隔离方案
本文共分为三个部分: Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案 1. Kafka Topic创建方式 ...
- kafka消息存储与partition副本原理
消息的存储原理: 消息的文件存储机制: 前面我们知道了一个 topic 的多个 partition 在物理磁盘上的保存路径,那么我们再来分析日志的存储方式.通过 ll /tmp/kafka-logs/ ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
- 【帖子】怎么彻底删除kafka的topic,然后重建?
怎么彻底删除kafka的topic,然后重建? 网上都说用kafka-run-class.shkafka.admin.DeleteTopicCommand 命令删除topic,但是并没有成功,用kaf ...
- (一)kafka修改topic分区的位置
(一)kafka修改topic分区的位置 环境:kafka_2.10-0.8.2.1 + JDK1.7.0_80 1. 查看分区topic的分区分布 $ le-kafka-topics.sh --de ...
- kafka删除topic的方法及我在kafka上边的一些经验
我在本地做kafka的producer调试,每隔一段时间后,所使用的topic管道就会堆积数据,而且我这边使用的是 kafka bin 下的consumer命令单独消费的,每次都是 --fro ...
- 052 kafka对topic的增删改查操作
一:create 1.开始使用命令 2.创建 bin/kafka-topics.sh --create --topic beifeng --zookeeper linux-hadoop01.ibeif ...
- kafka集群partition分布原理分析
1. Kafka集群partition replication默认自动分配分析 下面以一个Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication ...
随机推荐
- idea中添加web.xml配置文件与tomcat启动中遇到的web.xml文件找不到的问题
1,如何在idea中向war项目中添加web.xml的配置文件 idea通过maven创建war项目时没有指定是webapp导致创建出来的项目没有webapp的文件夹.其实war项目中都是在" ...
- Linux命令——dumpe2fs
参考:Linux磁盘管理——Ext2文件系统 简介 dumpe2fs用于查询 Ext 家族 superblock以及GDT(Group Descriptor Table,块组描述符表) 信息. 用法 ...
- 修改bash终端命令行颜色
要修改linux终端命令行颜色,我们需要用到PS1,PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置.在终端输入命令:#set,即可在输出中找到关于PS1的定义如下: PS1='[ ...
- 安装配置KVM虚拟化
安装KVM虚拟化 KVM需要硬件⽀持, 所以需要开启虚拟化⽀持 硬件设备直接在BIOS设置开启CPU虚拟化 个⼈电脑同样进⼊BIOS开启虚拟化⽀持 VM需要找到对应虚拟机开启对应的VT-EPT虚拟化技 ...
- mysql字典取值,列表包含
SELECT * FROM e where JSON_CONTAINS(json_extract(scope_detail, '$.shop'), '001');
- Linux硬盘满了,系统速度贼慢,居然是Jenkins.log太大了
用查找命令找出大于1G的文件 find / -size +1G -print 为什么jenkins.log会产生40+G的文件? 以上在Windows上的时候,运行了几个月,也没有发生这种现象? 而在 ...
- 从SVN资源库下载项目
1.这个操作和新建Import导入项目差不多,先左上角File--Import--SVN(这个在弹出窗口的下面)平时都是选最上面的General,再点从SVN检出项目. 2.创建新的资源库位置,然后输 ...
- xss获取cookie源码附利用代码
保存为cookie.asp <% testfile=Server.MapPath("cookies.txt") msg=Request("msg") se ...
- vim编辑提示存在临时文件,删除隐藏的*.swp文件即可
在Linux下vim编辑过程中,由于某种原因异常退出正在编辑的文件,再次编辑该文件时,会出现如下提示: 使用vim编辑文件实际是先copy一份临时文件并映射到内存给你编辑,编辑的是临时文件,当执行:w ...
- dedecms自定义表单提交获取时间跟ip地址
相信大家在用织梦做网站的时候都用过自定义表单做留言,但是如何查看客户什么时间填写的表单,和客户的IP地址呢? 我在网上找了很多JS文件,但太繁琐了,后来我注意到一个细节,每次我登陆后台,织梦系统都会记 ...