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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
日志服务 SLS,月写入数据量 50GB 1个月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 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

目录
相关文章
|
23天前
|
消息中间件 运维 Java
招行面试:RocketMQ、Kafka、RabbitMQ,如何选型?
45岁资深架构师尼恩针对一线互联网企业面试题,特别是招商银行的高阶Java后端面试题,进行了系统化梳理。本文重点讲解如何根据应用场景选择合适的消息中间件(如RabbitMQ、RocketMQ和Kafka),并对比三者的性能、功能、可靠性和运维复杂度,帮助求职者在面试中充分展示技术实力,实现“offer直提”。此外,尼恩还提供了《尼恩Java面试宝典PDF》等资源,助力求职者提升架构、设计、开发水平,应对高并发、分布式系统的挑战。更多内容及技术圣经系列PDF,请关注【技术自由圈】获取。
|
2月前
|
消息中间件 大数据 Kafka
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
|
2月前
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
139 1
|
3月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
148 3
|
3月前
|
消息中间件 存储 监控
说说如何解决RocketMq消息积压?为什么Kafka性能比RocketMq高?它们区别是什么?
【10月更文挑战第8天】在分布式系统中,消息队列扮演着至关重要的角色,它不仅能够解耦系统组件,还能提供异步处理、流量削峰和消息持久化等功能。在众多的消息队列产品中,RocketMQ和Kafka无疑是其中的佼佼者。本文将围绕如何解决RocketMQ消息积压、为什么Kafka性能比RocketMQ高以及它们之间的区别进行深入探讨。
141 1
|
3月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
67 4
|
3月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
45 3
|
3月前
|
存储 消息中间件 大数据
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
65 1
|
3月前
|
存储 消息中间件 大数据
大数据-68 Kafka 高级特性 物理存储 日志存储概述
大数据-68 Kafka 高级特性 物理存储 日志存储概述
45 1
|
3月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
280 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......

热门文章

最新文章