Kafka高水位了解吗,为什么Kafka需要Leader Epoch
什么是Kafka的高水位
所谓高水位
(HW,High Watermark)是Kafka中一个重要的概念,主要是用于管理消费者的进度和保证数据的可靠性。
高水位标识了一个特定的消息偏移量(offset),即一个分区中已经提交消息的最高偏移量(offset)【已提交指的是ISRs中的所有副本都记录了这条信息】,消费者只能拉去到这个offset之前的消息。消费者可以通过跟踪高水位来确定自己的消费位置
Kafka高水位的作用
在Kafka中,高水位(HW)主要有一下两个作用:
- 消费者进度管理:消费者可以通过记录上一次消费的偏移量,然后将其与分区的高水位进行比较,来确定自己的消费进度。消费者可以在高水位对比之后继续消费新的消息,确保不会错过任何已提交的消息。这样,消费者可以按照自己的节奏进行消费,不受其他消费者的影响
- 数据的可靠性:高水位还可用于保证数据的可靠性。在Kafka中,只有消息被写入主副本(Leader Replica)并被所有同步副本(In Sync Replicas ,ISR)确认后,才被认为是已提交的消息。高水位表示已经被提交的消息边界。之后高水位之前的消息才能被认为时已经被确认的,其它消息可能会因为副本故障或其他原因而丢失
在Kafka中还有一个概念,叫做LEO(Log End Offset),它是日志最后的消息偏移量。他表示当前日志文件中下一条待写入消息的offset。
当消费者消费消息时,它可以使用高水位作为参照点,之消费高水位之前的消息,以确保消费的时已经被确认的消息,从而保证数据的可靠性。如下图,只消费offset为6之前的消息。
什么是Leader Epoch
在Kafka中,每个分区都有一个Leader副本和多个Follewer副本。当Leader副本发生故障时,Kafka会选择一个新的Leader副本。这个切换过程中,需要保证数据的一致性,即新的Leader副本必须具有和旧的Leader副本一样的消息顺序。
- 为了实现这个目标,Kafka引入了
Leader Epoch
的概念。Leader Epoch是一个递增的整数,每次副本切换时都会增加。它用于标识每个Leader副本的任期。 - 同时,每个副本都会为会自己的Leader Epoch记录。它记录副本所属的分区在不同Leader副本之间切换时的任期。
- 在副本切换过程中,新的Leader会检查旧Leader副本的Leader Epoch和高水位。只有当旧Leader和Leader Epoch小于等于Leader副本的Leader Epoch,并且旧Leader副本的高水位小于等于新Leader副本的高水位时,新Leader副本才会接受旧Leader副本的数据
- 通过Leader Epoch和高水位的验证,Kafka可以避免新的Leader副本接收旧Leader副本之后的消息,从而避免数据回滚。只有那些在旧Leader副本的Leader Epoch和高水位之前的消息才会被Leader副本接受。
Kafka Leader Epoch的过程
每个Partition都有一个初始的leader Epoch,通常为0;当Leader副本发生故障时或者需要进行切换时,Kafka会触发副本切换的过程;副本切换过程中,Kafka会从ISR(In-Sync Replicas,同步副本)中选择一个新的Follower副本作为新的Leader副本;新的Leader副本会增加自己的Leader Epoch,使其大于之前的Leader Epoch。这表示进入了一个新的任期;新的Leader副本会验证旧Leader副本的状态以确保数据一致性的问题。它会检查旧Leader的Leader Epoch和高水位;如果旧Leader副本的Leader Epoch小于等于新Leader副本的Leader Epoch,并且Leader副本的高水位小于等于新Leader副本的高水位,则验证通过;一旦验证通过,新的Leader副本会开始从ISR中的一部分副本复制数据,以确保新Leader上的数据与旧Leader一致;一旦新的Leader副本复制了旧Leader副本的所有数据,并达到了与旧Leader副本相同的高水位,副本切换过程就完成了。
Kafka的ISR机制
ISR,就是In-Sync Replicas 同步副本的意思。
在Kafka中,每个Topic、Partition可以有多个副本(replica)。ISR是与主副本(Leader Replica)保持同步的副本集合。ISR机制就是用于确保数据的可靠性和一致性。
当消息被写入Kafka的分区时,它首先会被写入Leader,然后Leader将消息复制给ISR中的所有副本。只有当ISR中所有副本都成功地接收到并确认了消息后,主副本才会认为消息已经成功提交。这种机制确保了数据可靠性和一致性
了解ISR的列表维护了解嘛
在Kafka中,ISR(In-Sync Replicas)列表的维护是通过副本状态和配置参数来进行的。具体的ISR列表维护机制在不同的Kafka版本中有所变化。
0.9.x版本之前
在0.9.x之前的版本,Kafka有一个核心的参数:replica.lag.max.messages
,表示如果Follower落后Leader的消息数量超过了这个参数值,就认为Follower就会从ISR列表里移除。
但是,基于replica.lag.max.message
这种实现,在瞬间高并发访问的情况下会有问题:比如Leader瞬间接收到几万条消息,然后所有Follower还没来得及同步过去,此时所有follower都会被踢出ISR列表。
0.9.x版本之后
Kafka从0.9.x版本之后,引入了replica.lag.max.ms
参数,表示如果某个Follower的LEO(latest end offset)一直落后Leader超过了10秒,那么才会被ISR列表移除。
这样的话,即使出现瞬间流量,导致Follower落后很多数据,但是只要在限定的时间内尽快追上来就行了。
好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!