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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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

目录
相关文章
|
2月前
|
消息中间件 存储 Kafka
RabbitMQ、RocketMQ和Kafka全面对决,谁是最佳选择?
1、应用场景 1.RabbitMQ: 适用于易用性和灵活性要求较高的场景 异步任务处理:RabbitMQ提供可靠的消息传递机制,适用于处理异步任务,例如将耗时的任务放入消息队列中,然后由消费者异步处理,提高系统的响应速度和可伸缩性。 解耦系统组件:通过使用RabbitMQ作为消息中间件,不同的系统组件可以通过消息进行解耦,实现松耦合的架构,提高系统的可维护性和灵活性。 事件驱动架构:RabbitMQ的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。
203 2
|
4月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
124 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
|
20天前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
34 2
|
4月前
|
消息中间件 数据可视化 关系型数据库
ELK7.x日志系统搭建 4. 结合kafka集群完成日志系统
ELK7.x日志系统搭建 4. 结合kafka集群完成日志系统
154 0
|
1天前
|
消息中间件 监控 负载均衡
rabbitmq与kafka的区别
RabbitMQ提供了强大的可靠性保障,通过持久化机制和消息确认机制来确保消息的可靠传输和消费。而Kafka也提供了类似的可靠性保障,但其持久化机制和消息确认机制的实现方式与RabbitMQ有所不同。
|
12天前
|
SQL 监控 关系型数据库
【MySQL学习】MySQL的慢查询日志和错误日志
【MySQL学习】MySQL的慢查询日志和错误日志
|
18天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs <container_name>` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
17 0
|
1月前
|
消息中间件 监控 Kafka
【Kafka】Kafka 分区Leader选举策略
【4月更文挑战第7天】【Kafka】Kafka 分区Leader选举策略
|
1月前
|
消息中间件 存储 负载均衡
消息队列学习之kafka
【4月更文挑战第2天】消息队列学习之kafka,一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台。
22 2
|
2月前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
53 1

热门文章

最新文章