Kafka集群架构服务端核心概念
目录
Kafka集群选举
controller选举机制
Leader partition选举
leader partition自平衡
partition故障恢复机制
follower故障
leader故障
HW一致性保障
HW同步过程
Epoch
Kafka集群选举
1. 在多个broker中, 需要选举出一个broker, 担任controller. 由controller来管理整个集群中的分区和副本状态.
2. 在同一个topic下, 需要从多个partition中选举出一个leader节点, 来负责和客户端的交互, 优先写入, 同步给follower
controller选举机制
当集群kafka启动时, 所有的broker会尝试往zookeeper创建一个/controller的临时节点, 将自己的brokerid写入其中.zookeeper机制, 只会保证有一个broker写入成功, 成为controller.
由于是临时节点, zookeeper需要应用一直保持连接状态, 如果检测不到应用的心跳, zookeeper会删除临时节点, 同时会给监听该节点的客户端发送广播事件, 其他follower broker收到事件后, 会重新竞争controller.
客户端同时往zookeeper写入, 第一个写入成功(临时节点), 成为leader, 当leader挂掉, 临时节点被移除, 监听机制监听下线,重新竞争leader, 客户端也能监听最新leader
controller还会监听一些关键节点, 并推送给其他broker
- 监听Zookeeper中的/brokers/ids节点,感知Broker增减变化。
- 监听/brokers/topics,感知topic以及对应的partition的增减变化。
- 监听/admin/delete_topic节点,处理删除topic的动作。
Leader partition选举
一个topic的消息是由多个partition来存储的, 在用kafka-topics.sh创建topic时, 可以通过参数--partitions指定partition数量, 通过--replication-factors参数指定每个Partition有几个备份. 在一个partition的备份中, 会选举出一个leader, 来负责和客户端的交互, 以及同步数据给follower节点
partition参数:
- AR: Assigned Replicas, 分区中的所有副本, 包括存活和不存活
- ISR: 服务正常, 能够与leader保持通信的Follower副本
- OSR: 从ISR踢出的节点, 有问题或延迟过多的副本

选举过程: Replicas中越靠前越优先选取, 并且存在ISR, 也就是正常的服务, 被选为leader
leader partition自平衡
经过partiton选举, 可能造成大量leader存在同一个broker节点, 导致该broker压力明显大于其他broker, 影响集群性能. 为此,Kafka设计了Leader Partition自动平衡机制,当发现Leader分配不均衡时,自动进行Leader Partition调整。
kafka选举, 会把AR当中的第一个节点就应该是Leader节点。这种选举结果成为preferred election 理想选举结果。Controller会定期检测集群的Partition平衡情况,在开始检测时,Controller会依次检查所有的Broker。当发现这个Broker上的不平衡的Partition比例高于leader.imbalance.per.broker.percentage阈值时,会触发一次Leader Partiton的自平衡。也可以手动执行kafka-leader-election.sh脚本触发自平衡.
注意: Leader partition自平衡是一个很重的操作, 涉及大量消息转移和同步, 并且可能会丢消息. 在对性能要求较高的系统, 可以关闭自平衡, 设置auto.leader.rebalance.enable=false, 在业务不繁忙时候, 运维手动执行自平衡命令, 提高可用性.
partition故障恢复机制
当一组Partition中选举出了一个Leader节点后,这个Leader节点就会优先写入并保存Producer传递过来的消息,然后再同步给其他Follower。当Leader Partition所在的Broker服务发生宕机时,Kafka会触发Leader Partition的重新选举。Kafka为了保证消息能够在多个Parititon中保持数据同步,内部记录了两个关键参数
- Leo: 每个Partition的最后一个Offset
- HW: 一组Partiton中最小的LEO
partition每收到一条生产者发送的消息, LEO就会+1, follower从leader同步过来一条消息, LEO也会+1. follower从leader同步消息时, 会把自己的LEO传给leader, leader就会统计最小值, 同步给所有follower.
leader认为HW以前的消息, 也就是所有副本都存在的消息才是安全的, 可以被消费者拉取消费. 而HW之前的消息, 可能会丢失, 被认为不安全的.当一条消息发送到leader, 不会立刻让消费者感知, 而是等follower同步, 推进HW, 当HW大于消息时, 消费者才能消费,

follower故障
如果是Follower发生故障,这不会影响消息写入,只是少了一个备份
处理流程:
- 将故障的follower节点踢出ISR, 其他leader和follower正常工作
- 当故障follower恢复时, 不会立即加入ISR, 而且先同步消息, 把本地记录上一次HW, 并把大于HW的消息丢弃, 去leader同步消息
- 该follower的LEO大于partition的HW时, 假如ISR
leader故障
- 从ISR中选举出新的leader, 可能消息还未同步, 新leader的LEO小于老leader的LEO
- 其他follower会把大于HW的消息删除, 再从新leader同步消息
- 老leader恢复后, 会以follower身份加入, 也是先删大于HW, 再同步消息
HW一致性保障
HW同步过程
- follower先从leader拉取消息, 才能往leader上报LEO
- 当所有follower都上报后, leader才能计算HW值
- follower下一次拉取消息时, 才能更新HW
leader和follower的LEO是存在延迟的, 所以存在HW不一致问题. 当Leader切换时, HW不一致, follower按照自己的HW就行恢复数据, 可能造成数据不一致. Kafka设计Epoch来保证HW一致性
Epoch
Epoch由版本号和消息offset组成, 例如(1,100), 代表版本1, 一个单调递增的版本号, 当leader partiton发生变更时, 版本加一, 100表示当前partition写入第一条消息偏移量.
Broker会将这个epoch数据保存到内存中,并且会持久化到本地一个leader-epoch-checkpoint文件当中。leader-epoch-checkpoint会在所有Follower Partition中同步。当Leader Partition有变更时,新的Leader Partition就会读取这个Epoch记录,更新后添加自己的Epoch记录。
其他Follower Partition要更新数据时,不再靠自己记录的HW值判断拉取消息的起点, 而是根据最新的epoch来判断。
相关文章:
Kafka集群架构服务端核心概念
目录 Kafka集群选举 controller选举机制 Leader partition选举 leader partition自平衡 partition故障恢复机制 follower故障 leader故障 HW一致性保障 HW同步过程 Epoch Kafka集群选举 1. 在多个broker中, 需要选举出一个broker, 担任controller. 由controller来管理…...
【vscode插件】之插件图标设置
ChatgGPT4.0国内站点: 海鲸AI-支持GPT(3.5/4.0),文件分析,AI绘图 在Visual Studio Code中创建插件时,你可以为你的插件设置一个图标,这个图标会在VS Code的插件市场和插件侧边栏中显示。以下是设置插件图标的步骤: 准备…...
网络安全学习-NTFS安全权限、文件共享
NTFS安全权限 权限概述 设置NTFS权限,实现不同用户访问不同对象(文件、文件夹)的权限分配正确访问权限后,用户才能访问资源设置权限防止资源被篡改、删除 文件系统概述 文件系统就是这个分区的存储格式,不建立文件…...
如何使用GPT4写一篇综述
使用 GPT-4 或任何其他高级语言模型来撰写一篇综述文章,需要遵循一系列的步骤来确保内容的准确性、深度和组织性。以下是一些指导步骤: 确定主题和范围 明确你想要综述的主题。这可以是一个科学领域的特定方面、技术发展、理论进展等。 确定综述的范围和…...
【网络编程】基于UDP数据报实现回显服务器程序
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 前言 我们如果…...
Jenkins自动化构建打包,部署
1.环境准备 上传jdk,maven和tomcat的包,解压到/usr/local下并配置环境变量。 配置jdk [rootserver04 ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH##加载环境变量 [rootserver04 ~]# source /etc/profi…...
python画图【00】Anaconda和Pycharm和jupyter的使用
①Anaconda ②Pycharm 一、Anaconda安装步骤 1、双击安装包,点击next。 2、点我同意I agree 3、 4、选择需要安装的位置,位置可根据自己情况安装到具体位置,但要记住安装到了哪里。然后点击next 5、可选择加入到环境变量,…...
【hive】Hive中的大宽表及其底层详细技术点
简介: 在大数据环境中,处理大规模数据集是常见的需求。为了满足这种需求,Hive引入了大宽表(Large Wide Table)的概念,它是一种在Hive中管理和处理大量列的数据表格。本文将详细介绍Hive中的大宽表概念以及其底层的详细…...
铁死亡调控机制新发现——癌症篇
随着癌细胞对凋亡产生抗性,非细胞凋亡死亡模式的铁死亡成为对抗治疗耐药癌症的新策略,对传统疗法产生耐药性的细胞或转移性癌细胞已被证明对铁死亡的敏感性增加。因此,靶向癌症中的铁死亡调控元件可能提供新的治疗机会。 今年5月来自德国维尔…...
MySQL 数据库系列课程 05:MySQL命令行工具的配置
一、Windows启动命令行工具 (1)打开 Windows 的开始菜单,找到安装好的 MySQL,点击MySQL 8.0 Command Line Client - Unicode,这个带有 Unicode 的,是支持中文的,允许在命令行中敲中文。 &…...
LeetCode 2703. 返回传递的参数的长度
请你编写一个函数 argumentsLength,返回传递给该函数的参数数量。 示例 1: 输入:args [5] 输出:1 解释: argumentsLength(5); // 1 只传递了一个值给函数,因此它应返回 1。 示例 2: 输入&a…...
MySQL的聚簇索引和非聚簇索引的区别以及示例
MySQL的聚簇索引和非聚簇索引 聚簇索引 聚簇索引是一种索引结构,它与数据行存储在一起,即索引的叶子节点就是数据行本身。在MySQL中,主键索引就是一种典型的聚簇索引。 涉及情况 当查询需要按照主键或唯一索引进行精确查找时,…...
裸机开发(1)-汇编基础
文章目录 GNU汇编语法常用汇编指令处理器内部数据传输指令存储器访问指令压栈和出栈指令跳转指令算术指令逻辑运算指令实战 函数发生调用时,需要进行线程保护,简单来说,就是先进行压栈操作,将调用函数参数、返回值等存到R0-15寄存…...
解决log4j多个日志都写到一个文件
之前客户端程序由于Websockt包依赖的log4j,就用log4j写日志了,Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了,查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…...
YOLOv5 目标计数 | 图片上绘制计数结果
修改方法: 只需要改 detect.py for path, im, im0s, vid_cap, s in dataset: 下新增一行 class_counts = {} class_counts[int(c)] = class_counts.get(int(c...
【网络安全/CTF】unseping 江苏工匠杯
该题考察序列化反序列化及Linux命令执行相关知识。 题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($thi…...
鼠标悬浮在树组件节点上展示当前节点名称
方法一:使用CSS样式 在树组件的模板中,为每个节点的外层元素绑定一个类名,例如"tree-node",并设置一个自定义属性来保存节点名称。 <el-tree v-if"showCheck" ref"treeRef" :data"treeDa…...
构建创新学习体验:企业培训系统技术深度解析
企业培训系统在现代企业中发挥着越来越重要的作用,它不仅仅是传统培训的延伸,更是技术创新的结晶。本文将深入探讨企业培训系统的关键技术特点,并通过一些简单的代码示例,展示如何在实际项目中应用这些技术。 1. 前端技术&#…...
云计算:现代技术的基本要素
众所周知,在儿童教育的早期阶段,幼儿园都会传授塑造未来行为的一些基本准则。 今天,我们可以以类似的方式思考云计算:它已成为现代技术架构中的基本元素。云现在在数字交互、安全和基础设施开发中发挥着关键作用。云不仅仅是另一…...
(1)(1.11) SiK Radio v2(一)
文章目录 前言 1 概述 2 特点 3 状态LED灯 前言 SiK 遥测无线电是在自动驾驶仪和地面站之间建立遥测连接的最简单方法之一。本文提供了如何连接和配置无线电的基本用户指南。 3DR Radio v2(SiKRadio 的消费者版本) !Note 本页面以前的…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
