kafka登堂入室系列(1) - kafka的概念与文件存储机制

前言(为什么研究kafka)

同研究GeoMesa的初衷一样,笔者近期需要对流式数据的接入、传输、处理、可视化、分析等内容进行整体的实现,而当初选用GeoMesa的最主要原因也是看中其GeoMesa-Kafka对流式数据的接入、传输、处理的性能较高,且基于官文中的Stealth工具进行可视化的效果较好(详情可参见GeoMesa官网:https://www.geomesa.org)。暂停写GeoMesa专栏,先写kafka的原因有两个方面:一是专栏中笔者要写的第四部分《GeoMesa编译与二次开发专栏(4) — GeoMesa用户手册》还在火热进行中,官文涵盖了Cassandra、HBase、Kafka等多方面内容,工作量较大,知识面较广,虽笔耕不辍,仍需较多时间;二是笔者重点研究的GeoMesa-Kafka,其核心仍是Apache kafka,只是对其进行了包装。因此,GeoMesa官方用户手册的翻译工作还会持续进行,完成后补上,敬请期待。

kafka的概念

网上关于Kafka概念的介绍很多。举个例子介绍:

一个简单的面包生产和消费流程中,生产者(个体或群体)每次生产N块面包,消费者(个体或群体)每次能消费的面包数<N块。一方面,在消费者必须实时将生产者生产的面包吃完的情况下,消费者面对的面包会越来越多,最终造成堵塞。另一方面,消费者一旦出现系统故障(如常见的宕机),生产者将无法及时消费生产者的面包,这样会造成面包丢失。这时我们想到一个办法,在二者之间放一个仓库,生产者实时生产的面包都按顺序放入仓库中,消费者都去仓库里拿面包。这样消费者不会面临巨大的堵塞压力,生产者生产的面包也不再丢失,都在仓库中。类比kafka系统中,kafka就是这里的“仓库”,数据流就是这里的“面包”。实际上,这里的“面包”可以是任何一种数据流,包括系统之间通信传输的信息,我们可以统一称之为“消息”。

有人会问,仓库的存储能力也是有限的,面包放满了怎么办?很简单,多加几个仓库呗。类比到kafka系统中,就是kafka的扩容(分布式存储)。

kafka的文件存储机制

kafka的文件存储机制中涉及的核心概念屈指可数,一共就那么几个,包括:Producer、Consumer、Broker、Topic、Partion、Segment和Message。其中:

  • Producer — 消息的生产者,多个生产者组成生产者集群
  • Consumer — 消息的消费者,多个消费者组成消费者集群
  • Broker — 消息的缓存代理
  • Topic — 消息的主题。kafka消息处理中,首先是对消息进行分类,每一类消息称为一个主题(Topic)
  • Partion — 当一类消息(一个Topic)中消息数量过大时,需要将其分块(或者说是分组)进行存储,这样每一块对应一个Partion。Partion在物理上对应的是一个文件夹
  • Segment — 本意为“片”或“段”,在kafka中是指上述Partion文件夹中的文件(和我们常见的(.txt)文本文件、(.csv)文件是一个意思),即Segment在物理上对应的是实际的消息文件
  • Message — 消息本身,即上述Segment消息文件中的消息(好比.txt文件中的内容) 对于上述概念之间的关系,笔者先放图进行展示,再详细说明。其中,Producer、Consumer、Broker、Topic和Partion之间的关系如下图所示:

然后一个Partion中通常包含多个Segment,类似于一个文件夹中包含多个文件。一个Segment其实不是单个文件,而是一组文件,由一个(.log)文件和一个(.index)文件组成,一个(.log)文件对应一个(.index)文件。(.log)文件是数据文件,文件中存的就是Message;(.index)是元数据文件,元数据就是关于数据本身信息(如数据的编号、主要内容、大小)的数据,这里(.index)文件中记录的是Message在(.log)文件中的编号和偏移量(offset),以key-value的形式存储,key对应编号,value对应消息的物理偏移量(offset),即消息在(.log)文件中的物理位置。

最后,一条Message由定长的header和变长的body构成,具体构成如下图所示。对于初学者来说,对Message的构成只需作大致了解即可。

补充说明

1、生产者Producer产生的消息一开始是存在内存中的,而不是直接存入各Partion(分区)中,这样可以保证消息传输的效率。只有在内存放不下的情况下,才会将消息转存到Partion文件夹下的文件中。
2、Partion文件夹的名称是Topic名加序号的形式;Partion中包含多个Segment,每个Segment的命名长度是固定的20位,第一个Segment名称从20位0开始,后面每个Segment的名字都是上一个Segment文件中最后一条消息的偏移量(offset值),在笔者看来这样命名的原因和好处是有助于实现类似于断点续传的机制,此处不再细究。
3、Segment下的(.index)中并非对每个(.log)文件中的Message都进行编号,而是采取了稀疏索引机制,即在按顺序的条件下,仅对其中的部分消息(如第1、4、6、9、…条消息)建立索引。稀疏索引的好处是可以有效减小(.index)文件占据的空间,便于将其存到内存中。有人会问了,按你举的例子,那第2、3、5、7、8…条消息怎么索引呢,很简单,根据你查询的消息,首先确定其大致的位置区间(比如你查第2条消息,位于索引中的1和4之间),然后再进行一次顺序扫描即可。
4、Consumer每次消费消息后,都会记录保存当前消费的消息的偏移量,这样可以保证继续消费时消息从历史位置开始传输,而非从头来过。

参考文章:
半兽人.《kafka中文教程》.https://www.orchome.com/kafka/index
杰布斯. 《Kafka学习(二):Kafka的基本结构和概念》. https://blog.csdn.net/ZuoAnYinXiang/article/details/50890322
SetsunaMeow. 《Kafka学习笔记:Kafka的Topic、Partition和Message》. https://blog.csdn.net/lrxcmwy2/article/details/82853300

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值