副本与ISR设计--Kafka从入门到精通(十四)

2023-11-11

上篇文章说了,broker的消息设计,采用紧凑的byteBuffer,存储设计主要包含attribute后三个表示压缩类型,还有crc效验,以及key和value,后面新增了时间戳。

Broker消息设计--Kafka从入门到精通(十三)https://blog.csdn.net/ke1ying/article/details/126575462

一、副本与ISR设计

首先kafka本质就是个备份日志,利用多份相同的数据来提供冗余机制保证高可用。这些备份在kafka中就被称为副本(replica)。Kafka把这些副本均匀分配到broker上,并从这些副本挑选一个作为leader对外提供服务,而其他副本被称为follower副本,只能被动向leader副本请求数据,保证数据同步。

假设leader一直正常工作,是不需要follower副本,但现实残酷,一旦发生这种情况,follower副本就会竞争称为leader,但不是所有副本都有资格竞选,如果落后太多的副本竞选成功,则会失去资格,不然导致数据丢失,鉴于这种情况,kafka引入ISR机制。

ISR(in-sync replicas),就是kafka动态维护副本的机制,每个topic分区都有自己的ISR列表,isr中所有副本都和leader保持数据同步,也包含leade,只有isr中副本才有选举资格。由此可见,如果由n个副本,该分区可以忍受n-1个副本宕机。

在0.9.0.0版本之前,kafka有个参数replica.lag.max.message,用于控制follower副本落后leader副本的数量,一旦超过这个消息数,则被视为‘不同步’状态,把这个follower提出副本。

另外还有一个参数是replica.lag.time.max.ms用于监测超时时间,若设置500ms,follower在500ms内没有向leader请求数据,那么则视为不同步。

在0.9.0.0版本之后,kafka去掉了replica.lag.max.message,只保留了replica.lag.time.max.ms,默认是10s,对于请求速度追不上的follower,监测机制也发生了变化:如果一个follower落后leader的时间超过这个值,那么follower就是不同步的。

水印watermark和leader epoch

水印也被称为高水印或高水位,通常用在流式处理领域,与时间有关。而在kafka里面,水印反而与时间无关,与offset有关。一个kafka分区下通常有多个副本来实现冗余,主要三大类:

Leader副本:响应clients端读写请求副本。

Follower副本:被动备份leader数据,不想赢client读写。

ISR副本集合:包含leader副本和所有follower副本集合。

每个kafka副本对象都持有两个重要属性:日志末端位移(log end offset,简称LEO)和高水位(highwatermark,简称HW)。(注意是所有副本,不止leader副本)

LEO:日志末端位移,记录了该副本对象底层日志文件中下一条消息的位移值。举个例子,LEO=10,那么表示该副本日志上已经保存10条消息,位移范围是[0,9]。(另外LEO的leader和follower更新机制是不同的)

HW:高水印值。任何一个副本的HW值都大于LEO值,而小于或者等于HW值得所有消息都被认为是“已提交的”或“已备份的”(replicated)。(kafka对leader和follower的更新HW机制也是不同的)

如果把LEO和HW看做两个指针,那么它们定位机制是不同的,任何时刻,HW指的是实实在在的消息,而LEO指向下一条特写,也就是说LEO指向的位子是没有消息的。

从图上可以看到HW值是7,这表示前8条,从0开始,已经是备份状态,而LEO是12,表示当前日志写入了11条数据,而8到11属于未备份,也就是未提交数据。

之前说过消费者不能消费未提交的消息。也可以说是消费者无法消费分区leader副本上大于HW的消息。

LEO更新机制

分为Leader副本更新LEO机制 和 follower副本更新LEO机制

Follower副本只是被动向leader副本请求数据,具体表现为follower副本不停向leader副本所在broker发送fetch请求,一旦获取到消息,则写入自己日志进行备份。

那么follower副本的LEO是何时更新的?有两套,一套LEO值保存在follower副本所在broker的缓存上,另一套LEO值保存在leader副本所在broker的缓存上,后者可以暂且称为remoteLEO。换句话说,leader副本所在机器的缓存上保存了该分区下所有follower副本的LEO属性值,包括他自己。

为什么保存两套值呢?因为kafka要利用前者帮助follower副本自身更新HW值,而同时还需要使用后者来确定leader副本HW值,即分区HW。

Follower副本端的follower副本LEO何时更新?

指的就是当前follower副本底层日志的LEO值,也就是说每当写入一条消息,其LEO值就会加1。所以当follower发起fetch请求leader,leader返回数据后,就开始写入底层日志。

Leader副本端的follower副本LEO何时更新?

Leader在处理follower发起fetch请求时候更新。一旦leader接受到follower发起的fetch请求,它会首先从log中读取相应的数据,但是在给follower返回数据前,他先去更新follower的LEO。

Leader更新LEO的时机也是写log时候更新他的LEO。

HW更新机制

首先看看follower副本HW属性更新机制,follower更新HW在他更新完LEO之后,一旦follower向log写完数据,则更新HW值。

比如follower的HW值,我们更关心leaderHW值,因为他直接影响分区数据的对于consumer可见性。在以下四种情况,leader会尝试更新自己的hw值。

  1. 副本称为leader时:当某个副本成为分区的leader副本,kafka会尝试更新分区hw值。
  2. Broker崩溃导致副本被踢出ISR。
  3. Leader处理follower的fetch请求时。
  4. Producer向leader副本写入消息时候。

注意最后两条是在kafka正常工作的时候,他的更新时间有两个,第一个就是producer发送数据成功,另一个是follower副本发起fetch同步数据时候。

那么leader是何时更新他的hw值?满足两个条件才可以更新:

  1. 处于ISR中。
  2. 副本LEO落后leader LEO的时长不大于replica.lag.time.ms(默认10s)。

基于水印备份缺陷

可能存在两个问题,

  1. 数据丢失
  2. 数据不一致/数据离散:leader日志和follower日志可能不一致。

基于上面两个问题,leader epoch值彻底解决了基于水印备份机制的两个弊端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

副本与ISR设计--Kafka从入门到精通(十四) 的相关文章

随机推荐

  • RabbitMq结合springBoot实现延时任务

    简介 rabbitMQ延时任务的实现思想 rabbitmq实现延时任务本质就是使用 过期时间 和 死信队列 实现的 首先定义一个死信队列和死信队列的消费者 这个死信队列用来接收延时队列过期的消息 死信队列消费者用来接收到过期消息后就进行消费
  • FFmpeg中调用av_read_frame函数导致的内存泄漏问题

    使用FFmpeg的av read frame函数后 每读完一个packet 必须调用av packet unref函数进行内存释放 否则会导致内存释泄漏 在vs 博主所用的ffmpeg版本是3 4 2 vs版本是vs2015 中编译运行如下
  • [语义分割]基于VGG网络搭建FCN-8s并在VOC2012数据集上训练

    文章目录 1 数据集选取 1 1数据集简介 1 2 数据预处理 1 2 1踩坑记录1 1 2 2 读取图片路径 1 2 3 自定义图像增强与预处理模块 1 3自定义数据集类 1 3 1数据标签可视化 2 搭建FCN 8s网络 2 1基础FC
  • uni-app组件传值

    目录 一 父组件给子组件传值 父组件 elementFather vue 子组件 element vue 效果图 二 子组件给父组件传值 子组件 element vue 父组件 elementFather vue 效果图 三 兄弟组件之间传
  • 用jupyter读取mysql中的数据的两种方式

    不管是采用哪种方式都应该先保证创建了目标数据库 即在mysql data文件夹下有以目标数据库名称命名的子文件夹 且子表应该为以下格式 而不是 sql 未执行命令 文件 首选方法二 因为仅SQLAlchemy可连接支持read sql ta
  • img src 使用base64格式 上传、根据文件名显示所有图片 java代码

    最近在做ca签名 key验证通过后传图片为base64格式图片 保存至自己服务器 大概操作 首先获取的src data image png base64 sealBase64 获取到的参数 function qr var base64 im
  • 配置uni-app的开发环境

    点击下载安装Hbuilderx 点击下载微信开发者工具 安装完成后下载导入一些插件依赖 这里用scss举例 https ext dcloud net cn plugin name compile node sass 新建项目 目录结构如下
  • C++ OSD水印叠加

    视频相关领域 监控 LED大屏 很多场合可能会涉及到在一幅画面上进行文字或时间的叠加 常规做法都是在后端实现 即先渲染图像 然后叠加OSD文字信息 这种方法简单且高效 但是有些场合必须要求在前端进行叠加 比如监控领域中视频名称信息 时间信息
  • WMware创建linux虚拟机并配置网络及防火墙

    1 打开VMware并创建虚拟机 基本一直下一步就行了 这里不多做说明了 名称随便取 最好就是master 位置放在自己预定的地方 这些配置参数随便设 差不多就行 创建到此为止 接下来安装linux系统 上下键选择 回车键确定 为了表现专业
  • ERP服务器端安装及配置

    概述 在配置ERP端是 普实系统集成工具同MES端配置时使用的程序类似 不硬性规定在哪台服务器上安装 只要能够连上ERP服务器即可 安装过程类似于系统集成工具 安装完成后 在开始中的菜单文件夹为Pushsoft Intergration 操
  • 锤子剪刀布游戏

    问题描述 大家应该都会玩 锤子剪刀布 的游戏 两人同时给出手势 胜负规则如图所示 现给出两人的交锋记录 请统计双方的胜 平 负次数 并且给出双方分别出什么手势的胜算最大 输入 输入第1行给出正整数N lt 105 即双方交锋的次数 随后N行
  • RC4文件加密的Python实现方法

    RC4 Rivest Cipher 4 是一种流密码 stream cipher 算法 广泛应用于网络通信和数据加密中 本文将介绍如何使用Python实现RC4文件加密算法 RC4算法的核心是使用一个伪随机数生成器 PRNG 生成密钥流 然
  • 端口显示被占用,如何关闭端口

    用管理员权限打开命令提示符 如果要关闭3306端口 首先要查询此端口号对应的PID 则输入以下命令 1 输入 netstat ano findstr 3306 然后借助命令终止PID对应的进程 输入以下命令 2 输入 taskkill PI
  • 【C++简明教程】Python和C++指定元素排序比较

    Python 中的排序 在 Python 中 常用的排序就是 sorted 对于列表这种数据结构来说 还有 sort 方法 列表的排序 使用 sort 方法进行排序 以第二个值进行升序排序 列表的 sort 方法是原地排序 另外一种排序方法
  • CMake的使用--以ORCA避碰C++库为例

    1 安装cmake 链接 Download CMake 版本需下载Binary distributions这个模块下的 Windows x64 Installer cmake 3 27 1 windows x86 64 msi 注意事项 1
  • CentOS6.5 安装 抓包工具tcpdump

    1 裸机没装GCC 离线安装 首先到http vault centos org 6 5 os x86 64 Packages 下载用到的rpm包 包括 ppl 0 10 2 11 el6 x86 64 rpm cloog ppl 0 15
  • LabVIEW自带函数Database Toolkit实现SQL Server操作(上)

    目录 一 函数位置 二 函数一览 三 主要介绍 1 DB Tool Open Connection vi 2 DBTool Close Connection vi 3 Database Variant To Data vi 4 DBTool
  • 浅析Redux 的 store enhancer

    相信大家都知道Redux的middleware 中间件 的概念 Redux通过middleware可以完成发送异步action 网络请求 打印action的日志等功能 相对而言 Redux的store enhancer的概念 很多人并不是很
  • 【MLOps】第 5 章 : 生产准备

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 副本与ISR设计--Kafka从入门到精通(十四)

    上篇文章说了 broker的消息设计 采用紧凑的byteBuffer 存储设计主要包含attribute后三个表示压缩类型 还有crc效验 以及key和value 后面新增了时间戳 Broker消息设计 Kafka从入门到精通 十三 htt