大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(正在更新…)

章节内容

上节我们完成了如下内容:

  • 事务相关配置
  • 事务幂等性
  • 事务操作
  • 案例1:单Producer 保证仅发送一次
  • 案例2:消费-转换-生产 事务仅保证一次发送

在这里插入图片描述

控制器

基本介绍

  • Kafka集群包含若干个Broker,broker.id 指定broker的编号,编号不要重复。
  • Kafka集群上创建的主题,包含若干个分区。
  • 每个分区包含若干个副本,副本因子包括了Follower副本和Leader副本。
  • 副本又分为ISR(同步副本分区)和OSR(非同步副本分区)

在这里插入图片描述

  • 控制器就是一个Broker
  • 控制器除了一般Broker的功能,还负责Leader分区的选举

Broker选举

控制器信息

集群里第一个启动的Broker在ZooKeeper中创建了临时的节点

<KafkaZkChroot>/controller

其他Broker在该控制器节点创建ZooKeeperWatch对象,使用ZooKeeper的监听机制接收该节点的变更。
即:Kafka通过ZooKeeper的分布式特性选举集群控制器。

下图中,节点 /controller 是一个Zookeeper临时节点,其中Brokerid:0,表示当前控制器是broker.id为0的Broker。
在这里插入图片描述每个新选出的控制器通过ZooKeeper的条件递增操作获得一个全新的、数值更大的controller epoch。其他Broker在知道当前controller epoch后,如果收到由控制器发出的包含较旧epoch的消息,就会忽略它们,以防止脑裂。
比如当一个Leader副本分区所在的Broker宕机,需要选举新的Leader副本分区,有可能两个具有不同纪元数字的控制器都选举了新的Leader副本分区,如果选举出来的Leader副本分区不一样,听谁的?脑裂的时候,有纪元数字,直接使用纪元数字最新的控制器结果。
在这里插入图片描述
当控制器发现一个Broker离开集群,那些失去Leader副本分区的Follower分区需要一个新的Leader。

控制器宕机

此时有些问题需要考虑:

  • 控制器需要知道哪个Broker宕机了?
  • 控制器需要知道宕机的Broker上负责的时候哪些分区的Leader副本分区?

下图中,/brokers/ids/0 保存着Broker的信息,此节点为临时节点,如果Broker节点宕机,该节点丢失。
集群控制器负责监听ids节点,一旦节点子节点发生变化,集群控制器就会得到通知。
在这里插入图片描述

  • 控制器遍历这些Follower副本分区,并确定谁应该成为新的Leader分区,然后向所有包含新Leader分区和现有Follower的Broker发送请求。
  • 该请求消息包含了谁是新的Leader副本分区以及谁是Follower副本分区的信息,随后,新Leader分区开始处理来自生产者和消费者的请求,而跟随者开始从新Leader副本分区消费消息。
  • 当控制器发现一个Broker加入集群时,它会使用BrokerId来检查新加入的Broker是否包含现有分区的副本。如果有,控制器就把变更通知发送给新加入的Broker和其他Broker,新Broker上的副本分区开始从Leader分区那里消费消息,与Leader分区保持同步。

最后结论

  • Kafka使用ZooKeeper的分布式锁选举控制器,并在节点加入集群或退出集群时通知控制器
  • 控制器负责在节点加入或离开集群时进行分区Leader选举
  • 控制器使用epoch来避免脑裂(脑裂是指两个节点同时认为自己是当前的控制器)

可靠性保证

基本概念

  • 创建Topic的时候可以指定 --replication-factor 3,表示分区的副本数,不要超过Broker的数量。
  • Leader是负责读写的节点,而其他副本则是Follower。Producer只把消息发送到Leader,Follower定期到Leader上PULL数据
  • ISR是Leader负责维护的与其保持同步的Replica列表,即当前活跃的副本列表。如果一个Follower落后太多,Leader会把它从ISR中移除。
  • 落后太多是指该Follower复制的消息Follower长时间没有向Leader发送fetch请求(replica.lag.time.max.ms 默认值 10000)
  • 为了保证可靠性,可以设置 acks=all,Follower收到消息后,会向leader发送ACK,一旦Leader收到ISR中所有Replica的ACK,Leader就Commit,那么Leader就向Producer发送ACK。

副本的分配

当某个Topic的–replication-factor为N(N>1)时,每个Partition都有N个副本,称作Replica,原则上是将Replica均匀地分配到整个集群上,不仅如此,Partition的分配也同样需要均匀分配,为了更好的负载均衡。

副本分配的三个目标:

  • 均衡的将副本分撒于各个Broker上
  • 对于某个Broker上分配的分区,尽量将分区的各个副本分配到不同的机架上的Broker。
  • 如果所有的Broker都有机架信息,尽量将分区的各个副本分配到不同的机架上的Broker

在不考虑机架信息的情况下:

  • 第一个副本分区通过轮询的方式挑选一个Broker,进行分配。该轮询从Broker列表的随机位置进行轮询
  • 其余副本通过增加偏移进行分配

在这里插入图片描述

失效的副本

失效副本判定

replica.lag.time.max.ms 默认大小为 10000
当ISR中的一个Follower副本滞后Leader的时间超过参数设置之后,则判断副本失效,需要将此Follower副本踢出ISR。

实现原理

具体的实现原理:当Follower副本将Leader副本的LEO之前的日志全部同步时,则认为该Follower副本已经追赶上了Leader副本,此时更新该副本的lastCaughtUpTimeMs标识。
Kafka的副本管理器(ReplicaManager)启动时会启动一个副本过期检测的定时任务,而这个定时任务会定时检查当前时间与副本的lastCaughtUpTimeMs差值是否大于参数replica.lag.time.max.ms指定的值。

Kafka的源码注释中也说了一般有两种情况会导致副本失效:

  • Follower副本进程卡住,在一段时间内没有向Leader副本发起同步请求,比如频繁的FULL GC。
  • Follower副本进程同步过慢,在一段时间内都无法追赶上Leader副本,比如IO开销过大。

如果通过工具增加副本因子,那么新增加的副本在赶上Leader副本之前也都是失效状态的。
如果一个Follower副本由于某些原因(宕机)而下线,之后又上线,在追赶上Leader副本之前也是处于失效状态。

如何查看

失效副本的分区个数是用于衡量Kafka性能指标的重要部分。Kafka本身提供了一个相关的指标,即UnderReplicatedPartitions,可以通过JMX访问:

  • kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions 取值范围是大于等于0的整数,需要注意,如果Kafka集群正在做分区迁移(kafka-reassign-partition.sh)的时候,这个值也会大于0。

副本复制

日志复制算法(lgo replication algorithm)必须提供的基本保证是,如果它告诉客户端消息已经被提交,而当前Leader出现故障,新选出的Leader也必须具有该消息,在出现故障时,Kafka会从挂掉Leader的ISR里面选择一个Follower作为这个分区新的Leader。
每个分区的Leader会维护一个 in-sync replica(同步副本列表,又称ISR)。当Producer向Broker发送消息,消息先写入到对应的Leader分区,然后复制到这个分区的所有副本中。ACKS=ALL时,只有将消息成功复制到所有同步副本(ISR)后,这条消息才算被提交。

什么情况会失去同步

一个副本与Leader失去同步的原因有很多,主要包括:

  • 慢副本(Slow Replica):Follower replica 在一段时间内一直无法赶上Leader的写进度,造成这种情况的最常见原因之一是Follower replica上的 IO瓶颈,导致它持久化日志的时间比它从Leader消费时间要长
  • 卡住副本(Stuck Replica):Follower replica 在很长一段时间内停止从Leader获取消息,这可能是因为GC停顿,或者副本故障
  • 刚启动副本(Bootstrapping replica):当用户给某个主题增加副本因子时,新的Follower replicas是不同步的,直到它跟上

Leader日志

当副本落后于Leader分区时,这个副本被认为是不同步或者滞后的,在Kafka中,副本的滞后于Leader是根据replica.lag.tiime.max.ms来衡量。

如何确认某个副本滞后

通过replica.lag.time.max.ms来检测卡住的副本(Stuck replica)在所有情况下都能很好的工作,它跟踪Follower副本没有向Leader发送获取请求的时间,通过这可以推断Follower是否正常。另一方面,使用消息数量检测不同步慢副本(Slow replica)的模型只有在为单个主题或者具有同类流量模式的多个主题设置这些参数时才能很好的工作,但我们发现它不能扩展到生产集群中所有主题。

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

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

相关文章

【Linux】Linux环境基础开发工具使用之软件包管理(yum)与 Linux编辑器(vim)

目录 一、Linux 软件包管理器 yum1.1 什么是软件包1.2 关于 rzsz1.3 查看软件包1.4 如何安装软件1.5 如何卸载软件1.6 如何更新软件包1.7 yum源更新 二、 Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 vim命令模式命令集2.3.1 从命令模式切换为插入模式2.3.2 从插…

03创建型设计模式——抽象工厂模式

一、抽象工厂模式简介 抽象工厂模式是所有形态的工厂模式中最为抽象和具有一般性的。抽象工厂模式可以向客户端提供一个接口&#xff0c;使得客户端在不必指定产品的具体类型的情况下&#xff0c;能够创建多个产品族的产品对象。例如现实生活中&#xff0c;水果的种类繁多&…

Vue3+Ts项目中经常遇到导入组件,vscode报无法找到模块xxx,xxx隐式拥有 “any“ 类型解决办法~

1、报错截图&#xff1a; 2、解决办法&#xff1a;在确保路径正确的情况下&#xff0c;你会在 src 目录下找到一个名为 env.d.ts 的文件&#xff08;或者类似的名称&#xff09;。在这个文件中&#xff0c;你可以声明 .vue 文件的模块类型。例如&#xff1a;(这告诉 TypeScript…

系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

虚拟内存 虚拟内存是一种操作系统提供的机制&#xff0c;用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存&#xff0c;操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下&#xff0…

IDEA打开持久层的代码很卡,关掉mybatis-plus的插件

不知道大家有没有遇到过打开 mapper 层的页面&#xff0c;然后要切换另外 java 文件的时候很卡&#xff0c;我遇到过卡了好几分钟的&#xff0c;那种继承了 mybatis-plus 的 mapper java文件或者 xml 文件都会&#xff0c;我后来把 mybatis 的插件关掉了&#xff0c;就不会了

LVS的12种调度算法详解

1.lvs调度算法类型 1.1静态方法 仅根据算法本身进行调度&#xff0c;不考虑RS的负载情况 1.2动态方法 主要根据每RS当前的负载状态及调度算法进行调度Overheadvalue较小的RS将被调度 1.1lvs静态调度算法 1.1.1RR&#xff08;轮询算法&#xff09;&#xff1a; roundrobin 轮…

Haproxy状态页

HAProxy 的状态页是一个非常有用的监控和诊断工具&#xff0c;它提供了关于 HAProxy 服务器运行状态的详细信息&#xff0c;通过web界面&#xff0c;显示当前HAProxy的运行状态。 状态页通常包含以下关键信息&#xff1a; 前端&#xff08;Frontend&#xff09;和后端&#x…

从TiDB迁移到OceanBase的实践分享

本文来自OceanBase热心用户的分享 近期&#xff0c;我们计划将业务数据库从TiDB迁移到OceanBase&#xff0c;但面临的一个主要挑战是如何更平滑的完成这一迁移过程。经过研究&#xff0c;了解到OceanBase提供的OMS数据迁移工具能够支持从TiDB到OceanBase的迁移&#xff0c;并且…

js构造函数的prototype赋值总结

我们知道通过构造函数的prototype,可以生成让所有实例对象访问的通用属性和方法,下面通过代码来解释这个过程 function Person(name){this.name name; }Person.prototype.sex man我们定义了一个构造函数Person,然后给它的prototype添加了一个sex的属性,下面我们来看看Person…

OSPF进阶

一、LSA详解 Type&#xff1a;LSA的类型&#xff08;1、2、3、4、5、7类&#xff09; link-state-ID&#xff1a;链路状态表示符 ADV router&#xff1a;产生该LSA的路由器 age&#xff1a;老化时间 Metric&#xff1a;开销值&#xff0c;一般都为ADV router到达该路由的开…

人工智能,代跑通,预测模型,模型优化

人工智能&#xff0c;代跑通&#xff0c;预测模型&#xff0c;模型优化&#xff0c;增加模块&#xff0c;文章复现&#xff0c;python代做&#xff0c;预测&#xff0c;微调&#xff0c;融合&#xff0c;深度学习&#xff0c;机器学习程序代写&#xff0c;环境调试&#xff0c;…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led-寄存器编程

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…

攻防世界-web-ctf-upload

题目场景 查看源码 毫无有效的数据 官方WriteUp 本题需要利用文件上传漏洞点&#xff0c;通过绕过服务器的安全防护&#xff0c;达到getshell的目的 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 这里需要绕过的点如下 检查文件内容是否有php字符串 检查…

haproxy七层代理

目录 一、haproxy简介 二、haproxy实验 1.环境部署 2.haproxy的基本部署方法及负载均衡的实现 2.1安装软件 2.2haproxy的基本配置 3.haproxy的全局配置参数及日志分离 3.1多线程设定 3.2自定义日志 4.haproxy-proxies中的常用配置参数 4.1设置backup --- sorryserver…

卷积神经网络(李宏毅老师系列)

自学参考&#xff1a; 一文搞懂卷积神经网络&#xff08;CNN&#xff09;的原理 视频课 课件资料 笔记 一、引入 cnn设计灵感来自于生物学中的视觉系统&#xff0c;旨在模拟人类视觉处理的方式。常用场景&#xff1a;image classification 基本步骤&#xff1a; 把所有图片都先…

数据结构--第六天

--树 -树的基本概念 树结构通常用来储存逻辑关系为“一对多”的数据&#xff0c;例如&#xff1a; 上图的这些元素具有的就是 "一对多" 的逻辑关系&#xff0c;例如元素A同时和B、C、D有关系&#xff0c;元素D同时和A、H、I、J有关系等。 观察这些元素之间的逻辑关…

模拟经营之神:《北境之地》安卓手机游戏,免费分享

《北境之地》&#xff08;Northgard&#xff09;是一款以北欧神话为背景的即时战略游戏&#xff0c;由Shiro Games开发。玩家在游戏中扮演维京部落的领袖&#xff0c;目标是探索新大陆、建立据点、管理资源&#xff0c;并在严酷的冬季和敌人的威胁下生存下来 。 游戏特色包括&a…

gin路由

1主文件 package main import ("github.com/gin-gonic/gin""godade/user""net/http" ) func main() {router : gin.Default()router.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello World")})v1 : router…

如何避免项目发布后用户从浏览器WebPack中看到源码

打包前在config->index.js中设置productionSourceMap为false productionSourceMap: false,

C# AI鉴图宝 利用OCR技术对违规图片进行判别

目录 效果 项目 代码 下载 效果 项目 代码 using Aspose.Cells; using NLog; using OpenCvSharp; using OpenVINO.OCRService; using Sdcb.OpenVINO; using Sdcb.OpenVINO.PaddleOCR; using Sdcb.OpenVINO.PaddleOCR.Models; using System; using System.Collections.Conc…