MQ 学习日志(四) kafka的选举机制

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
日志服务 SLS,月写入数据量 50GB 1个月
简介: kafka的选举机制 概述
kafka的选举机制

一个Kafka集群中有多个Broker,最开始的时候,这些Broker中的有一个Broker会被选举为控制器(KafKa Controller),他负责管理整个集群中所有的分区和副本的状态,每个Topic的partition的多个Replication中只有一个Replication会被选举为Leader,只有Leader可以进行消息的读写,当某个Partition的leader宕机之后,由Controller发送消息给该Topic的所有Partition来进行选举,推选出来一个Replication作为partition Leader

kafka控制器的选举原理

KafKa控制器的选举依赖于Zookeeper,当一个Broker选举成功之后,会在Zookeeper中创建一个Controller的临时节点,每个Broker会对/Controller节点添加监听器,以便来监听节点的数据变化,当/Controller节点发生变化的时候,就会触发新一轮的选举

在任意时刻,集群中有且只有一个控制器,每个Broker都会在内存中保存当前控制器的brokerId值,这个值表示activeControllerId

启动时选举

集群中第一个启动的Broker会通过在Zookeeper中创建临时节点/controller来让自己成为控制器,其他Broker启动时会尝试读取/controller节点的BrokerId的值,读取到的BrokerId的值不为-1,直到已经有其他的Broker节点成功竞选成为控制器,就会在Zookeeper中创建watch对象,便于他们收到控制器变更的通知

Leader异常选举

如果Broker由于网络原因与Zookeeper断开连接或者异常退出,那么其他的Broker通过watch收到控制器变更的通知,就会去尝试创建临时节点/controller,如果有一个Broker创建成功,那么其他的Broker就会收到创建异常通知,也就意味着集群中已经有了控制器,其他Broker只需要创建watch对象即可

Follower异常

如果集群中有一个Broker发生异常退出了,那么控制器就会检查这个Broker是否有分区的副本Leader,如果有那么个分区就需要一个新的leader,此时控制器就会去便利其他的副本,决定哪一个成为新的leader,同时更新分区的ISR集合

Broker加入

如果一个Broker加入到集群中,那么控制器就会通过brokerId去判断新加入的Broker中是否含有现有分区的副本,如果有,就会从分区副本中去同步数据

Epoch防止脑裂

kafka通过controller_epoch来保证控制器的唯一性,进而保证相关操作的一致性

Controller_epoch是一个整型值,存放再zookeeper的/controller_epoch这个持久节点中

controller_epoch值用于记录控制器发生变更的次数,即记录当前的控制器是第几代控制器

controller_epoch的初始值为1,当控制器发生变更的时候,就将该字段+1

每个和控制器交互的请求都会携带Controller_epoch字段,来标注交互的是几代控制器

如果请求的Controller_epoch值小于内存中的Controller_epoch值,那么就认为这个请求是向已经过期的控制器发送请求,这个请求就会被忽略

如果请求的Controller_epoch的值大于当前内存的controller_epoch值,那么就说明已经有新的控制器当选了

分区Leader的选举

controller感知到分区Leader所在的broker挂了,controller就会从replicas副本列表中取出第一个broker作为leader

消费者Leader的选举

GroupCoordinator需要为消费组内的消费者选举出一个消费租的Leader,这个选举的算法很简单,当消费组内还没有leader,那么第一个加入消费组的消费者就为消费组的leader,如果当前的leader退出消费组,则会挑选以HashMap结构保存的消费者节点数据中,第一个键值对来作为leader

目录
相关文章
|
6天前
|
消息中间件 存储 Kafka
Kafka日志处理:深入了解偏移量查找与切分文件
**摘要:** 本文介绍了如何在Kafka中查找偏移量为23的消息,涉及ConcurrentSkipListMap的查询、索引文件的二分查找及日志分段的物理位置搜索。还探讨了Kafka日志分段的切分策略,包括大小、时间、索引大小和偏移量达到特定阈值时的切分条件。理解这些对于优化Kafka的性能和管理日志至关重要。
16 2
|
8天前
|
消息中间件 Kafka 程序员
Kafka内幕:详解Leader选举与副本同步的那些事儿
大家好,我是小米,今天给大家带来一篇关于 Kafka 核心机制的深度解析文章。本文将详细讲解 Kafka 的 Leader 选举、副本消息同步以及相关概念 LEO 和 HW,帮助大家更好地理解和应用 Kafka,提升处理分布式系统的能力。快来一起学习吧!
14 0
|
12天前
|
消息中间件 NoSQL Kafka
基于Kafka的nginx日志收集分析与监控平台(3)
基于Kafka的nginx日志收集分析与监控平台(3)
|
12天前
|
消息中间件 监控 Kafka
基于Kafka的nginx日志收集分析与监控平台(2)
基于Kafka的nginx日志收集分析与监控平台(2)
|
12天前
|
消息中间件 负载均衡 应用服务中间件
基于Kafka的nginx日志收集分析与监控平台(1)
基于Kafka的nginx日志收集分析与监控平台(1)
|
12天前
|
消息中间件 NoSQL Kafka
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(2)
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(2)
|
12天前
|
消息中间件 应用服务中间件 Kafka
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(1)
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(1)
|
17天前
|
Java Apache
学习Java中的日志系统设计与优化
学习Java中的日志系统设计与优化
|
17天前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
15 0
|
19天前
|
XML Java 程序员
一篇文章讲明白Log日志框架的学习五.正确使用日志的10个技巧(转载)
一篇文章讲明白Log日志框架的学习五.正确使用日志的10个技巧(转载)
11 0