关闭

kafka-系列2

190人阅读 评论(0) 收藏 举报


十、消息和日志



消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和CRC32校验码。
  1. /**
  2. * 具有N个字节的消息的格式如下
  3. *
  4. * 如果版本号是0
  5. *
  6. * 1. 1个字节的 "magic" 标记
  7. *
  8. * 2. 4个字节的CRC32校验码
  9. *
  10. * 3. N - 5个字节的具体信息
  11. *
  12. * 如果版本号是1
  13. *
  14. * 1. 1个字节的 "magic" 标记
  15. *
  16. * 2.1个字节的参数允许标注一些附加的信息比如是否压缩了,解码类型等
  17. *
  18. * 3.4个字节的CRC32校验码
  19. *
  20. * 4. N - 6 个字节的具体信息
  21. *
  22. */
复制代码



日志一个叫做“my_topic”且有两个分区的的topic,它的日志有两个文件夹组成,my_topic_0和my_topic_1,每个文件夹里放着具体的数据文件,每个数据文件都是一系列的日志实体,每个日志实体有一个4个字节的整数N标注消息的长度,后边跟着N个字节的消息。每个消息都可以由一个64位的整数offset标注,offset标注了这条消息在发送到这个分区的消息流中的起始位置。每个日志文件的名称都是这个文件第一条日志的offset.所以第一个日志文件的名字就是00000000000.kafka.所以每相邻的两个文件名字的差就是一个数字S,S差不多就是配置文件中指定的日志文件的最大容量。
消息的格式都由一个统一的接口维护,所以消息可以在producer,broker和consumer之间无缝的传递。存储在硬盘上的消息格式如下所示:
  • 消息长度: 4 bytes (value: 1+4+n)
  • 版本号: 1 byte
  • CRC校验码: 4 bytes
  • 具体的消息: n bytes


 


写操作消息被不断的追加到最后一个日志的末尾,当日志的大小达到一个指定的值时就会产生一个新的文件。对于写操作有两个参数,一个规定了消息的数量达到这个值时必须将数据刷新到硬盘上,另外一个规定了刷新到硬盘的时间间隔,这对数据的持久性是个保证,在系统崩溃的时候只会丢失一定数量的消息或者一个时间段的消息。

读操作
读操作需要两个参数:一个64位的offset和一个S字节的最大读取量。S通常比单个消息的大小要大,但在一些个别消息比较大的情况下,S会小于单个消息的大小。这种情况下读操作会不断重试,每次重试都会将读取量加倍,直到读取到一个完整的消息。可以配置单个消息的最大值,这样服务器就会拒绝大小超过这个值的消息。也可以给客户端指定一个尝试读取的最大上限,避免为了读到一个完整的消息而无限次的重试。
在实际执行读取操纵时,首先需要定位数据所在的日志文件,然后根据offset计算出在这个日志中的offset(前面的的offset是整个分区的offset),然后在这个offset的位置进行读取。定位操作是由二分查找法完成的,Kafka在内存中为每个文件维护了offset的范围。

下面是发送给consumer的结果的格式:

  1. MessageSetSend (fetch result)

  2. total length     : 4 bytes
  3. error code       : 2 bytes
  4. message 1        : x bytes
  5. ...
  6. message n        : x bytes
  7. MultiMessageSetSend (multiFetch result)

  8. total length       : 4 bytes
  9. error code         : 2 bytes
  10. messageSetSend 1
  11. ...
  12. messageSetSend n
复制代码


删除
日志管理器允许定制删除策略。目前的策略是删除修改时间在N天之前的日志(按时间删除),也可以使用另外一个策略:保留最后的N GB数据的策略(按大小删除)。为了避免在删除时阻塞读操作,采用了copy-on-write形式的实现,删除操作进行时,读取操作的二分查找功能实际是在一个静态的快照副本上进行的,这类似于Java的CopyOnWriteArrayList。

可靠性保证
日志文件有一个可配置的参数M,缓存超过这个数量的消息将被强行刷新到硬盘。一个日志矫正线程将循环检查最新的日志文件中的消息确认每个消息都是合法的。合法的标准为:所有文件的大小的和最大的offset小于日志文件的大小,并且消息的CRC32校验码与存储在消息实体中的校验码一致。如果在某个offset发现不合法的消息,从这个offset到下一个合法的offset之间的内容将被移除。
有两种情况必须考虑:
1,当发生崩溃时有些数据块未能写入。
2,写入了一些空白数据块。第二种情况的原因是,对于每个文件,操作系统都有一个inode(inode是指在许多“类Unix文件系统”中的一种数据结构。每个inode保存了文件系统中的一个文件系统对象,包括文件、目录、大小、设备文件、socket、管道, 等等),但无法保证更新inode和写入数据的顺序,当inode保存的大小信息被更新了,但写入数据时发生了崩溃,就产生了空白数据块。CRC校验码可以检查这些块并移除,当然因为崩溃而未写入的数据块也就丢失了
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

kafka-常见问题

(1)  如果想消费已经被消费过的数据 consumer是底层采用的是一个阻塞队列,只要一有producer生产数据,那consumer就会将数据消费。当然这里会产生一个很严重的问题,如果你重启一消...
  • successA
  • successA
  • 2017-07-30 23:10
  • 143

宫崎英高《魂系列》

15355119 数据科学与计算机学院目录 魂世界观 魂游戏设定 篝火和太阳 伤害计算1.《魂》世界观世界上本来是混沌一片,类似与中国盘古开天辟地与国外上帝创世界之前的情形。后来地上产生了火,故事...
  • yaoxh6
  • yaoxh6
  • 2016-10-08 15:39
  • 445

零基础学习HTML5—html+css基础【蓝鸥出品】

零基础学习HTML5—html+css基础【蓝鸥出品】
  • lanoulongjiang
  • lanoulongjiang
  • 2016-09-14 15:54
  • 838

从零开始学基于ARKit的Unity3d游戏开发系列2

在上一部分的学习中,我们重点是做了一些前期准备工作,从这一课开始,我们将开始学习如何使用Unity开发基于ARKit的移动游戏。 创建新项目 打开Unity,点击右上角的New以创建新的项...
  • yuyingwin
  • yuyingwin
  • 2017-12-27 09:30
  • 74

openssl之EVP系列之2---对称加密算法概述

openssl之EVP系列之2---对称加密算法概述     ---根据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.do...
  • xiaoting451292510
  • xiaoting451292510
  • 2015-06-26 13:54
  • 22785

kafka-深入剖析

一、生产者示例:     1、代码示例 Properties props = new Properties(); props.put("bootstrap.servers", "localhos...
  • yclfdn2004
  • yclfdn2004
  • 2016-06-20 15:17
  • 400

Kafka-分布式系统初步

首先我们要明白什么是消息系统,在kafka官网上对kafka的定义叫:A distributed publish-subscribe messaging system。publish-subscrib...
  • qq_31382921
  • qq_31382921
  • 2016-08-29 10:49
  • 286

kafka-架构(详解)

特点 一种高吞吐量的分布式发布订阅消息系统 1、通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。 2、高吞吐量:即使是非常普通的硬件Ka...
  • qq_16038125
  • qq_16038125
  • 2017-05-25 14:37
  • 149

基于物理的渲染技术(PBR)系列二

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017-03-20 17:14
  • 2810

SpringBoot入门系列:第二篇 再学Hello World

Spring-Boot是Spring的新东东,为了让人尽快的使用,它提供了一个非常好的辅助工具,直接为我们生成Maven架构的工程。下面,我们通过helloworld看 一、在浏览器中打开http:...
  • lxhjh
  • lxhjh
  • 2016-06-24 13:25
  • 26977
    个人资料
    • 访问:46539次
    • 积分:844
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:9篇
    • 译文:1篇
    • 评论:1条