【HBZ分享】Kafka日志存储流程和LOG日志解析 + LEO + HW 讲解

Kafka日志存储流程和LOG日志解析 + LEO + HW 讲解

Kafka集群搭建 并 整合springboot.
Consumer消费者机制 与 分区策略讲解【点击这里】.
Kafka数据文件存储-可靠性保证ACK-ISR核心【点击这里】.
Kafka中日志清理策略.
Kafka高性能之零拷贝原理.
Partition是什么?
partition叫分区,一个topic下会有很多个分区,分区里才是真正存储消息的,消费者消费的也正是分区里面的消息,每个分区都有自己的LEO

Replicas是什么?
叫做副本,每个分区也可以有自己的副本, 分区副本的个数最多只能是【broker个数】,比如有5个broker, 则replicas个数最多只能是5,如果写6,则会报错,但是这5个replicas中会有一个leader,leader就负责往里写消息,replicas负责同步,来做容灾处理。

Offset是什么?

  • 每个partition都是由一系列【有序的】【不可变的】消息组成这些消息会被连续的加到partiton中
  • partiton中,每一条消息都已一个连续的序列号,叫做offset, 用于partiton唯一标识一条消息
  • 可以认为offset是partiton中message的id

Segment是什么?

  • segment含义是段,即log中消息不是一股脑存到一个文件的,他是存到很多个segment中的
  • 每个partition由很多个segment
  • 每个segment是由xxx.index, xxx.log组成的。.index是索引,指向.log中对应的消息
  • 当某个segment达到设置的size时,就会创建一个新的segment来存储接下来的消息
  • 易混淆: segment是一组.index 与 .log组成的,即一个segment应包含.index, .log这两个文件,.log是存储真的正消息的, .index是对应.log的索引文件。比如我们设置一个segment的size是500M,当消息到达500M是就会开启一个新的segment来继续存储消息。所以这就是一个partiton中会有很多个segment的原因
  • segment存在的意义: 假如segment不存在,那么所有的消息都会存到partition中的一个.log文件中。那么会导致这个.log文件会变得巨大,对日后日志清理会造成很大麻烦。而有了segment,日志清理,只需要清理早期的segment就可以了,直接删掉就OK。所以大家不要被partiton中还有多个segment这个说法给搞糊涂了,消息依然存在partiton中,只不过不是都写在一个.log文件中,他会随着消息逐渐增多,而在partition中创建很多个.index .log组来保存消息,我们把一个.index .log组称之为segment而已。
  • 图解:
    在这里插入图片描述

LEO(LogEndOffset)
每个parpition的log的最后一条message(所说的log文件,里面就是存的消息), 如下图:
在这里插入图片描述
HW(HighWaterMark)

  • 类似于木桶效应,以同步最少的那个follow为基准,即同步最少的那个follow对应的最后一条message就是HW
  • 表示partition各个replicas数据间同步且一致的offset位置,即表示所有replicas已经commit的位置,我们才成为HW
  • 只有HW之前的数据才是Commit的,才是消费者可见的, 如下图

在这里插入图片描述
HW(HighWaterMark)作用,当Follow 或者 leader挂了,HW是如何发挥作用的

  • Follow挂掉的情况
    当挂掉的Follow再次恢复时,会把该Follow本地记录的HW之后的数据全部截掉,重新同步现在leader的数据,并当同步到大于当前HW时才会被重新加入到ISR中。
    (注意,上面那段话中。两个HW不一样),第一个本地记录的HW是Follow挂掉时的HW,后面同步到大于HW的是当前真实的HW。
    在这里插入图片描述

  • Leader挂掉的情况
    Leader挂了,所有副本都会把HW之后的数据截取掉, 包括原leader又恢复了,也要截取并以Follow的身份重新加入到ISR,新Leader不会截取。然后其余Follow会从新Leader同步数据在这里插入图片描述

Kafka日志存储流程和LOG日志解析

  • 简介:
    kafka采取了【分片 + 索引】机制,将每个partition中又分为多个segment中,每个segment由2个文件【log 和 index】组成,结构就如图所示
    在这里插入图片描述
  • .index 和 .log文件的命名是如何设计的?
    举例
    # 分段1
    000000000000000000000.index    000000000000000000000.log
    # 分段2   1234是指当前文件最小偏移量是1234, 即上个文件最后一个消息的offset + 1
    000000000000000001234.index    0000000000000000001234.log
    # 分段3   888888是指当前文件最小偏移量是8888, 即上个文件最后一个消息的offset + 1
    000000000000000888888.index    0000000000000000888888.log
    

Kafka高效文件存储设计特点

  • Kafka把topic中一个partition大文件分成了很多个小文件段,我们叫做segment。通过多个小文件段,我们可以更方便的定期清理 删除已经消费完的文件了,减少磁盘占用
  • 通过索引信息来快速定位message,这就是【0000000000.index】文件存在的意义,他能快速定位到【00000000.log】文件对应的位置
  • producer生产者在发送消息时,消息是顺序的追加到文件末尾的,属于顺序写,而磁盘的顺序写性能极高,不次于内存速度,官方声明顺序写可以600M/S, 而随机写只能100K/S
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值