AR(Assigned Repllicas):分区中所有副本统称
ISR(In-Sync Replicas):与leader副本保持一定程度同步的副本(包括Leader)
OSR(Out-Sync Relipcas):与leader滞后过多副本(不包括leader)ps:参数配置滞后范围
AR=ISR+OSR。正常情况AR=ISR ,OSR空
LEO(LogEndOffse):下一条待写入消息offset,partition的log最后一条消息offset+1。
HW(HighWatermark):consumer能看到partition位置,partition对应ISR中最小LEO为HW。
HW为6.表示消费者只能拉取到offset0至5之间的消息,而offset为6的消息对消费者而言是不可见的(图2)
LW(LowWatermark):“低水位”,AR中最小logStartOffset,副本拉取请求(FetchRequest,可能触发新建日志分段而旧的被清理,导致logStartoffset增加)和删除请求DeleteRecordRequest都可能促使LW增长
概要:一、ISR 的伸缩性:定期检查是否伸缩、缓存
二、何时扩充ISR:1)follower追赶上,2)hw保证一致性
三、同步过程:写leader,再同步
四、LSO(LastStableOffset)与kafka的事物有关:读提交,读未提交
一、ISR 的伸缩性
1)Leader跟踪维护ISR中follower滞后状态,落后太多或失效时,leade把他们从ISR剔除。2)OSR中follower“追上”Leader,在ISR中才有资格选举leader
Kafka启动开启ISR相关定时任务“isr-expiration"和”isr-change-propagation"
1、isr-expiration:周期性检测 分区是否缩减ISR。
1)“replica.lag.time.max.ms”设置周期,大小是这个参数一半,默认5000ms,
2)检测到ISR有失效副本时,缩减ISR集合,记录到zk对应/brokers/topics//partition//state节点如下:
{“controller_cpoch":26,“leader”:0,“version”:1,“leader_epoch”:2,“isr”:{0,1}}
其中controller_epoch:kafka控制器epoch.leader,前分区leader所在broker的id,version版本号(当前半本固定位1),leader_epoch当前分区leader纪元,变更后isr列表
2、isr-change-propagation:周期性(固定2500ms)检查isrChangeSet(记录变更后缓存)
1)发现变更,在zk的/isr_change_notification创建isr_change开头持久顺序节点存isrChangeSet信息:如/isr_change_notification/isr_change_0000000000 ,
2)kafka控制器为/isr_change_notification添加Watcher,子节点变化触发Watcher,通知控制器和管理broker节点更新元数据,删除/isr_change_notification下已处理节点。
3)避免频繁触发Watcher影响控制器、zk、broker性能,检查:上次ISR变化超过5秒,上次写zk超过60秒。
二、何时扩充ISR
1、不断同步,follower的LEO后移,追赶上leader判定准侧是follower的LEO是否小于leader副本HW
2、ISR扩充同样更新zk中的/broker/topics//partition//state节点和isrChangeSet,之后和收缩时相同。ISR增减时,或LEO变时,影响整个分区HW。
如leader的LEO为9,follower的LEO为7,follower2的LEO为6,判定都处于ISR中,分区HW为6,如follower2被剥离ISR,HW为leader和follower中LEO最小值为7(木桶原理)
3、HW保证一致性
Leader挂了,在新Leader可读HW,即对外可见最大offset,HW=max(replica.offset)
例:新msg,等ISR中replica同步后,更新HW,才消费,保证如Leader fail,仍可从新Leader中获取(配置延迟时间replica.lag.time.max.ms)
ps:内部Broker读,没HW限制。Folloer.HW = min(Leader.HW, Follower.offset)
三、同步过程
ISR中一个leader和两个follower副本,LEO和HW都为3。消息3和4从生产者发出后先存leader
follower1完全leader而follower2只同步消息3,leader、follower1的LEO为5,Follower2的LEO为4。HW最小值4,可以消费offset为0-3消息;所有都成功写入3、4,HW和LEO为5,可消费offset为4消息。
四、LSO(LastStableOffset)与kafka的事物有关
配置消费者事务隔离级别:消费端参数——isolation.level(字符串类型)
1、设置消费到位置
1)“read_committed",消费会忽略事务未提交,只能消费到LSO(LastStableOffset)位置
2)默认”read_uncommitted",可消费HW(High Watermak)位置。
ps:follower事务隔离级别也“read_uncommitted",且不可改
例:开启kafka事务时,生产者发消息1、2到broker,如没有提交事务,isolation.level=read_committed的消费者看不到消息,而isolation.level=read_uncommitted可到。事务中第一条消息位置标记为firstUnstableOffset
2、LSO还影响kafka消费后量
就是kafka,Log,也称kafka堆积量计算。
1)普通情况:Lag = HW-ConsumerOffset
2)引入了事务:read_uncommitted不受影响,read_committed引入LSO计算:
未完成事务,LSO=事务第一条消息位置(firstUnstableOffset)
已经完成=HW,
结论:LSO≤HW≤LEO
未完成read_committed,Lag=LSO-ComsumerOffset
https://blog.csdn.net/weixin_43975220/article/details/93190906
https://blog.csdn.net/qq_41568597/article/details/82501738