kafka 各种选举过程

embedded/2024/10/19 19:30:39/

kafka___0">一、kafka 消费者组协调器 如何选举

Kafka 中的消费者组协调器(Group Coordinator)是通过以下步骤选举的:

  1. 分区映射

    • Kafka 使用一个特殊的内部主题 __consumer_offsets 来存储消费者组的元数据。该主题有多个分区,每个分区负责存储一部分消费者组的信息。
  2. 哈希分配

    • 每个消费者组的 ID(groupId)通过哈希函数映射到 __consumer_offsets 主题的一个特定分区。
  3. 分区领导者

    • 每个分区都有一个领导者(Leader),该领导者是 Kafka 集群中的一个 Broker。这个 Broker 就是负责管理该分区上所有消费者组的协调器。
  4. 协调器确定

    • 当一个消费者加入消费者组时,它会通过哈希函数找到对应的 __consumer_offsets 分区,然后找到该分区的领导者 Broker,这个 Broker 就是该消费者组的协调器。
  5. 元数据更新

    • 当消费者组的成员发生变化(如消费者加入或离开)时,协调器会更新 __consumer_offsets 主题中的元数据,并通知所有相关的消费者。

通过这种机制,Kafka 实现了消费者组协调器的分布式选举和管理,确保每个消费者组都有一个协调器来管理其成员关系和分区分配。

kafka_BrokerController__20">二、 kafka BrokerController 如何选举

Kafka 中的 Broker Controller 是通过 Zookeeper 进行选举的。具体步骤如下:

  1. 启动过程

    • 当一个 Kafka Broker 启动时,它会尝试在 Zookeeper 中创建一个临时的 /controller 节点。
    • 这个节点的创建是一个原子操作,只有一个 Broker 能够成功创建这个节点。
  2. 成功创建

    • 成功创建 /controller 节点的 Broker 就成为了 Controller。
    • 该 Broker 会在 /controller 节点中写入自己的 Broker ID,其他 Brokers 可以通过读取这个节点来知道当前的 Controller 是哪个 Broker。
  3. 监听机制

    • 其他 Brokers 会监听 /controller 节点的变化,以便在当前 Controller 失效时能够及时感知。
    • 如果当前的 Controller Broker 崩溃或失效,Zookeeper 会删除 /controller 节点,因为它是一个临时节点。
  4. 重新选举

    • /controller 节点被删除时,其他 Brokers 会再次尝试创建这个节点。
    • 其中一个 Broker 会成功创建并成为新的 Controller。

通过这种机制,Kafka 保证了在任何时刻只有一个 Broker 充当 Controller,并且能够在 Controller 失效时快速进行重新选举。

kafka__leader__42">三、kafka 分区 leader 如何选举

Kafka 分区 Leader 的选举过程如下:

  1. 分区元数据

    • 每个分区都有一个副本集(Replica Set),包含一个 Leader 和多个 Follower。
    • 分区的元数据存储在 Zookeeper 中,包括所有副本的列表和当前的 Leader。
  2. 初始选举

    • 当 Kafka 集群启动时,Controller 会从 Zookeeper 中读取分区的元数据,并为每个分区选举一个 Leader。
    • 通常,副本列表中的第一个 Broker 会被选为 Leader。
  3. Leader 失效检测

    • Controller 通过心跳机制监控各个 Broker 的状态。
    • 如果检测到当前 Leader 失效(例如,Broker 崩溃或网络分区),Controller 会触发重新选举。
  4. 重新选举

    • Controller 会从剩余的副本中选择一个新的 Leader。
    • 选择标准通常是优先选择 ISR(In-Sync Replica,同步副本)中的副本,因为这些副本的数据是最新的。
    • 如果没有可用的 ISR,Controller 会选择其他副本作为 Leader。
  5. 更新元数据

    • 选举完成后,Controller 会更新 Zookeeper 中的分区元数据,记录新的 Leader 信息。
    • 其他 Brokers 和客户端会通过 Zookeeper 或元数据请求获取最新的 Leader 信息。

通过这种机制,Kafka 保证了分区在 Leader 失效时能够快速进行重新选举,确保数据的高可用性和一致性。

kafka__leader__69">四、kafka 消费者 leader 如何选举

Kafka 中的消费者 Leader 选举是指在一个消费组(Consumer Group)中选举出一个消费者作为 Leader,负责协调和管理消费组的成员关系和分区分配。这个过程通常由群组协调器(Group Coordinator)来完成。具体步骤如下:

  1. 消费者加入消费组

    • 当一个消费者加入消费组时,它会向群组协调器发送 JoinGroup 请求。
    • 群组协调器是负责管理消费组的 Kafka Broker。
  2. 选举 Leader

    • 群组协调器会选举一个消费者作为 Leader。通常,第一个发送 JoinGroup 请求的消费者会被选为 Leader。
  3. 分区分配

    • 被选为 Leader 的消费者会负责分配分区给消费组中的各个消费者。
    • Leader 会根据消费组的分区分配策略(如 Range、RoundRobin 等)来进行分配。
  4. 同步分配方案

    • Leader 生成分区分配方案后,会将方案发送给群组协调器。
    • 群组协调器会将分配方案同步给所有消费者。
  5. 消费者确认

    • 所有消费者收到分配方案后,会向群组协调器发送 SyncGroup 请求,确认分配。
    • 一旦所有消费者确认,分区分配就正式生效,消费者开始消费分配到的分区。
  6. Leader 失效处理

    • 如果当前的 Leader 消费者失效(如崩溃或断开连接),群组协调器会重新选举一个新的 Leader。
    • 新的 Leader 会重新进行分区分配,并同步给所有消费者。

通过这种机制,Kafka 保证了消费组在消费者失效时能够快速进行重新选举和分区分配,确保数据的高可用性和一致性。


http://www.ppmy.cn/embedded/88794.html

相关文章

整体接口测试

文章目录 1.分类1.新增分类1.接口设计2.结果 2.更新分类1.接口设计2.结果 3.查询分类1.接口设计2.结果(少了一个count字段暂时不改) 4.查询大类下分类1.接口设计2.结果 5.删除分类1.接口设计2.结果 2.标签1.新增标签1.接口设计2.结果 2.更新标签1.接口设…

基于Django与spark的国漫推荐系统

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 近年来,随着互联网的蓬勃发展,企事业单位对信息的管理提…

poetry shell

cd api poetry shellflask run --host 0.0.0.0 --port5001 --debug cd api poetry shell celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_tracecd web npm run start

【Linux】Ubuntu配置JDK环境、MySQL环境

一、 Ubuntu配置JDK环境 在Ubuntu系统中安装JDK 8可以通过以下步骤进行: 打开终端。更新包列表: sudo apt update安装OpenJDK 8: sudo apt install openjdk-8-jdk验证安装是否成功: java -version注:如果系统中安…

FPGA:串口通信发送模块

FPGA:串口通信发送模块 1、串口通信的概念及分类(1)串口通信概念(2)串口通信分类 2、UART协议(1)FPGA实现UART协议发送模块思路(2)Verilog设计文件a.波特率选择模块b.单个比特发送模块c.位状态计数器d.延时计数器e.数据保存寄存器f.位发送逻辑g.led翻转逻辑h.使能信号en_send逻…

【C++】模拟实现list

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目及其功能 📌了解list官方标准 了解模拟实现list 📌了解更底层的list实现 二.list迭代器和vector迭代器的异同 📌迭代…

TypeScript(switch判断)

1.switch 语法用法 switch是对某个表达式的值做出判断。然后决定程序执行哪一段代码 case语句中指定的每个值必须具有与表达式兼容的类型 语法switch(表达式){ case 值1: ​ 执行语句块1 break; case 值2: ​ 执行语句块3 break; dfault: //如…

利用canvas 实现图片的标注,把标注像素点传入到后端

背景:我们有一个摄像的产品,拍照传统的水表盘面,我们需要框选水表读数,标注点传到后端,后端根据标注点自动去截取摄像表拍摄回来的图片,然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…