Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine
PartitionLeaderSelector
通过对前面的分析可知,PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现,PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。
图展示了PartitionLeaderSelector的实现类,这五个不同的实现提供了不同的策略。PartitionLeaderSelector接口的定义如下:

NoOpLeaderSelector是其中最简单的实现,它并没有进行Leader选举,而是将currentLeaderAndlsr直接返回,需要接收LeaderAndIsrRequest的Broker则是分区的AR集合。代码就不贴出来了。
OfflinePartitionLeaderSelector会根据currentLeaderAndlsr选举新的Leader和ISR集合,策略如下:
- 如果在ISR集合中存在至少一个可用的副本,则从ISR集合中选择新的Leader副本,当前ISR集合为新ISR集合。
- 如果ISR集合中没有可用的副本且“Unclean leader election”配置被禁用,那么就抛出异常。
- 如果“Unclean leader election”被开启,则从AR集合中选择新的Leader副本和ISR集合。
- 如果AR集合中没有可用的副本,抛出异常。
对于剩余的PartitionLeaderSelector实现,这里只介绍其策略。
PreferredReplicaPartitionLeaderSelector的策略是:如果“优先副本”可用且在ISR集合中,则选取其为Leader副本,当前的ISR集合为新的ISR集合,并向AR集合中所有可用副本发送LeaderAndIsrRequest,否则会抛出异常。
ReassignedPartitionLeaderSelector涉及到副本的重新分配,副本重新分配的相关概念后面详细分析,这里先简单了解ReassignedPartitionLeaderSelector的策略:选取的新Leader副本必须在新指定的AR集合中且同时在当前ISR集合中,当前ISR集合为新ISR集合,接收LeaderAndIsrRequest的副本是新指定的AR集合中的副本。
ControlledShutdownLeaderSelector的策略是:从当前ISR集合中排除正在关闭的副本后作为新的ISR集合,从新ISR集合中选择新的Leader,需要向AR集合中可用的副本发送LeaderAndIsrRequest。
ReplicaStateMachine
ReplicaStateMachine是Controller Leader用于维护副本状态的状态机。副本状态由ReplicaState接口表示,它有七个子类,分别代表了副本的七种不同的状态,如表所示。

ReplicaState之间的转换如图所示。下面介绍各个ReplicaState状态之间转换时需要完成的相关操作。
- NonExistentReplica →NewReplica Controller向此副本所在Broker发送LeaderAndIsrRequest,并向集群中所有可用的Broker发送UpdateMetadataRequest。
- NewReplica →OnlineReplicaController将NewReplica加入到AR集合中。
- OnlineReplica,OfflineReplica→OnlineReplica
Controller向此副本所在的Broker发送LeaderAndIsrRequest,并向集群中所有可用的Broker发送UpdateMetadataRequest。
- NewReplica,OnlineReplica,OflineReplica,ReplicaDeletionIneligible →OffineReplica
Controller向副本所在Broker发送StopReplicaRequest,之后会从ISR集合中清除此副本,最后向其他可用副本所在的Broker发送LeaderAndIsrRequest,并向集群中所有可用的Broker发送UpdateMetadataRequest。 - OffineReplica→ReplicaDeletionStarted
Controller向副本所在Broker发送StopReplicaRequest。 - ReplicaDeletionStarted →ReplicaDeletionSuccessful只做状态转换,并没有其他操作。
- ReplicaDeletionStarted →ReplicaDeletionIneligible只做状态转换,并没有其他操作。
- ReplicaDeletionSuccessful →NonExistentReplicaController从AR集合中删除此副本。

在ReplicaStateMachine中也有controllerContext、zkUtils、brokerRequestBatch字段,它们的功能与PartitionStateMachine中的同名字段相同,ReplicaStateMachine剩余的字段如下所述。
- replicaState:Map[PartitionAndReplica,ReplicaState]类型,记录每个副本对应的ReplicaState状态。
- brokerChangeListener:ZooKeeper的监听器,用于监听Broker的变化,例如Broker宕机或重新上线等事件。
ReplicaStateMachine启动时会对replicaState集合进行初始化,并调用handleStateChanges()方法尝试将可用副本转换为OnlineReplica状态。
相关文章:
Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine
PartitionLeaderSelector 通过对前面的分析可知,PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现,PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…...
总结11(数组)
数组 1.为什么需要数组 为了解决大量同类型数据的存储和使用问题 为了模拟现实世界 2. 数组的分类 一维数组 1).怎样定义一维数组 为n个变量连续分配存储空间。 所有的变量数据类型必须相同。 所有变量所占的字节大小必须相等。 例子: int a[5]; &#x…...
扩展学习|大数据分析整合到价值创造的大见解
文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/14IGaCOc-plxAiaVhwOgUvA 提取码…...
蓝桥杯---牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后…...
【Linux】VMware Workstation16安装银河麒麟高级服务器操作系统V10 SP3 AMD64
目录 一、麒麟服务器概述 二、安装步骤 设置硬盘大小 完成配置 修改内存 处理器等设备配置 选择直接安装 配置磁盘 网络配置 设置root账号密码 开始安装 启动完成 一、麒麟服务器概述 银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云…...
中国的茶文化:历史、传统与生活
中国的茶文化:历史、传统与生活 一、引言 茶,这一神奇而古老的饮品,与中国的历史、文化和生活方式紧密相连。中国的茶文化,源远流长,博大精深,是中华文明的重要组成部分。它不仅是一种饮料,更是…...
Oracle函数使用
ROW_NUMBER函数 ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY column2 DESC) -- 根据column1分组按column2降序排序生成序号,序号由小到大,会生成一个唯一的序号 -- 例如column2中有两列值都为1,那他们的序号会有一个在上一个在下ROW_NUMBER() OVER(ORDER BY …...
正则表达式与文本三剑客
目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式(脚本语法) 2.…...
C语言中的数组操作技巧:提升程序的效率和可读性
1. 概念 数组是C语言中常见且重要的数据结构,在许多应用中都被广泛使用。合理地处理数组操作可以提高程序的效率和可读性。本文将介绍C语言中常用的数组操作方法和技巧,帮助读者优化数组操作并提升程序效果。 2.常用的数组操作方法 2.1 数组的初始化 C…...
202 快乐数
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,…...
html css javascript写一个扫雷
文章目录 一、html css javascript写一个扫雷二、JavaScript三、HTML四、CSS五、热门文章 一、html css javascript写一个扫雷 一个简单的使用HTML、CSS和JavaScript编写的扫雷游戏的示例代码: <!DOCTYPE html> <html> <head><title>扫雷…...
Unity3D正则表达式的使用
系列文章目录 unity工具 文章目录 系列文章目录前言一、匹配正整数的使用方法1-1、代码如下1-2、结果如下 二、匹配大写字母2-1、代码如下1-2、结果如下 三、Regex类3-1、Match()3-2、Matches()3-3、IsMatch() 四、定义正则表达式…...
SpringBoot,TDengine时序数据库,实现物联网,车联网大批量数据更新最佳实践。
简介 TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,对业务运行状态进行实时监测、预警,提供实时的商业洞察。其…...
【CSS】常见
一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题:display:flex 和 ellipsis 冲…...
Django实战
一、开发登录表单 def login_form(request):html <html><body><form method"post">用户名:<input name "username" type"text"></input></br>密码:<input name "password" type…...
redis(1)
文章目录 一、redis基础redis简介redis 特性单线程redis 对比 memcachedredis 典型应用场景 二、redis安装及连接yum安装redis查看yum仓库redis版本yum安装 redis 编译安装 redis编译安装前台启动redis启动多实例解决启动时的三个警告提示创建 redis 用户编辑 redis 服务器启动…...
【RTP】webrtc 学习2: webrtc对h264的rtp打包
切片只是拷贝帧的split的各个部分到新的rtp 包的封装中。并没有在rtp包本身标记是否为关键帧FU-A 切片 输入的H.264 数据进行split :SplitNalu SplitNalu : 按照最大1200字节进行切分 切分后会返回一个数组 对于FU-A :split的数据总大小是 去掉一个字节的nalu header size …...
【搜索术】代码阅读理解学习笔记
学习资料 《理解源代码》 1 静态阅读 1.1 目标结构 常见目录名含义docs项目文档examples示例代码...
vue 打包下载多层zip文件
npm install jszip npm install file-saverimport JSZip from "jszip"; import FileSaver from "file-saver"; import {Message} from "view-design";/*** 下载文件 传数组* fileList* [* {* type:file,* name:17034953113790548.png,…...
Flink实战五_状态机制
接上文:Flink实战四_TableAPI&SQL 在学习Flink的状态机制之前,我们需要理解什么是状态。回顾我们之前介绍的很多流计算的计算过程,有些计算方法,比如说我们之前多次使用的将stock.txt中的一行文本数据转换成Stock股票对象的ma…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
