10分钟了解 KAFKA 主题/分区/消息

共计 2175 个字符,预计需要花费 6 分钟才能阅读完成。

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

Kafka的Topic,Partition 和 Message

Topic

  • Topic 是 Kafka 数据写入操作的基本单元,可以指定副本
  • 一个 Topic 可以包含多个 partition ,建 Topic 时可以手动指定 Partition 个数,个数与服务器相当
  • 每条消息属于 仅属于一个Topic
  • Producer 发布数据时,必须指定将该消息发布到哪个Topic
  • Consumer 订阅消息时,也必须指定订阅哪个 Topic 的信息
10分钟了解 KAFKA 主题/分区/消息

Partition

  • 每个 Partition 只会在一个 Broker 上,物理上每个 Partition 对应的是一个文件夹
  • Kafka 默认使用的是 hash 进行分区, 所以会出现不同的分区数据不一样的情况,但是 Partitioner 是可以 override 的
  • Partition 包含多个 Segment, 每个Segment 对应一个文件,Segment 可以手动指定大小,当 Segment 达到阀值,将不再写数据,每个 Segment 都是大小相同的
  • Segment 由多个不可变的记录组成,记录只会被 append 到 Segment 中,不会被单独删除或者修改,每个 Segment 中的 Message 数量不一定相等
10分钟了解 KAFKA 主题/分区/消息
  • 清楚过期日志,支持删除一个或多个 Segment,默认保存7天的数据
  • Kafka 实际是先写内存映射的文件,磁盘顺序读取的技术是提高性能的。Producter 生产的消息按照一个的分组策略被发送到 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 值表示该消息的物理偏移量。
10分钟了解 KAFKA 主题/分区/消息
  • 虽然 Kafka 是顺序写入数据的,但是难以保证全局的消费是有序的。当有多个partition的时候,message 在分组存到 partition的时候是无序的。唯一能保证的是,针对一个 topic 里的数据,在 partition 的内部消息消费的有序性,全局有序是做不到的。

Message

10分钟了解 KAFKA 主题/分区/消息
  • 一个 Message 由一个固定长度的 header 和一个变长的消息体 body 组成
  • 8 byte offset 在 partition 内的每条消息都有一个有序的 id 号,这个 id 号被称为偏移(offset),它可以唯一确定每条消息在 partition 内的位置。即 offset 表示 partition 的第多少条 message。
  • 4 byte message size :消息大小
  • 4 byte CRC32 : 用 CRC32 校验 message
  • 1 byte “magic” :表示本次发布 Kafka 服务程序协议版本号
  • 1 byte “attribute” :表示独立版本,或标示压缩类型,或编码类型
  • 4 byte key length :key 的长度,key 为 -1 时,K byte key 字段不填
  • K byte key 可选
  • value bytes payload :表示实际消息数据

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

正文完
 
Dustin
版权声明:本站原创文章,由 Dustin 2019-11-25发表,共计2175字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。