当前位置: 首页 > news >正文

大数据-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)的模型只有在为单个主题或者具有同类流量模式的多个主题设置这些参数时才能很好的工作,但我们发现它不能扩展到生产集群中所有主题。

相关文章:

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

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

c# 什么是扩展方法

官方解释 扩展方法使你能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法&#xff0c;但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码&#x…...

全屏组件封装(react18+antd)

基于reactts封装的公用全屏组件 1、封装组件 在components下面构建FullScreenButton文件&#xff1a; FullScreenButton/index.tsx import React, { useState, useCallback, useEffect } from "react"; import { FullscreenOutlined, FullscreenExitOutlined } fr…...

wordpress全局自适应网址导航整站打包源码,含主题和数据库

wordpress全局自适应网址导航整站打包源码&#xff0c;含主题和数据库。直接恢复就可以使用了。 这个是自适应的布局设计&#xff0c;体验还不错。用网址导航是可以的。 代码免费下载&#xff1a;百度网盘...

PyTorch深度学习框架

最近放假在超星总部河北燕郊园区实习&#xff0c;本来是搞前后端开发岗位的&#xff0c;然后带我的副总老大哥比较关照我&#xff0c;了解我的情况后得知我大三选的方向是大数据&#xff0c;于是建议我学学python、Hadoop&#xff0c;Hadoop我看了一下内容比较多&#xff0c;而…...

Python和AI库NumPy(二):数组创建与操作

目录 1. 数组创建 1.1 基本数组创建 1.2 使用内置函数创建数组 1.3 特殊数组的创建 2. 数组的基本操作 2.1 数组属性 2.2 数组索引和切片 2.3 数组的形状操作 2.4 数组拼接与分割 3. 数组的数学操作 3.1 基本算术操作 3.2 广播机制 3.3 线性代数运算 4. 高级数组…...

GD32 SPI驱动代码

1.0 软件驱动NOR FLASH MOSI&#xff1a;主机发送&#xff0c;从机接收 MISO&#xff1a;主机接收&#xff0c;从机发送 CS&#xff1a;表示的是片选信号 2.0 宏定义各个引脚 // 片选 #define SET_SPI_NSS() gpio_bit_set(GPIOE,GPIO_PIN_2) #define CLR_SPI_NSS() gpio_…...

Qgis 开发初级 《数据库和图层》

Qgis 可以加载很多数据源&#xff0c;像shapefile 文件&#xff0c; gdb文件等&#xff0c;还可以直接链接企业数据库。在这里&#xff0c;我只介绍比较常用的本地数据库 gdb。gdb 是esri 开发的数据库&#xff0c;gdb数据库不是开源的&#xff0c;qigs用了OpenFileGdb的驱动读…...

三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn

目录 前言 概述 TensorFlow PyTorch Scikit-Learn 总结 前言 本篇旨在深入探讨三种主流机器学习框架——TensorFlow、PyTorch与Scikit-Learn。随着数据科学和人工智能领域的快速发展&#xff0c;这些框架已成为构建和部署机器学习模型的关键工具。鉴于每种框架的特点和优…...

Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE

近日&#xff0c;研究人员发现 Apache OFBiz 中存在一个新的关键漏洞&#xff0c;该漏洞是 Apache OFBiz 中的一个错误授权问题&#xff0c;被追踪为CVE-2024-38856。该漏洞影响 18.12.14 之前的版本&#xff0c;18.12.15 版本解决了该漏洞。 SonicWall 的安全研究员 Hasib Vh…...

SpringCloud 微服务nacos和eureka

Spring是微服务架构&#xff0c;是一种经过良好架构设计的分布式架构方案。 微服务架构有如下特性 单一&#xff1a;微服务拆分粒度小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务开发 面向服务&#xff1a;微服务对外暴漏…...

Java学习篇(一)| 如何生成分布式全局唯一ID

Java学习篇&#xff08;一&#xff09;| 如何生成分布式全局唯一ID 一、使用场景二、常用方法1、UUID &#xff08;尽量不要用&#xff09;2、数据库自增 &#xff08;用的最多-但不适合做分布式ID&#xff09;3、Redis 生成ID &#xff08;可用&#xff09;1、原因2、通过代码…...

c++ 弹窗办法

在C中&#xff0c;创建弹窗的方法有多种。下面我会逐一介绍几种常见的方法&#xff0c;并提供相应的代码示例。 使用Windows API创建弹窗 使用Windows API可以创建原生的Windows弹窗。前面已经提供了一个示例代码&#xff0c;下面我会逐步解释该代码的关键部分&#xff1a; …...

小程序使用this.animate实现3维动画切换

小程序使用this.animate实现3维动画切换 这里以三张图片为例 话不多说&#xff0c;直接上代码 wxml <view class"container"><view class"carousel" id"carousel_id"><view class"box" wx:for"{{items}}"…...

【区块链+社会公益】第一反应互助急救链 | FISCO BCOS应用案例

第一反应互助急救链将现有业务体系和系统与 FISCO BCOS 的区块链底层技术相结合&#xff0c;使得公益行为及其证据、 积分、奖励过程以区块链的方式进行记录&#xff0c;确保公正、透明、不可篡改。此外&#xff0c;项目将赛事保障、公益急救培训、 社区互助急救、AED 勘察等社…...

leetcode 136. 只出现一次的数字

https://leetcode.cn/problems/single-number/description/?envTypestudy-plan-v2&envIdtop-interview-150 136. 只出现一次的数字 已解答 简单 相关标签 相关企业 提示 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出…...

可扩展架构设计:策略与最佳实践

在快速变化的数字世界中&#xff0c;构建可扩展的架构设计已经成为企业成功的关键因素之一。随着业务规模的不断扩大&#xff0c;系统需求也随之增加&#xff0c;因此&#xff0c;能够灵活适应变化的系统架构变得尤为重要。本文将详细介绍可扩展架构设计的核心概念、重要性以及…...

一图胜千言|图解Pandas常用操作!

Pandas 展示 请看下表: 它描述了一个在线商店的不同产品线&#xff0c;共有四种不同的产品。与前面的例子不同&#xff0c;它可以用NumPy数组或Pandas DataFrame表示。但让我们看一下它的一些常见操作。 1. 排序 使用Pandas按列排序更具可读性&#xff0c;如下所示: 这里arg…...

ue5正确导入资源 content(内容),content只能有一个

把资源content下的东西&#xff0c;全部拷贝&#xff0c;放在项目的content下 content只能有一个...

HTTP协议基础知识【后端 4】

HTTP协议基础知识 HTTP&#xff08;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;它定义了客户端&#xff08;如浏览器&#xff09;与服务器之间数据传输的格式和规则。无论是浏览网页、在线购物还是使…...

Phi-3-mini-4k-instruct-gguf一文详解:GGUF格式优势与Phi-3系列轻量设计哲学

Phi-3-mini-4k-instruct-gguf一文详解&#xff1a;GGUF格式优势与Phi-3系列轻量设计哲学 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型&#xff0c;采用GGUF格式封装。这个模型特别适合处理问答、文本改写、摘要整…...

小红书数据采集实战:5个Python技巧让爬虫更智能

小红书数据采集实战&#xff1a;5个Python技巧让爬虫更智能 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 在小红书这个拥有数亿用户的社交电商平台上&#xff0c;海量的用…...

【限时开源】Polars 2.0清洗模板库V1.0发布:含金融时序对齐、电商ID映射、日志正则归一化等9大高复用Pipeline

第一章&#xff1a;Polars 2.0大规模数据清洗技巧入门到精通教程 Polars 2.0 是专为高性能、内存安全与并行计算设计的 DataFrame 库&#xff0c;其惰性执行引擎与零拷贝语义使其在处理 GB 级别结构化数据时显著优于 Pandas。本章聚焦真实场景下的数据清洗实践&#xff0c;涵盖…...

STM32智能剪枝机:嵌入式系统与传感器集成实践

1. 项目背景与需求分析作为一名从事嵌入式开发多年的工程师&#xff0c;我最近完成了一个基于STM32的智能绿化带剪枝机项目。这个项目的初衷源于我在城市公园散步时的观察&#xff1a;园艺工人手持笨重的剪枝工具&#xff0c;在烈日下长时间弯腰作业&#xff0c;不仅效率低下&a…...

OpenClaw性能优化:千问3.5-9B模型加速30%的秘诀

OpenClaw性能优化&#xff1a;千问3.5-9B模型加速30%的秘诀 1. 为什么需要优化OpenClaw性能 第一次用OpenClaw执行自动化任务时&#xff0c;我遇到了一个尴尬的问题——点击"整理桌面文件"指令后&#xff0c;系统整整思考了15秒才开始移动第一个文件。这种延迟在简…...

PasteMD用户调研报告:2024年文档格式转换需求分析

PasteMD用户调研报告&#xff1a;2024年文档格式转换需求分析 1. 调研背景与核心发现 最近整理了500份来自不同行业用户的实际反馈&#xff0c;这些反馈不是问卷里的标准答案&#xff0c;而是真实工作场景中留下的痕迹——有深夜赶论文时的抱怨截图&#xff0c;有项目汇报前的…...

大厂高薪抢手!文科生如何抓住AI时代机遇,实现职业逆袭?

大厂纷纷高薪招聘文科生&#xff0c;引发社会关注。文科生凭借沟通、叙事、逻辑等优势&#xff0c;在大模型理解人类价值观、企业品牌宣传等方面发挥作用。高校也调整专业设置&#xff0c;培养跨学科人才。文章建议文科生根据自身专业&#xff0c;向文案策划、品牌宣传、法务、…...

深入Fly-By拓扑:为什么你的LPDDR4必须做Write Leveling?一次讲清时钟与数据对齐的核心原理

深入Fly-By拓扑&#xff1a;为什么你的LPDDR4必须做Write Leveling&#xff1f;一次讲清时钟与数据对齐的核心原理 在4266 Mbps的高速数据传输场景下&#xff0c;LPDDR4内存子系统如同一条需要精确调谐的八车道高速公路。当信号传输速率突破4GT/s时&#xff0c;皮秒级的时序偏差…...

102. 在控制平面主机名更改后恢复 Rancher 配置的 RKE2 集群

Environment 环境 Rancher provisioned RKE2 downstream cluster control plane node hostname changed, without removing the node from the cluster. Rancher 配置了 RKE2 下游集群控制平面节点的主机名更改&#xff0c;但未将该节点从集群中移除。 Procedure 程序It is …...

别再乱选ASCII/HEX了!野火串口调试助手发送接收区配置详解(附实战案例)

串口通信调试实战&#xff1a;ASCII与HEX模式的选择艺术 调试智能家居设备时&#xff0c;你是否遇到过发送"ON"指令毫无反应&#xff0c;接收区却显示一堆乱码的尴尬&#xff1f;这往往不是设备故障&#xff0c;而是串口调试中最常见的模式选择错误。作为嵌入式开发者…...