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的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。
184 2
|
3月前
|
消息中间件 Java API
RocketMQ事务消息, 图文、源码学习探究~
介绍 RocketMQ是阿里巴巴开源的分布式消息中间件,它是一个高性能、低延迟、可靠的消息队列系统,用于在分布式系统中进行异步通信。 从4.3.0版本开始正式支持分布式事务消息~ RocketMq事务消息支持最终一致性:在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 原理、流程 本质上RocketMq的事务能力是基于二阶段提交来实现的 在消息发送上,将二阶段提交与本地事务绑定 本地事务执行成功,则事务消息成功,可以交由Consumer消费 本地事务执行失败,则事务消息失败,Consumer无法消费 但是,RocketMq只能保证本地事务
|
1天前
|
SQL 监控 关系型数据库
【MySQL学习】MySQL的慢查询日志和错误日志
【MySQL学习】MySQL的慢查询日志和错误日志
|
7天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs <container_name>` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
11 0
|
22天前
|
消息中间件 监控 Kafka
【Kafka】Kafka 分区Leader选举策略
【4月更文挑战第7天】【Kafka】Kafka 分区Leader选举策略
|
23天前
|
消息中间件 存储 负载均衡
消息队列学习之RabbitMQ
【4月更文挑战第3天】消息队列学习之RabbitMQ,一种基于erlang语言开发的流行的开源消息中间件。
17 0
|
2月前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
48 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
49 0
|
3月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
54 0
|
4月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)(下)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
30 0