Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到,

  • 一个Topic(主题)会有多个Partition(分区)
  • 为了保证高可用,每个分区有多个Replication(副本)
  • 副本分为Leader 和 Follower 两个角色,Follower 从Leader同步数据
  • Leader副本对外提供读写服务
  • 当Leader副本挂掉,从ISR中选一个Follower副本成为新的Leader对外继续提供服务
  • 那么就要保证分区各副本间数据一致性
  • 已提交,Leader副本已经被Follower 都同步的消息
  • 未提交,Leader已经写入,还没有被Follower同步的消息
  • 对消费者而言,已提交的消息都可以拿到
  • Leader 和 Follower副本上都有HW 和 LEO
  • Leader副本除了自己的LEO,还存Follower的LEO

HW (High WaterMarker) 高水位

高水位可以理解为一个横切面,拉齐分区所有副本已经写入的消息,保证HW前的消息你有我有全都有啊,水桶原理

这里要注意,所有副本指的是ISR列表中的同步副本,OSR中同步慢的副本不管

LEO (Log End Offset) 日志末端位移

就是分区该副本下一个消息写入的位移(offset),当前副本最后一条消息的位移是13,下一个消息写入14位置

Follower 副本何时更新LEO呢?

  • 对于Leader副本来说,每次写入消息,都会更新LEO的值
  • Follower 副本不停地向Leader副本发送Fetch请求,一旦获取数据后就写入日志文件中进行备份,同时更新LEO值
  • 其实Follower跟Leader一样,写入数据时更新自己的LEO值

那么Leader 端的Follower的LEO 什么时候更新呢?

  • 当Leader接收到Follower发起的Fetch请求
  • 先从Log文件中读取数据
  • 先更新Leader中存储的Follower的LEO
  • 再将数据返回给Follower
  • 这里会不会存在Leader更新了Follower的LEO,但是Follower实际并没有收到返回的消息,而造成Follower 所在broker 和 Leader所在broker存的LEO值不一致呢?

Follower 何时更新HW呢?

  • Follower写入数据后,会更新自己的LEO值,然后就尝试更新自己的HW值
  • HW值是怎么算的呢?
  • 是根据自己当前LEO值与Leader返回的HW值比较,去较小值作为HW更新
  • 这很好理解,Leader中记录的HW是所有副本HW最小的值,也就是同步最慢的那个副本的LEO,每个副本都需要知道这个事,自己不是最小那就记别人的值

Leader 何时更新HW呢?

  • Leader中存储的HW就是整个分区的HW,直接影响消息对消费者的可见性
  • Leader更新HW有4中情况
    • Leader接收生产者发送过来的消息,写入文件后,检查是否需要更新HW
    • Follower副本选举成为新的Leader是,Kafka会尝试去更新分区HW
    • Broker崩溃,导致副本被踢出ISR,Kafka会检查分区HW是否有被更新的必要
    • Leader处理Follower的Fetch请求是,先从Log读取数据,然后尝试跟新HW值
  • 正常情况下就是2种: leader处理producer请求,leader处理follower的fetch请求

Leader 的HW值是怎么更新的呢?

  • 先选出所有满足条件的副本,ISR同步副本
  • 比较它们的LEO(包括leader的LEO)
  • 选择最小的LEO值作为HW
相关推荐
ClouGence12 小时前
开源数据库管理工具 CloudDM 4.4.0 发布,新增 Kafka、SAP HANA 数据源
数据库·kafka
RobinXYuan13 小时前
【Kafka 源码手记】01 从消息队列到 Event Streaming
kafka·源码阅读
nvd111 天前
深入剖析:GCP Pub/Sub 与 Apache Kafka 对消息处理延迟与消费者卡死的处理机制异同
分布式·kafka·apache
笔墨登场说说2 天前
centos 8 使用 kafka_2.13-4.3.1.tgz 安装kafka
linux·kafka·centos
guo_wen_qiang2 天前
kafka一直restarting,报错InconsistentClusterIdException
分布式·kafka
今年下半年2 天前
【消息队列】Spring Boot 集成 Kafka 消息队列:确保消费完成(手动提交偏移量+幂等判断+失败重试机制)
spring boot·kafka·幂等·失败重试
此时不提桶,更待何时3 天前
06-14-A-Kafka集群运维与迁移实战详解
运维·kafka
yumgpkpm3 天前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
用户1494484813204 天前
Raft 为什么取代了 Paxos?从 DLedger 和 KRaft 的技术选型聊起
kafka·raft
此时不提桶,更待何时4 天前
06-16-B-Kafka面试与生产事故实战
分布式·面试·kafka