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