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

这篇具有很好参考价值的文章主要介绍了Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上文我们已经学到,

  • 一个Topic(主题)会有多个Partition(分区)
  • 为了保证高可用,每个分区有多个Replication(副本)
  • 副本分为Leader 和 Follower 两个角色,Leader副本对外提供读写服务,Follower 从Leader同步数据
  • 当Leader副本挂掉,从ISR中选举一个Follower副本成为新的Leader对外继续提供服务
  • 那么就要保证分区各副本间数据一致性

图1:
Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?,kafka,kafka,HW,LEO,高水位

见上图,先来熟悉一下

  • 已提交,Leader副本已经被ISR中所有Follower 都同步的消息
  • 未提交,Leader已经写入,还没有被Follower同步的消息
  • 对Consumer(消费者)而言,已提交的消息都可以拿到
  • Leader 和 Follower副本上都有HW 和 LEO
  • Leader副本除了自己的LEO,还存Follower的LEO(Remote LEO)

HW (High WaterMarker) 高水位

图2:
Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?,kafka,kafka,HW,LEO,高水位
高水位可以理解为一个横切面,存储的也是Offset(位移)值,
拉齐分区ISR所有副本已经写入的消息,保证HW前的消息你有我有全都有啊,水桶原理

这里要注意,所有副本指的是ISR列表中的同步副本,OSR中同步慢的副本不管
为啥只管ISR列表,不管OSR列表中的副本呢?
这也就是为啥要搞HW 和 LEO 的原因,搞HW就是为了当Leader宕机了,会从ISR列表中选举一个Follower成为新的Leader继续对外提供服务,来实现高可用,而HW能保证任意一个Follower都包含对消费者可见的所有数据,实现数据的可靠性
而OSR是同步过慢的副本,选举也不选它,所以记录HW值也没必要管OSR列表

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

就是下一个消息要写入的Offset(位移),
如上图1,当前副本最后一条消息的位移是13,下一个消息写入14位置,该副本的LEO值就是14

Follower 副本何时更新LEO呢?

以图2 中为例:
Leader 的LEO = 14
Follower1 的 LEO = 12
Follower2 的 LEO = 8

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?,kafka,kafka,HW,LEO,高水位

  • 对于Leader副本来说,每次写入消息,都会更新LEO的值
  • Follower 副本不停地向Leader副本发送Fetch请求,一旦获取数据后就写入log(日志)文件中进行备份,同时更新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呢?

以图2 中为例:
Leader 、Follower1 、 Follower2 的 HW = 7

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?,kafka,kafka,HW,LEO,高水位

  • Follower写入数据后,会更新自己的LEO值,然后就尝试更新自己的HW值
  • Follower的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

感觉有点迷糊? 我们再来一篇举个栗子,掰BoBo说陷一下子,跟住奥~


** 都说kafka最厉害的地方是他的设计思想,果然有很多精妙之处啊**文章来源地址https://www.toymoban.com/news/detail-692514.html

到了这里,关于Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?

    消费者 : 1、订阅Topic(主题) 2、从订阅的Topic消费(pull)消息, 3、将消费消息的offset(偏移量)保存在Kafka内置的一Topic名字是_consumer_offsets的主题中,在Kafka的logs文件下能看到这👟文件,存放的是消息的偏移量数据 消费者组 : 1、订阅同一个Topic的消费者可以加入到一个

    2024年02月15日
    浏览(42)
  • Kafka 入门到起飞 - 生产者参数详解 ,什么是生产者确认机制? 什么是ISR? 什么是 OSR?

    上回书我们讲了,生产者发送消息流程解析传送门 那么这篇我们来看下,生产者发送消息时几个重要的参数详解 ,什么是生产者确认机制? 什么是ISR? 什么是 OSR? bootstrap.servers : Kafka 集群地址 host1:port1,host2:port2,host3:port3 不需要写Kafka集群中全部的broker地址,但是也不要写

    2024年02月15日
    浏览(36)
  • Kafka 入门到起飞系列

    2024年02月15日
    浏览(40)
  • Kafka 入门到起飞 - Kafka是怎么保证可靠性的呢

    什么是消息的可靠性呢,就是Kafka作为消息中间件,可以保证生产者发送过来的消息,即使在Kafka集群有节点出现宕机的情况下,也不会丢失 Kafka 是通过 消息确认机制 和 副本复制机制 来保证消息可靠性的 创建topic时,可以指定 副本因子 repilication-factor = 3 ,默认是3 表示分区

    2024年02月12日
    浏览(36)
  • Kafka 入门到起飞 - 核心概念(术语解释)

    在kafka之旅,我们会大量讨论Kafka中的术语,那么就让我们先来了解一下这些核心概念 消息(Message): kafka的数据单元称为消息,相当于DB里的 一行数据 或 一条记录 消息由 字节数组 组成 批次: 生产者组一批数据再向kafka推送,批次大小可以通过参数配置 把消息分成批次传输

    2024年02月17日
    浏览(59)
  • Kafka 入门到起飞系列 - 消费者组管理、位移管理

    消费者组 - Consumer Group 上文我们已经讲过消费者组了,我们知道消费组的存在可以保证一个主题下一个分区的消息只会被组内一个消费者消费,从而避免了消息的重复消费 消费者组是Kafka 提供的可扩展且具有容错性的消费者机制 消费组有一个或多个消费者,消费者可以是一

    2024年02月15日
    浏览(46)
  • Kafka 入门到起飞系列 - 生产者发送消息流程解析

    生产者通过 producerRecord 对象封装消息主题、消息的value(内容)、timestamp(时间戳)等 生产者通过 send() 方法发送消息,send()方法会经过如下几步 1. 首先将消息交给 拦截器(Interceptor) 处理, 拦截器对生产者而言,对所有消息都是生效的,拦截器也支持链式编程(责任器链)的

    2024年02月16日
    浏览(48)
  • Kafka篇——Kafka集群Controller、Rebalance和HW的详细介绍,保姆级教程!

    一、概念 在Kafka中,Controller是Kafka集群中的一个角色, 负责管理集群的元数据、分区分配、副本管理等功能。 Controller的主要职责包括: 1. 元数据管理:Controller负责维护Kafka集群的元数据,包括broker的存活状态、分区的分配情况、副本的分配情况等。它通过与Zookeeper进行交互

    2024年01月19日
    浏览(37)
  • Kafka核心原理第二弹——更新中

    1. Kafka Producer怎么把消息发送给Broker集群的? 需要指定把消息发送到哪个topic去 首先需要选择一个topic的分区,默认是轮询来负载均衡,但是如果指定了一个分区key,那么根据这个key的hash值来分发到指定的分区,这样可以让相同的key分发到同一个分区里去,还可以自定义par

    2024年02月09日
    浏览(40)
  • Kafka核心原理第一弹——更新中

    首先了解两个专业术语,研究kafka这个东西,你必须得搞清楚这两个概念,吞吐量,延迟。 写数据请求发送给kafka一直到他处理成功,你认为写请求成功,假设是1毫秒,这个就说明性能很高,这个就是延迟。 kafka,每毫秒可以处理1条数据,每秒可以处理1000条数据,这个单位

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包