Kafka 可靠性探究—副本刨析

Kafka 的多副本机制提升了数据容灾能力。

副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据;服务副本指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。

1 副本刨析

1.1 相关概念

AR:Assigned Replicas,分区中的所有副本。

ISR:In-Sync Replicas,与leader副本保持同步状态的副本集合。

LEO:Log End Offset,分区中最后一条消息的下一个位置。

HW:High Watermark,高水位。标识了一个特定的消息偏移量,消费者只能拉取到这个偏移量之前的消息。HW是ISR集合中最小的LEO。

1.2 失效副本

在ISR集合之外的副本称为失效副本。即处于同步失效的状态。

broker端参数replica.lag.time.max.ms 配置了一个follower副本滞后于leader副本的最长时间间隔。(默认值30s)

当follower副本将leader副本LEO之前的日志全部同步过来的间隔时间超过这个值时,该副本处于同步失效状态,会从ISR集合中移除。

当副本追赶上leader时,会更新该副本的lastCaughtUpTimeMs。如果副本还未追赶上leader,则用当前时间-lastCaughtUpTimeMs计算差值,如果差值大于上面配置的值,那么该副本处于同步失效状态。

追赶上leader副本的判定标准是此副本的LEO是否不小于leader副本的HW。

1.2.1 ISR的伸缩

“isr-expiration”任务用于周期性地检测每个分区是否需要缩减其ISR集合。周期是replica.lag.time.max.ms配置参数的一半。当检测到ISR集合中有副本失效时,就会收缩ISR集合。

当ISR集合发生变更时,会将变更后的记录缓存到isrChangeSet中。isr-change-propagation会周期性(固定值为2500ms)地检查isrChangeSet。如果发现了变更记录,它会在Zookeeper的/isr_change_notification路径下创建一个保存isrChangeSet信息的节点。Kafka为/isr_change_notification添加了一个Watcher,当这个节点中有子节点发生变化时会触发Watcher的动作。

注意,频繁触发Watcher会影响性能,Kafka为避免这种情况,当检测到ISR集合发生变化时,还需要检查以下两个条件:

  1. 上次ISR集合发生变化距离现在已超过5s。
  2. 上次写入Zookeeper的时间距离现在已超过60s。

1.3 副本LEO与HW的变化

图 副本同步过程中LEO与HW的变化

follower 向leader拉取消息时,LEO与HW的变更步骤如下:

  1. follower向leader拉取消息时,请求会携带自身的LEO信息,即fetch_offset。
  2. leader收到请求时,会先检查该副本是否在ISR中,如果在,则将自身的HW值更新为所有ISR中的follower的LEO最小的值(leader会保存其他follower副本的LEO,会在返回响应之前更新对应follower的LEO)。然后连同消息和HW一起返回FetchResponse给follower。
  3. follower 在收到FetchResponse响应后,更新LEO,然后取自身LEO及返回的HW中的最小值来更新自身的HW。

1.3.1 LEO和HW的持久化

Kafka 会周期性的将所有分区的LEO刷写到recovery-point-offset-checkpoint中(恢复点文件)。将所有分区的HW刷写到replication-offset-checkpoint中(复制点文件)。

1.4 同步机制

在0.11.0版本之前,Kafka使用的是基于HW的同步机制,这样可能会出现数据丢失或数据不一致的问题。

1.4.1 数据丢失

图 副本宕机及恢复过程中数据丢失

  1. 如图,某刻A副本为follower副本,LEO=5,HW=3。B为leader。此时A发生宕机。
  2. A恢复,并且根据HW,对日志进行阶段,使LEO=3。
  3. B发生宕机,A被选举为leader。
  4. B恢复,成为follower。因为follower的HW不能大于leader的HW。所以B会更改HW,并进行日志阶段,使HW=3,LEO=3。
  5. 丢失2条消息。

1.4.2 数据不一致

图 副本宕机及恢复过程中数据不一致

  1. A与leader B 同时宕机。随后A先恢复,成为leader。
  2. 有1条消息写入到该分区,leader A 的LEO变为4,HW也变更为4。
  3. 此时B也恢复成为follower,因为其HW不大于leader的HW,且等于LEO,所以其不要解答日志,同时也不会拉取leader的数据。
  4. B与leader A 的最新一条消息不一致。

1.4.3 Leader Epoch

为了解决上述两种问题,从0.11.0版本开始引入leader epoch的概念。

leader epoch 代表leader的纪元信息,初始值为0,每当leader变更一次,该值就会加1。

每个副本都会增设一个矢量<LeaderEpoch => StartOffset>,其中StartOffset表示当前LeaderEpoch下写入的第一条消息的偏移量(LEO)。在发生leader epoch变更时,每个副本会将对应的矢量追加到其Log下的leader-epoch-checkpoint文件中。

follower副本从宕机状态恢复后,会先发送OffsetsForLeaderEpochRequest请求给leader。将携带follower当前的Leader Epoch值。leader 收到该请求后会返回当前的LEO。如果follower的Leader Epoch值和leader的不相同,那么leader将会查找 Leader epoch 为 follower 的Leader Epoch 值 + 1对应的StartOffset,并返回。

follower在收到响应后,根据返回值与自身的LEO作对比,来决定是否需要将日志阶段截断使LEO等于返回值。

图 副本宕机及恢复过程Leader epoch的变化

  1. A为leader,此时副本的LE(Leader epoch)都为0。B发生宕机,然后A发生宕机,此时C被选举为leader,并且C的LE+1,变更为1。
  2. B 恢复,并且向C发送OffsetsForLeaderEpochRequest请求,C返回3,B收到响应后,将日志截断,使得LEO=3。

注意:当leader epoch 发送变更时,leader将会通知其他非宕机副本,使得它们来更新自己的<LeaderEpoch => StartOffset>矢量信息。

  1. C发生宕机,B被选举为leader,并且B的LE+1,变更为2。随后B被写入两条新的消息,LEO变为5。
  2. A恢复,并且向B发送OffsetsForLeaderEpochRequest请求,B返回LE为1的StartOffset,即为3。A收到响应后,将日志截断,使得其LEO=3.
  3. 随后A变更LE为2。并且向B拉取消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13378.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逻辑起源 - 比较DS与豆包对“逻辑”源头的提炼差异

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 问题&#xff1a;“逻辑”的源头是什么&#xff1f; 豆包回答&#xff1a; “逻辑” 一词源…

Qt:Qt环境配置安装

搭建Qt开发环境 Qt的开发工具概述 Qt 支持多种开发工具&#xff0c;其中比较常用的开发工具有&#xff1a;Qt Creator、Visual Studio、Eclipse。 Qt Creator Qt Creator是⼀个轻量级的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使用Qt框架进行应用程…

文献阅读分享《新闻推荐中的审议式多样性:操作化与实验用户研究》

标题期刊年份Deliberative Diversity for News Recommendations: Operationalization and Experimental User StudyProceedings of the Seventeenth ACM Conference on Recommender Systems (RecSys 23)2023 &#x1f31f;论文背景 在信息爆炸的时代&#xff0c;新闻推荐系统…

AspectJ 中通知方法参数绑定

我们知道 AspectJ 中的通知方法可以携带参数&#xff0c;例如 Before 前置通知方法可以携带一个 JoinPoint 类型参数&#xff0c;那么还可以携带其它参数吗&#xff1f; 示例一 Before(value "execution(* *..UserServiceImpl.doSome(String))", argNames "…

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件&#xff0c;可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务&#xff0c;如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…

Golang 并发机制-6:掌握优雅的错误处理艺术

并发编程可能是提高软件系统效率和响应能力的一种强有力的技术。它允许多个工作负载同时运行&#xff0c;充分利用现代多核cpu。然而&#xff0c;巨大的能力带来巨大的责任&#xff0c;良好的错误管理是并发编程的主要任务之一。 并发代码的复杂性 并发编程增加了顺序程序所不…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

71.StackPanel黑白棋盘 WPF例子 C#例子

就是生成黑白棋盘&#xff0c;利用该控件能自动排列的功能。用一个横向的StackPanel嵌套纵向的StackPanel&#xff0c;然后在里面添加设定好长和高的矩形。 因为StackPanel是按照控件的大小展示的。所以如果不设置长和宽。就会显示不出矩形。 <StackPanel Orientation"…

【吾爱出品】开源桌面组件:widgets

widgets 桌面组件 链接&#xff1a;https://pan.xunlei.com/s/VOIQXVWeQIXS_K7NRvVHun_7A1?pwdgq4j# 一款用 vue3 构建的Windows桌面小部件。 这是桌面组件前端开源组件&#xff0c;作者称&#xff1a;项目还在持续完善中&#xff0c;目前包含键盘演示、抖音热榜、喝水提醒…

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

vs code 使用教程

一、定义 多行注释vs 找不到上层文件路径选择 或 创建python 虚拟环境git 远程克隆及推送vs code 文件路径vs 使用tensorboard 二、使用 学习网站&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/python/?viewvs-2022性能分析&#xff1a;https://learn.micros…

Verilog基础(一):基础元素

verilog基础 我先说,看了肯定会忘,但是重要的是这个过程,我们知道了概念,知道了以后在哪里查询。语法都是术,通用的概念是术。所以如果你有相关的软件编程经验,那么其实开启这个学习之旅,你会感受到熟悉,也会感受到别致。 入门 - 如何开始 欢迎来到二进制的世界,数字…

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…

接口对象封装思想及实现-笔记

目录 接口对象封装代码分层思想 封装案例封装Tpshop商城登录Tpshop商城登录参数化 接口对象封装 代码分层思想 分层思想&#xff1a;将普通思想分为两层&#xff0c;分为接口对象层和测试脚本层 接口对象层&#xff1a; 对接口进行封装&#xff0c;封装好之后&#xff0c;给测…

Javascript 日期计算如何实现当前日期加一天或者减去一天

• 1. Javascript 如何计算当前日期加一天或者减去一天的返回值 • 1.1. 加一天 • 1.2. 减一天 • 1.3. 解释 1. Javascript 如何计算当前日期加一天或者减去一天的返回值 在JavaScript中&#xff0c;可以通过Date对象来计算当前日期加一天或减去一天。 以下是一个简单的…

C_位运算符及其在单片机寄存器的操作

C语言的位运算符用于直接操作二进制位&#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符&#xff08;&&#xff09; 功能&#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…

算法日记12:SC40树状数组(单点修改)

一、题目 二、题解&#xff1a; 2.1&#xff1a;题目的修改/查询交替进行&#xff0c;一眼就是树状数组的模板题目(当先修改最后查询可以使用前缀和/差分实现)&#xff0c; 2.2&#xff1a;树状数组结构&#xff1a;每一个节点都有其管辖区间 2.2.1:lowbit()函数 : l o w b i…

6 加密技术与认证技术

6 加密技术与认证技术 6.1:对称加密与非对称加密技术 6.1.1:对称加密 对称加密:; 特点: 1、加密强度不高&#xff0c;但效率高;2、密钥分发困难。 常见对称密钥&#xff08;共享秘钥&#xff09;加密算法:DES、3DES(三重DES)、RC-5、IDEA算法。 6.1.1.2非对称加密技术 非对称…