kafka-高可用设计详解(集群架构、备份机制、消费者组、重平衡)

在这里插入图片描述

文章目录

  • kafka高可用设计
  • 集群架构
  • Kafka集群选举
    • ISR与OSR
    • LEO和HW
    • Kafka分区Leader选举
      • Leader Replica选举策略
      • Leader Replica选举过程
  • 副本机制(Replication)
  • 消费者组和再均衡
      • 消费者组
      • 再均衡(重平衡)

更多相关内容可查看

kafka高可用设计

Apache Kafka 的高可用设计主要通过以下几个方面来实现:

  • 副本机制(Replication):在 Kafka 中,每个 partition 都有多个副本,其中一个作为 leader,其他的作为follower。所有的读写操作都是通过 leader 来进行的,follower 则负责从 leader 同步数据。当 leader出现故障时,会从 follower 中选举出新的 leader,以保证服务的可用性。
  • 分区机制(Partitioning):Kafka 的 topic 可以分为多个 partition,每个 partition可以在不同的服务器上,这样即使某个服务器出现故障,也不会影响到其他 partition 的正常服务。
  • 消费者组(Consumer Groups):Kafka 允许多个消费者组同时消费同一个 topic,每个消费者组都会维护自己的offset,这样即使某个消费者组出现故障,也不会影响到其他消费者组的消费
  • ZooKeeper 集群:Kafka 使用 ZooKeeper 来管理集群的元数据信息,如 broker、topic 和
    partition 的信息等。ZooKeeper 本身也是一个分布式服务,可以通过多个节点组成集群,提供高可用性。
  • ISR(In-Sync Replicas)机制:Kafka 通过 ISR 机制来保证数据的一致性。只有在 ISR 列表中的
    follower 才有资格被选为新的 leader,这样可以保证新的 leader 拥有所有的数据副本。

通过以上的设计,Kafka 能够在面对故障时,仍能保证服务的可用性和数据的一致性。

集群架构

Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成
这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的基础

Kafka集群选举

ISR与OSR

Kafka为了对消息进行分类,引入了Topic(主题)的概念。生产者在发送消息的时候,需要指定发送到某个Topic,然后消息者订阅这个Topic并进行消费消息。

Kafka为了提升性能,又在Topic的基础上,引入了Partition(分区)的概念。Topic是逻辑概念,而Partition是物理分组。一个Topic可以包含多个Partition,生产者在发送消息的时候,需要指定发送到某个Topic的某个Partition,然后消息者订阅这个Topic并消费这个Partition中的消息。

Kafka为了提高系统的吞吐量和可扩展性,把一个Topic的不同Partition放到多个Broker节点上,充分利用机器资源,也便于扩展Partition。

Kafka为了保证数据的安全性和服务的高可用,又在Partition的基础上,引入Replica(副本)的概念。一个Partition包含多个Replica,Replica之间是一主多从的关系,有两种类型Leader Replica(领导者副本)Follower Replica(跟随者副本),Replica分布在不同的Broker节点上。

Leader Replica负责读写请求,Follower Replica只负责同步Leader Replica数据,不对外提供服务。当Leader Replica发生故障,就从Follower Replica选举出一个新的Leader Replica继续对外提供服务,实现了故障自动转移。
image.png
Kafka为了提升Replica的同步效率和数据写入效率,又对Replica进行分类。针对一个Partition的所有Replica集合统称为AR(Assigned Replicas,已分配的副本),包含Leader Replica和Follower Replica。与Leader Replica保持同步的Replica集合称为ISR(In-Sync Replicas,同步副本),与Leader Replica保持失去同步的Replica集合称为OSR(Out-of-Sync Replicas,失去同步的副本)AR = ISR + OSR
Leader Replica将消息写入磁盘前,需要等ISR中的所有副本同步完成。如果ISR中某个Follower Replica同步数据落后Leader Replica过多,会被转移到OSR中。如果OSR中的某个Follower Replica同步数据追上了Leader Replica,会被转移到ISR中。当Leader Replica发生故障的时候,只会从ISR中选举出新的Leader Replica

LEO和HW

Kafka为了记录副本的同步状态,以及控制消费者消费消息的范围,于是引入了LEO(Log End Offset,日志结束偏移量)HW(High Watermark,高水位)。
LEO表示分区中的下一个被写入消息的偏移量,也是分区中的最大偏移量。LEO用于记录Leader Replica和Follower Replica之间的数据同步进度,每个副本中各有一份。

Leader : LEO 1000 HW : 950
Follower1 : LEO 980
Follower2 : LEO 1000
Follower3 : LEO 950

HW表示所有副本(Leader和Follower)都已成功复制的最小偏移量,是所有副本共享的数据值。换句话说,HW之前的消息都被视为已提交,消费者可以消费这些消息。用于确保消息的一致性和只读一次。

LEO和HW的更新流程:

  1. 初始状态,三个副本中各有0和1两条消息,LEO都是2,位置2是空的,表示是即将被写入消息的位置。HW也都是2,表示Leader Replica中的所有消息已经全部同步到Follower Replica中,消费者可以消费0和1两条消息。

image.png

  1. 生产者往Leader Replica中发送两条消息,此时Leader Replica的LEO的值增加2,变成4。由于还没有开始往Follower Replica同步消息,所以HW值和Follower Replica中LEO值都没有变。由于消费者只能消费HW之前的消息,也就是0和1两条消息

image.png

  1. Leader Replica开始向Follower Replica同步消息,同步速率不同,Follower1的两条消息2和3已经同步完成,而Follower2只同步了一条消息2。此时,Leader和Follower1的LEO都是4,而Follower2的LEO是3,HW表示已成功同步的最小偏移量,值是3,表示此时消费者只能读到0、1、2,三条消息

image.png

  1. 所有消息都同步完成,三个副本的LEO都是4,HW也是4,消费者可以读到0、1、2、3,四条消息

image.png

Kafka分区Leader选举

常见的有以下几种情况会触发Partition的Leader Replica选举:

  1. Leader Replica 失效:当 Leader Replica 出现故障或者失去连接时,Kafka 会触发 Leader Replica 选举。
  2. Broker 宕机:当 Leader Replica 所在的 Broker 节点发生故障或者宕机时,Kafka 也会触发 Leader Replica 选举。
  3. 新增 Broker:当集群中新增 Broker 节点时,Kafka 还会触发 Leader Replica 选举,以重新分配 Partition 的 Leader。
  4. 新建分区:当一个新的分区被创建时,需要选举一个 Leader Replica。
  5. ISR 列表数量减少:当 Partition 的 ISR 列表数量减少时,可能会触发 Leader Replica 选举。当 ISR 列表中副本数量小于Replication Factor(副本因子)时,为了保证数据的安全性,就会触发 Leader Replica 选举。
  6. 手动触发:通过 Kafka 管理工具(kafka-preferred-replica-election.sh),可以手动触发选举,以平衡负载或实现集群维护

Leader Replica选举策略

在 Kafka 集群中,常见的 Leader Replica 选举策略有以下三种:

  1. ISR 选举策略:默认情况下,Kafka 只会从 ISR 集合的副本中选举出新的 Leader Replica,OSR 集合中的副本不具备参选资格。
  2. 不干净副本选举策略(Unclean Leader Election):在某些情况下,ISR 选举策略可能会失败,例如当所有 ISR 副本都不可用时。在这种情况下,可以使用 Unclean Leader 选举策略。Unclean Leader 选举策略会从所有副本中(包含OSR集合)选择一个副本作为新的 Leader 副本,即使这个副本与当前 Leader 副本不同步。这种选举策略可能会导致数据丢失,默认关闭
  3. 首选副本选举策略(Preferred Replica Election):首选副本选举策略也是 Kafka 默认的选举策略。在这种策略下,每个分区都有一个首选副本(Preferred Replica),通常是副本集合中的第一个副本。当触发选举时,控制器会优先选择该首选副本作为新的 Leader Replica,只有在首选副本不可用的情况下,才会考虑其他副本。
    当然,可以使用命令手动指定每个分区的首选副本:

bin/kafka-topics.sh --zookeeper localhost:2181 --topic my-topic-name --replica-assignment 0:1,1:2,2:0 --partitions 3
意思是:my-topic-name有3个partition,partition0的首选副本是Broker1,partition1首选副本是Broker2,partition2的首选副本是Broker0

Leader Replica选举过程

谁来主持选举?
kafka先在brokers里面选一个broker作为Controller主持选举。Controller是使用zookeeper选举出来的,每个broker都往zk里面写一个/controller节点,谁先写成功,谁就成为Controller。如果Controller失去连接,zk上的临时节点就会消失。其它的broker通过watcher监听到Controller下线的消息后,开始选举新的Controller。

一个Broker节点相当于一台机器,多个Broker节点组成一个Kafka集群。Controller节点也叫控制器节点 , 他负责直接与zookeeper进行通信,并负责管理整个集群的状态和元数据信息

Controller的责任

  • 监听Broker的变化
  • 监听Topic变化
  • 监听Partition变化
  • 获取和管理Broker、Topic、Partition的信息
  • 管理Partition的主从信息

当Leader Replica宕机或失效时,就会触发 Leader Replica 选举,分为两个阶段,第一个阶段是候选人的提名和投票阶段,第二个阶段是Leader的确认阶段。具体过程如下:

lag(滞后)是kafka消费队列性能监控的重要指标,lag的值越大,表示kafka的消息堆积越严重

  1. 候选人提名和投票阶段
    在Leader Replica失效时,ISR集合中所有Follower Replica都可以成为新的Leader Replica候选人。每个Follower Replica会在选举开始时向其他Follower Replica发送成为候选人的请求,并附带自己的元数据信息,包括自己的当前状态和Lag值。而Preferred replica优先成为候选人。
    其他Follower Replica在收到候选人请求后,会根据请求中的元数据信息,计算每个候选人的Lag值,并将自己的选票投给Lag最小的候选人。如果多个候选人的Lag值相同,则随机选择一个候选人。
  2. Leader确认阶段
    在第一阶段结束后,所有的Follower Replica会重新计算每位候选人的Lag值,并投票给Lag值最小的候选人。此时,选举的结果并不一定出现对候选人的全局共识。为了避免出现这种情况,Kafka中使用了ZooKeeper来实现分布式锁,确保只有一个候选人能够成为新的Leader Replica。
    当ZooKeeper确认有一个候选人已经获得了分布式锁时,该候选人就成为了新的Leader Replica,并向所有的Follower Replica发送一个LeaderAndIsrRequest请求,更新Partition的元数据信息。其他Follower Replica接收到请求后,会更新自己的Partition元数据信息,将新的Leader Replica的ID添加到ISR列表中

副本机制(Replication)



Kafka 中消息的备份又叫做 副本(Replica)
Kafka 定义了两类副本:

  • 领导者副本(Leader Replica): 负责数据读写
  • 追随者副本(Follower Replica): 只负责数据备份
  • 当领导者副本所在节点宕机之后, 会从追随者副本中选举一个节点, 升级为领导者副本 , 对外提供数据读写服务, 保证数据安全

消费者组和再均衡

消费者组

消费者组(Consumer Group)是由一个或多个消费者实例(Consumer Instance)组成的群组,具有可扩展性和可容错性的一种机制。消费者组内的消费者共享一个消费者组ID,这个ID 也叫做 Group ID,组内的消费者共同对一个主题进行订阅和消费,同一个组中只能够由一个消费者去消费某一个分区的数据,多余的消费者会闲置,派不上用场。

同一个分区只能被一个消费者组中的一个消费者消费 , 一个消费者组中的某一个消费者, 可以消费多个分区

一个生产者发送一条消息只能被一个消费者消费 : 让消费者处于同一个组中即可
一个生产者发送一条消息需要被多个消费者消费 : 让消费者处于不同的组中

@Component
public class KafkaConsumerListener {

    @KafkaListener(topics = "kafka.topic.my-topic1",groupId = "group1")
    public void listenTopic1group1(ConsumerRecord<String, String> record) {
        String key = record.key();
        String value = record.value();
        System.out.println("group1中的消费者接收到消息:"+key + " : " + value);
    }

    @KafkaListener(topics = "kafka.topic.my-topic1",groupId = "group2")
    public void listenTopic1group2(ConsumerRecord<String, String> record) {
        String key = record.key();
        String value = record.value();
        System.out.println("group2中的消费者接收到消息:"+key + " : " + value);
    }
}

再均衡(重平衡)

再均衡就是指 当消费者组中的消费者发生变更的时候(新增消费者, 消费者宕机) , 重新为消费者分配消费分区的过程


当消费者组中重新加入消费者 , 或者消费者组中有消费者宕机 , 这个时候Kafka会为消费者组中的消费者从新分配消费分区的过程就是再均衡

重平衡(再均衡)非常重要,它为消费者群组带来了高可用性伸缩性,我们可以放心的添加消费者或移除消费者,不过在正常情况下我们并不希望发生这样的行为。在重平衡期间,消费者无法读取消息,造成整个消费者组在重平衡的期间都不可用 , 并且在发生再均衡的时候有可能导致消息的丢失和重复消费

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

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

相关文章

第24篇 滑动开关控制LED<二>

Q&#xff1a;如何使用Intel FPGA Monitor Program创建滑动开关控制LED工程并运行呢&#xff1f; A&#xff1a;创建工程的基本过程与前面的Intel FPGA Monitor Program的使用<三>一样&#xff0c;不同的地方是&#xff0c;本实验工程用到了开发板的外设硬件LED和SW&…

[JS]节点操作

DOM节点 DOM树中的所有内容都是节点, 我们重点关注元素节点 作用 使开发者可以根据节点的关系获取元素, 而不是只能依赖选择器, 提高了编码的灵活性 节点分类 元素节点: 所有的标签都是元素节点, html是根节点属性节点: 所有的属性都是属性节点, 比如href文本节点: 所有的文…

Qt6.6编译Qt二维图形编辑器QVGE源码

QVGE是一个开源的多平台QtC编写的图形编辑器&#xff0c;可以用来画网络节点图&#xff0c;或者其他作用。 QVGE可以轻松创建和参数设定的小型到中型图形(1000节点/边缘)&#xff0c;共同的视觉特性的节点和边缘&#xff1a;形状、尺寸、颜色、标签等。定义(用户定义)属性的图表…

【异常总结】SeaTunnel集群脑裂配置优化方法

集群配置 项目描述数量3台规格阿里云ECS 16C64GSlot模式静态50个ST内存配置-Xms32g -Xmx32g -XX:MaxMetaspaceSize8g 异常问题 4月份以来&#xff0c;出现了3次集群脑裂现象&#xff0c;均为某节点脑裂/自动关闭。 核心日志如下&#xff1a; Master节点 出现Hazelcast监控…

开源大模型RAG企业本地知识库问答机器人-ChatWiki

ChatWiki ChatWiki是一款开源的知识库 AI 问答系统。系统基于大语言模型&#xff08;LLM &#xff09;和检索增强生成&#xff08;RAG&#xff09;技术构建&#xff0c;提供开箱即用的数据处理、模型调用等能力&#xff0c;可以帮助企业快速搭建自己的知识库 AI 问答系统。 开…

Xilinx系列FPGA实现4K视频拼接,基于Video Mixer实现,提供1套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐FPGA图像处理方案FPGA视频拼接叠加融合方案推荐4K视频输入输出方案Video Mixer视频拼接方案 3、详细设计方案设计框图TPG测试彩条VDMA图像缓存Video Mixer介绍HDMI 1.4/2.0 Transmitter SubsystemVideo PHY Controller输出均衡电路…

RuleApp1.4.6文章社区客户端 广告联盟支持Docx导入

支持编译为安卓&#xff0c;苹果&#xff0c;小程序&#xff0c;H5网页的社区客户端代码&#xff0c;包括文章模块&#xff0c;用户模块&#xff0c;动态模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;广告模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会…

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码 演示地址&#xff1a; https://hl.caohongji.com/ 手机端地址&#xff1a; https://mhl.caohongji.com/ 客服&#xff1a; kkmp326 源码说明&#xff1a; 1、系统内的黄历宜忌、农历、日历、佛历、道…

傅里叶变换,拉普拉斯变换,卷积 卷积定理

傅里叶变换&#xff0c;拉普拉斯变换&#xff0c;卷积 & 卷积定理 文章目录 傅里叶变换&#xff0c;拉普拉斯变换&#xff0c;卷积 & 卷积定理开胃小菜&#xff08;收敛性&#xff09;一、傅里叶变换核心原理定义连续时间信号离散时间信号&#xff08;了解&#xff09;…

leetcode 二分查找·系统掌握 有序数组中的单一元素

题意&#xff1a; 题解&#xff1a; 一种可行的思路是&#xff0c;考虑这个单独的数加入之前和加入之后这个数组中其他元素的属性发生了什么变化&#xff0c;不难看出在这个单独的数之前每一对数的第一个索引为偶数&#xff0c;在这个单独的数之后每一对数的第一个索引为奇数&…

RISC-V知识总结 —— 向量(扩展)指令集

资源1:晏明 - RISC-V向量扩展指令架构及LLVM自动向量化支持 - 202112118 - 第13届开源开发工具大会&#xff08;OSDTConf2021&#xff09;_哔哩哔哩_bilibili资源2:张先轶 - 基于RISC-V向量指令集优化基础计算软件生态【第12届开源开发工具大会&#xff08;OSDT2020&#xff09…

Fizz Buzz 经典问题 - 蓝桥杯

基础知识要求&#xff1a; Java&#xff1a;方法、if else语句、算术运算符、逻辑运算符、Scanner类 Python&#xff1a; 方法、if else语句、算术运算符、逻辑运算符、input() 题目&#xff1a; 思路解析&#xff1a; 读取输入&#xff1a; 从标准输入或其他方式读取一个整数…

高效利用iCloud指南:打造无缝连接的数字生活

iCloud是苹果公司推出的一项云存储和云计算服务&#xff0c;它为用户提供了一个安全、便捷的云端存储空间&#xff0c;帮助用户在各个苹果设备之间无缝同步数据。无论是照片、文档、备忘录&#xff0c;还是应用程序数据&#xff0c;iCloud都能让你的数字生活更加高效和有序。本…

CogMG:用大模型解决知识图谱覆盖不足的问题

CogMG&#xff1a;用大模型解决知识图谱覆盖不足的问题 提出背景知识图谱的作用知识覆盖不完整知识更新不对齐 显式分解知识三元组和补全检索增强生成&#xff08;RAG&#xff09;和知识更新 框架设计1. 查询知识图谱2. 处理结果3. 知识图谱演化 CogMG 实现3.1 模型和组件问题分…

智能测流速仪

LS300-B随着科技的不断进步&#xff0c;智能设备在各个领域中扮演着越来越重要的角色。在水利、环保、农业等行业中&#xff0c;明渠流速流量的测量一直是一个关键环节。传统的测量方法虽然有其有效性&#xff0c;但在面对复杂多变的测量环境时&#xff0c;往往显得力不从心。而…

[CAN] 通讯协议手动解析与手动打包 [手撕编码格式]

手动解析与手动打包 一、Intel格式编码1.1 报文解析。1.2 报文打包二、Motorola格式通讯协议2.1 报文解析。2.2 报文打包🙋 前言 CAN有两种编码格式:Intel编码格式 和 Motorola编码格式,本教程将分别对两种格式进行手动解析与手动打包。 一、Intel格式编码 假设已知雷达CAN…

如何在MySQL中按字符串中的数字排序

在管理数据库时&#xff0c;我们经常遇到需要按嵌入在字符串中的数字进行排序的情况。这在实际应用中尤为常见&#xff0c;比如文件名、代码版本号等字段中通常包含数字&#xff0c;而这些数字往往是排序的关键。本文将详细介绍如何在MySQL中利用正则表达式提取字符串中的数字并…

GPT-5的到来:智能飞跃与未来畅想

IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂确认了GPT-5的发布计划&#xff0c;预计将在一年半后推出。穆拉蒂形象地将GPT-4到GPT-5的飞跃比作高中生到博士生的成长。这一飞跃将给我们带来哪些变化&#xff1f;GPT-5的…

贪吃蛇项目GameStart部分:对游戏的初始化

接上一篇文章介绍完需要使用到的WIN32API的相关知识&#xff0c;本篇文章让我们来开始使用他们来创建我们的贪吃蛇欢迎界面以及游戏所需要的地图。 准备工作&#xff1a; 为了后面我们构建贪吃蛇游戏所需要的各项函数便于观察&#xff0c;同时便于我们的函数声明&#xff0c;在…