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