从Kafka的可靠性设计体验软件设计之美

目录

1. Kafka可靠性概述

2. 副本剖析

     2.1 什么是副本

   2.2 副本失效场景

  2.3 数据丢失场景

2.4 解决数据丢失方案

3. 日志同步机制

4. 可靠性分析


1. Kafka可靠性概述

     Kafka 中采用了多副本的机制,这是大多数分布式系统中惯用的手法,以此来实现水平扩展、提供容灾能力、提升可用性和可靠性等。

2. 副本剖析

     2.1 什么是副本

            副本(Replica)是分布式系统中常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。

   2.2 副本失效场景

        a.  follower副本进程卡住,在一段时间内根本没有向leader副本发起同步请求,比如频繁的Full GC。

       b.   follower副本进程同步过慢,在一段时间内都无法追赶上leader副本,比如I/O开销过大。

       c.   如果通过工具增加了副本因子,那么新增加的副本在赶上leader副本之前也都是处于失效状态的。

  2.3 数据丢失场景

      在某一时刻,B中有2条消息m1和m2,A从B中同步了这两条消息,此时A和B的LEO都为2,同时HW都为1;之后A再向B中发送请求以拉取消息,FetchRequest请求中带上了A的LEO信息,B在收到请求之后更新了自己的HW为2;B中虽然没有更多的消息,但还是在延时一段时间之后返回FetchResponse,并在其中包含了HW信息;最后A根据FetchResponse中的HW信息更新自己的HW为2。

                                           数据丢失场景(part 1)
        可以看到整个过程中两者之间的HW同步有一个间隙,在A写入消息m2之后(LEO更新为2)需要再一轮的FetchRequest/FetchResponse才能更新自身的HW为2。如果在这个时候A宕机了,那么在A重启之后会根据之前HW位置(这个值会存入本地的复制点文件replication-offset-checkpoint)进行日志截断,这样便会将m2这条消息删除,此时A只剩下m1这一条消息,之后A再向B发送FetchRequest请求拉取消息。

                                                                  数据丢失场景(part 2)
       此时若B 再宕机,那么 A 就会被选举为新的leader,B 恢复之后会成为follower,由于follower副本HW不能比leader副本的HW高,所以还会做一次日志截断,以此将HW调整为1。这样一来m2这条消息就丢失了(就算B不能恢复,这条消息也同样丢失)。

                                                                  数据丢失场景(part 3)
         对于这种情况,也有一些解决方法,比如等待所有follower副本都更新完自身的HW之后再更新leader副本的HW,这样会增加多一轮的FetchRequest/FetchResponse延迟,自然不够妥当。还有一种方法就是follower副本恢复之后,在收到leader副本的FetchResponse前不要截断follower副本(follower副本恢复之后会做两件事情:截断自身和向leader发送FetchRequest请求),不过这样也避免不了数据不一致的问题。
       当前leader副本为A,follower副本为B,A中有2条消息m1和m2,并且HW和LEO都为2,B中有1条消息m1,并且HW和LEO都为1。假设A和B同时“挂掉”,然后B第一个恢复过来并成为leader。


                                                                   数据不一致场景(part 1)

                                                              数据不一致场景(part 2)
         之后B写入消息m3,并将LEO和HW更新至2(假设所有场景中的min.insync.replicas参数配置为1)。此时A也恢复过来了,根据前面数据丢失场景中的介绍可知它会被赋予follower的角色,并且需要根据HW截断日志及发送FetchRequest至B,不过此时A的HW正好也为2,那么就可以不做任何调整了。

                                                                  数据不一致场景(part 3)
如此一来A中保留了m2而B中没有,B中新增了m3而A也同步不到,这样A和B就出现了数据不一致的情形。

2.4 解决数据丢失方案

     为了解决数据丢失问题,Kafka从0.11.0.0开始引入了leader epoch的概念,在需要截断数据的时候使用leader epoch作为参考依据而不是原本的HW。leader epoch代表leader的纪元信息(epoch),初始值为0。每当leader变更一次,leader epoch的值就会加1,相当于为leader增设了一个版本号。

       A在收到2之后发现和目前的LEO相同,也就不需要截断日志了。之后B发生了宕机,A成为新的leader,那么对应的LE=0也变成了LE=1,对应的消息m2此时就得到了保留,之后不管B有没有恢复,后续的消息都可以以LE1为LeaderEpoch陆续追加到A中。

3. 日志同步机制

          在Kafka中动态维护着一个ISR集合,处于ISR集合内的节点保持与leader相同的高水位(HW),只有位列其中的副本(unclean.leader.election.enable配置为false)才有资格被选为新的 leader。写入消息时只有等到所有 ISR 集合中的副本都确认收到之后才能被认为已经提交。位于 ISR 中的任何副本节点都有资格成为 leader,选举过程简单、开销低,这也是Kafka选用此模型的重要因素。Kafka中包含大量的分区,leader副本的均衡保障了整体负载的均衡,所以这一因素也极大地影响Kafka的性能指标。
        在采用ISR模型和(f+1)个副本数的配置下,一个Kafka分区能够容忍最大f个节点失败,相比于“少数服从多数”的方式所需的节点数大幅减少。

4. 可靠性分析

        生产者客户端参数 acks,相比于0和1,acks=-1(客户端还可以配置为all,它的含义与-1一样,以下只以-1来进行陈述)可以最大程度地提高消息的可靠性。

      对于acks=1的配置,生产者将消息发送到leader副本,leader副本在成功写入本地日志之后会告知生产者已经成功提交,如图8-24所示。如果此时ISR集合的follower副本还没来得及拉取到leader中新写入的消息,leader就宕机了,那么此次发送的消息就会丢失。

   

     ack=-1的配置,生产者将消息发送到leader副本,leader副本在成功写入本地日志之后还要等待 ISR 中的 follower 副本全部同步完成才能够告知生产者已经成功提交,即使此时leader副本宕机,消息也不会丢失,如果在消息成功写入leader副本之后,并且在被ISR中的所有副本同步之前leader副本宕机了,那么生产者会收到异常以此告知此次发送失败。

      

       

   

    

           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webpack热更新原理详解

文章目录 前言基础配置创建项目HMR配置 HMR交互概览HMR流程概述HMR实现细节初始化注册监听编译完成事件启动服务监听文件代码变化服务端发送消息客户端收到消息热更新文件请求热更新代码替换 问题思考 前言 刷新分为两种:一种是页面刷新,不保留页面状态…

品鉴中的文化传承:如何理解红酒在历史与文化中的地位

红酒不仅是产品,更是一种文化和历史的传承。在品鉴雷盛红酒的过程中,了解红酒背后的历史和文化,能够更好地理解其风格和特点,提升品鉴体验。 红酒的历史可以追溯到公元前6000年左右的古埃及时期。自那时起,红酒就成为了…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图,直接下载即可 transforms.Compose 是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

Linux系统编程---线程同步

一、同步概念 同步即协同步调,按预定的先后次序运行。 协同步调,对公共区域数据【按序】访问,防止数据混乱,产生与时间有关的错误。 数据混乱的原因: 资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线…

监控员工上网用什么软件比较好 八款电脑监控神器送给你

监控员工上网用什么软件比较好 八款电脑监控神器送给你 监控员工上网行为的软件有多种,每款软件都有其独特的功能和优势。现在让我们一起来探寻最佳员工上网监控神器! 想知道哪款电脑监控软件最炫酷、最实用吗?来看看这里,为你揭…

36.WEB渗透测试-信息收集-企业信息收集(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:35.WEB渗透测试-信息收集-企业信息收集(2) 重要信息收集&#xf…

Python 中的递归排列

在 Python 中使用递归计算排列,适合绝对初学者 介绍 有些人发现很难理解递归算法。 这个技巧向绝对初学者展示了如何使用递归查找排列。Python 背景 这个技巧的想法来自一个问答问题:可怜的 OP 花了三天时间“翻头”,试图弄清楚一小段代码如何能够生成输入列表项的所有排列。…

ROS_第一个程序_Hello_world

ROS的第一个项目:输出Hello World 我们将学习如何创建一个简单的ROS(Robot Operating System)项目,该项目将在终端中输出"Hello World"。我们将使用Python语言进行编程。 环境准备 首先,确保你的计算机已…

【目标检测】基于深度学习的布匹表面缺陷检测(yolov5算法,4类,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

硬件24、嘉立创EDA丝印的优化和调整

1、调整全部丝印的属性 先选中一个丝印,然后右键点击它,选择查找,然后选择查找全部 选择查找全部这个时候可以设置所有丝印在元件的位置了,布局-》属性位置,位号,属性位置设置为上边,这时丝印就…

全志ARM-网络链接

命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect (WiFi名,不要有空格)password (WiFi密码) 查看IP地址 ip addr show wlan0或ifconfig 出现successfully就连接成功了

计应2班01

public class Demo {public void sum(double num1 , double num2){System.out.println(num1 num2);} }import org.junit.Test;public class Test1 { // 定义方法 // test sum // testSum // public void // TestTestpublic void testSum(){Demo de…

如何通过文件下发平台,让数据发挥其真正的价值?

银行网点文件下发平台是专门设计用于银行系统内部或与外部机构之间安全、高效地传输和分发文件的系统。目前使用较多的方式是FTP、邮件、物理媒介等,但都存在一定问题: 1、物理媒介:如U盘、光盘等,通过快递服务发送给分支机构&…

面向对象设计与分析(42)工厂方法模式

文章目录 定义示例实际应用 定义 工厂方法模式,定义一个用于创建对象的接口(工厂方法),返回对象基类,让子类去实现该接口,从而返回具体的子类对象。 结构 工厂方法模式包含以下主要角色: 抽象…

观成科技:蔓灵花组织加密通信研究分析总结

1.概述 蔓灵花,又名"Bitter",常对南亚周边及孟加拉湾海域的相关国家发起网络攻击,主要针对巴基斯坦和中国两国。其攻击目标主要包括政府部门、核工业、能源、国防、军工、船舶工业、航空工业以及海运等行业,其主要意图…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架(Web framework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中,我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径,但是锁着一次读取配置的增多,不可避免的出现了一个问题:我们如何来监控多个日志文件,这样原来的tailFile模块相对于当下场景就…

【JavaScript】内置对象 ④ ( Math 内置对象常用方法 | 取绝对值 | 向下取整 | 向上取整 | 四舍五入取整 | 取随机数 )

文章目录 一、Math 内置对象常用方法1、计算绝对值 - Math.abs2、取整计算 - Math.floor 向下取整 / Math.ceil 向上取整 / Math.round 四舍五入3、随机数 - Math.random4、代码示例 - 猜随机数 一、Math 内置对象常用方法 1、计算绝对值 - Math.abs 向 Math.abs() 方法中 传入…

简单的jmeter脚本自动化

1、创建线程组,定义自定义变量,保存请求默认值 2、用csv编写测试用例 备注:如果单元格内本身就有引号,则格式会有点小问题,不能直接修改为csv 用txt打开后 有引号的需要在最外层多包一层引号,每个引号前…
最新文章