Kafka中ACKS LSO LEO LW HW AR ISR OSR解析
前言
Kafka中ACKS三种策略,LSO、LEO、LW、HW、AR、ISR、OSR解析。
名称解释
ACKS(Acknowledgments)确认、回执
LW(Low watermark)低水位、LSO(Log start offset)起始偏移量
HW(High watermark)高水位
LEO(Log end offset)日志末尾偏移量
AR(Assigned replica)分配的副本
ISR(In sync replica)正常同步的副本
OSR(Out sync replica)非正常同步的副本
消息生产和消费流程
以单副本为例,生产者(Producer)包装消息指明Topic后消息到达Broker中的分区(Partition),此时数据在Broker服务程序中;Broker将数据写到内核缓存页(Page cache),此时数据在物理内存;最后按照配置的刷盘策略写到磁盘中的消息日志(Log)中。
刷盘频率如果太高,会影响服务性能;如果频率太低,Broker宕机,在内存中未写到磁盘的消息会丢失。所以需要在效率和数据完整性之前做权衡(Trade off)来配置合适的策略。
消费者(Consumer)与服务器建立连接向Broker发送拉取消息请求,请求信息先到达网卡再到达Broker;Broker通过系统调用sendfile将读取到缓存页中的数据直接拷贝到网卡中,也就是零拷贝技术,最终数据返回给消费者。消费者消费完后还需要主动向Broker提交请求来更新消费进度。
ACKS三种类型
生产者(Producer)向Broker发送消息时,可以配置等待确认ACKS(Acknowledgments)的策略0、1和-1。
0代表不等待Broker确认,在这种情况下,不能保证服务器已经收到了记录。
-1和1都需要等待Broker返回确认。
1代表这个确认是Broker将消息写到主(Leader)磁盘后返回,不用等待从(Follower)同步。
-1则代表应答需要等待所有正常同步的副本ISR(In sync replica)写到消息日志(Log)后才会返回。
AR、ISR、OSR
AR(Assigned replica)已分配的副本指主题(Topic)创建时设置的副本,所有副本包括主(Leader)和从(Follower)都归属AR。
ISR(In sync replica)正常同步的副本和OSR(Out sync replica)非正常同步的副本是指从副本的两种状态,有周期性任务将副本按这个状态进行进行划分。
判断条件有两个:(1)根据从和主同步的超时时间判断,配置参数rerplica.lag.time.max.ms=10000;(2)根据从与主消息条数差值盘,配置参数rerplica.lag.max.messages=4000。
AR = ISR + OSR
ISR机制
在ACKS策略配置为-1的时候,需要等待所有ISR(In sync replica)集合中的副本将消息写入消息日志(Log)后才会给生产者(Producer)返回确认。以3个副本(Replica)为例,开始是都是正常同步,此时ISR集合中副本为3个。在同步消息[4]的时候Broker2上的副本出现网络问题或者宕机超过设置的超时时间,周期任务扫描到后将其划分到了OSR(Out sync replica)集合,给与了生产者确认。后续消息确认不再等待这个副本。
当OSR集合中的副本恢复并与主副本同步数据追平后,又会被周期任务扫描划分回ISR集合中。
LSO、LEO、LW、HW
LEO(Log end offset)日志末尾偏移量是新消息写入时将分配的偏移量(Offset)值,从0开始,随着消息不断写入递增。
LW(Low watermark)低水位,代表AR(Assigned replica)集合中最小的LSO(Log start offset)起始偏移量。旧日志的清理和消息删除都有可能促使LW的增长。
HW(High watermark)高水位代表ISR(In sync replica)集合中最小的LEO。
比如当ACKS(Acknowledgments)配置为1时,不需要等待从(Follower)就会给生产者(Producer)返回确认,这就可能会导致从还没来得急同步。此时ISR集合中最小的LEO没有变化,就代表HW不变,消费者还无法消费到新的数据。
消费者能消费的数据 = [LW,HW)