第二章 Kafka设计原理详解
第二章 Kafka设计原理详解
1、Kafka核心总控制器Controller
在 Kafka 集群中会有一个或者多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
- 当某个分区的 leader 副本出现故障时,由控制器负责为该分区选举新的 leader 副本。
- 当检测到某个分区的 ISR 集合发生变化时,由控制器负责通知所有 broker 更新其元数据信息。
- 当使用
kafka-topics.sh
脚本为某个 topic 增加分区数量时,同样还是由控制器负责让新分区被其他节点感知到。
2、Controller选举机制
在 kafka 集群启动的时候,会自动选举一台 broker 作为 controller 来管理整个集群,选举的过程是集群中每个 broker 都会尝试在 zookeeper 上创建一个 /controller
临时节点,zookeeper 会保证有且仅有一个 broker 能创建成功,这个 broker 就会成为集群的总控器 controller。
当这个 controller 角色的 broker 宕机了,此时 zookeeper 临时节点(/controller)会消失,集群里的其他 broker 会一直监听这个临时节点,发现临时节点消失了,就再次竞争创建临时节点,就是我们上面说的选举机制,zookeeper 又会保证有一个 broker 成为新的 controller。
具备控制器身份的 broker 需要比其他普通的 broker 多一份职责,具体细节如下:
1、监听 broker 相关的变化。为 Zookeeper 中的 /brokers/ids
节点添加 BrokerChangeListener,用来处理 broker 增减的变化。
2、监听 topic 相关的变化。为 Zookeeper 中的 /brokers/topics
节点添加 TopicChangeListener,用来处理 topic 增减的变化;为 Zookeeper 中的 /admin/delete_topics
节点添加 TopicDeletionListener,用来处理删除 topic 的动作。
3、从 Zookeeper 中获取当前所有与 topic、partition 以及 broker 有关的信息并进行相应的管理。对于所有 topic 所对应的 Zookeeper 中的 /brokers/topics/[topic]
节点添加 PartitionModificationsListener,用来监听 topic 中的分区分配变化。
4、更新集群的元数据信息,同步到其他普通的 broker 节点中。
3、Partition副本选举Leader机制
controller 感知到分区副本 leader 所在的 broker 挂了(controller监听了很多 zk 节点可以感知到 broker 存活),controller 会从 ISR 列表(参数unclean.leader.election.enable=false
的前提下)里挑第一个 broker 作为 leader(第一个 broker 最先放进 ISR 列表,可能是同步数据最多的副本),如果参数 unclean.leader.election.enable
为 true,代表在 ISR 列表里所有副本都挂了的时候可以在 ISR 列表以外的副本中选 leader,这种设置可以提高可用性,但是选出的新 leader 有可能数据少很多。
副本进入 ISR 列表有两个条件:
1、副本节点不能产生分区,必须能与 zookeeper 保持会话以及跟 leader 副本网络连通
2、副本能复制 leader 上的所有写操作,并且不能落后太多。(与 leader 副本同步滞后的副本,是由 replica.lag.time.max.ms
配置决定的,超过这个时间都没有跟 leader 副本同步过一次的副本会被移出 ISR 列表)
4、消费者消费消息的offset记录机制
每个 consumer 会定期将自己消费分区的 offset 提交给 kafka 内部 topic:__consumer_offsets
,提交过去的时候,key 是 consumerGroupId+topic+分区号,value 就是当前 offset 的值,kafka 会定期清理 topic 里的消息,最后就保留最新的那条数据
因为 __consumer_offsets 可能会接收高并发的请求,kafka 默认给其分配 50 个分区(可以通过 offsets.topic.num.partitions
设置),这样可以通过加机器的方式扩大并发。
通过如下公式可以选出 consumer 消费的 offset 要提交到 __consumer_offsets
的哪个分区
公式:hash(consumerGroupId) % __consumer_offsets 的分区数
5、消费者Rebalance机制
rebalance 就是说如果消费组里的消费者数量有变化或消费的分区数有变化时,kafka 会重新分配消费者消费分区的关系。比如 consumer group 中的某个消费者挂了,此时会自动把分配给他的分区交给其他的消费者,如果他又重启了,那么又会把一些分区重新交还给他。
注意:rebalance 只针对 subscribe 这种不指定分区消费的情况,如果通过 assign 这种消费方式指定了分区,kafka 不会进行 rebanlance。
如下情况可能会触发消费者 rebalance:
1、消费组里的 consumer 增加或减少了
2、动态给 topic 增加了分区
3、消费组订阅了更多的 topic
rebalance 过程中,消费者无法从 kafka 消费消息,这对 kafka 的 TPS 会有影响,如果 kafka 集群内节点较多,比如数百个,那重平衡可能会耗时极多,所以应尽量避免在系统高峰期发生重平衡。
5.1、消费者Rebalance分区分配策略
主要有三种 rebalance 策略:range、round-robin、sticky。
Kafka 提供了消费者客户端参数 partition.assignment.strategy 来设置消费者与订阅主题之间的分区分配策略。默认情况为 range 分配策略。
假设一个主题有 10 个分区(0-9),现在有三个 consumer 消费:
1、range 策略就是按照分区序号排序,假设 n=分区数/消费者数量 = 3, m=分区数 % 消费者数量 = 1,那么前 m 个消费者每个分配 n+1 个分区,后面的(消费者数量-m )个消费者每个分配 n 个分区。
比如分区 0~3 给一个 consumer,分区 4~6 给一个 consumer,分区 7~9 给一个 consumer。
2、round-robin 策略就是轮询分配,比如分区 0、3、6、9 给一个 consumer,分区 1、4、7 给一个 consumer,分区 2、5、8 给一个 consumer
3、sticky 策略初始时分配策略与 round-robin 类似,但是在 rebalance 的时候,需要保证如下两个原则:
- 分区的分配要尽可能均匀
- 分区的分配尽可能与上次分配保持相同
当两者发生冲突时,第一个目标优先于第二个目标 。这样可以最大程度维持原来的分区分配策略。
比如对于第一种 range 情况的分配,如果第三个 consumer 挂了,那么重新用 sticky 策略分配的结果如下:
consumer1 除了原有的 0~3,会再分配一个 7
consumer2 除了原有的 4~6,会再分配 8 和 9
5.2、Rebalance过程
当有消费者加入消费组时,消费者、消费组以及组协调器之间会经历以下几个阶段:
第一阶段:选择组协调器
组协调器 GroupCoordinator:每个 consumer group 都会选择一个 broker 作为自己的组协调器 coordinator,负责监控这个消费组里的所有消费者的心跳,以及判断是否宕机,然后开启消费者 rebalance。
consumer group 中的每个 consumer 启动时会向 kafka 集群中的某个节点发送 FindCoordinatorRequest 请求来查找对应的组协调器 GroupCoordinator,并跟其建立网络连接。
组协调器选择方式:
consumer 消费的 offset 要提交到 __consumer_offsets 的哪个分区,这个分区 leader 对应的 broker 就是这个 consumer group 的 coordinator
第二阶段:加入消费组 JOIN GROUP
在成功找到消费组所对应的 GroupCoordinator 之后就进入加入消费组的阶段,在此阶段的消费者会向 GroupCoordinator 发送 JoinGroupRequest 请求,并处理响应。然后 GroupCoordinator 从一个 consumer group 中选择第一个加入 group 的 consumer 作为 leader(消费组协调器),把 consumer group 情况发送给这个 leader,接着这个 leader 会负责制定分区方案。
第三阶段(SYNC GROUP)
consumer leader 通过给 GroupCoordinator 发送 SyncGroupRequest,接着 GroupCoordinator 就把分区方案下发给各个 consumer,他们会根据指定分区的leader broker 进行网络连接以及消息消费。
6、日志分段存储
Kafka 一个分区的消息数据对应存储在一个文件夹下,以 topic 名称 + 分区号命名,消息在分区内是分段(segment)存储的,每个分段的消息都存储在不同的 log 文件里,这种特性方便 old segment file 快速被删除,kafka 规定了一个段位的 log 文件最大为 1G,做这个限制的目的是为了方便把 log 文件加载到内存去操作:
# 部分消息的offset索引文件,kafka每次往分区发4K(可配置)消息就会记录一条当前消息的offset到index文件,
# 如果要定位消息的offset会先在这个文件里快速定位,再去log文件里找具体消息
00000000000000000000.index
# 消息存储文件,主要存offset和消息体
00000000000000000000.log
# 消息的发送时间索引文件,kafka每次往分区发4K(可配置)消息就会记录一条当前消息的发送时间戳与对应的offset到timeindex文件,
# 如果需要按照时间来定位消息的offset,会先在这个文件里查找
00000000000000000000.timeindex00000000000005367851.index
00000000000005367851.log
00000000000005367851.timeindex00000000000009936472.index
00000000000009936472.log
00000000000009936472.timeindex
这个 9936472 之类的数字,就是代表了这个日志段文件里包含的起始 Offset,也就说明这个分区里至少都写入了接近 1000 万条数据了。
Kafka Broker 有一个参数,log.segment.bytes,限定了每个日志段文件的大小,最大就是 1GB。
一个日志段文件满了,就自动开一个新的日志段文件来写入,避免单个文件过大,影响文件的读写性能,这个过程叫做 log rolling,正在被写入的那个日志段文件,叫做 active log segment。
相关文章:

第二章 Kafka设计原理详解
第二章 Kafka设计原理详解 1、Kafka核心总控制器Controller 在 Kafka 集群中会有一个或者多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 当某个分区的 leader…...

《NFL橄榄球》:费城老鹰·橄榄1号位
费城老鹰(英语:Philadelphia Eagles)是美国橄榄球联盟在宾夕法尼亚州费城的一支球队。1933年在国家橄榄球联盟扩编时与匹兹堡钢人和辛辛那提红人一起加入;1943年赛季因二次大战的缘故,和匹兹堡钢人作短暂的合并。 在20…...

【人工智能AI】四、NoSQL进阶《NoSQL 企业级基础入门与进阶实战》
帮我写一篇介绍NoSQL的技术文章,文章的标题是《四、NoSQL进阶》,不少于3000字。帮我细化到三级目录,使用markdown格式。这篇文章的目录是: 四、NoSQL 进阶 4.1 NoSQL 高可用 4.2 NoSQL 数据安全 4.3 NoSQL 性能优化 4.4 总结 四、…...

K8S 部署 Jenkins
本文使用 bitnami 镜像部署 Jenkins 官方文档:https://github.com/bitnami/charts/tree/main/bitnami/jenkins 添加 bitnami 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami自定义 values.yaml storageClass:集群的存储类ÿ…...

【人工智能AI】五、NoSQL 应用实践《NoSQL 企业级基础入门与进阶实战》
帮我写一篇介绍NoSQL的技术文章,文章的标题是《五、NoSQL 应用实践》,不少于3000字。目录需要细化到三级目录,使用markdown格式。这篇文章的大的目录是: 五、NoSQL 应用实践 5.1 NoSQL 实时数据分析 5.2 NoSQL 分布式系统 5.3 NoS…...

Java爬虫系列 - 爬虫补充内容+ElasticSearch展示数据
一,定时任务Cron表达式Component public class TaskTest {Scheduled(cron "0/5 * * * * *") // 从0秒开始,每个五秒 执行一次 { 秒 分 时 天 月 周 }public void test(){System.out.println("定时任务执行了");} }二,网…...

Typora常用快捷键
Typora常用快捷键大全 ctrl1到6:1~6级标题,标题用ctrlH是没用的 ctrlshiftk:随时随地插入代码块,极为方便。 ctrlt:创建表格,也可直接输入|列1|列2|列3|并回车来创建表 ctrlshiftq:能实现添加…...

开学季好用电容笔有哪些?好用实惠的电容笔推荐
随着科学技术的快速发展,ipad的影响力越来越大,而且ipad的用户也越来越多,如果要提高ipad的功能,让ipad更加有趣,那么就需要一款非常适合自己,并且非常实用的电容笔。那么,究竟该选择哪个品牌的…...

C++_复习Recording
文章目录C复习课填空题编程题C复习课 试卷说明: 题型: 填空 编程题目 填空题 构造函数无返回类型,与类名同名; 复制构造函数用于创建对象,形实参结合,返回和接收对象。 补充: 只有在声明语句中使用一个变…...

【java】Spring Cloud --Spring Cloud 的核心组件
文章目录前言一、Eureka(注册中心)二、Zuul(服务网关)三、 Ribbon(负载均衡)四、Hystrix(熔断保护器)五、 Feign(REST转换器)六、 Config(分布式配…...

【C++】RBTree——红黑树
文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入五、代码实现一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上…...

【5G RRC】5G系统消息SIB2介绍
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...

自托管提醒平台Noted Reminders
什么是 Noted Reminders ? Noted 是一个简单的自托管应用程序,用于创建使用 Apprise API 推送到设备的提醒。您可以向几乎每个平台发送消息,包括定时电子邮件! 什么是 Apprise API ? Apprise 允许您向我们今天可用的几乎所有最流…...

LockSupport常用方法源码分析
前言:本文将介绍LockSupport类中的方法和部分源码,以及面试常问到的一个小问题,感兴趣的大佬可以指点下。 希望能够加深自己的印象以及帮助到其他的小伙伴儿们😉😉。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…...

Mybatis Notes
文章目录1 Mybatis 介绍1.1 快速入门2 JDBC2.1 JDBC介绍2.3 JDBC问题分析2.4 Mybatis与JDBC技术对比3 数据库连接池3.1 数据库连接池介绍3.2 数据库连接池产品产品3.3 Druid引入项目4lombok4.1 lombok介绍4.2 lombok使用4.2.1 在pom.xml文件中引入依赖4.2.2 pojo类代码引入1 My…...

MySQL 10:MySQL事务
MySQL 中的事务是由存储引擎实现的。在 MySQL 中,只有 InnoDB 存储引擎支持事务。事务处理可用于维护数据库的完整性,确保批处理的 SQL 语句要么执行要么根本不执行。事务用于管理 DDL、DML 和 DCL 操作,例如插入、更新和删除语句,…...

软件设计(十三)-原码、反码、补码、移码
软件设计(十二)数据结构(下)https://blog.csdn.net/ke1ying/article/details/129035300 下面把一个数转成二进制表达形式 原码: 数值1 : 0000 0001 数值-1 : 1000 0001 1 (- 1) : 1000 0010 这是8个…...

5.4 BGP地址聚合
5.3.1配置BGP地址聚合 1. 实验目的 熟悉BGP地址聚合的应用场景掌握BGP地址聚合的配置方法2. 实验拓扑 实验拓扑如图5-4所示: 图5-4:配置BGP地址聚合 3. 实验步骤 (1)配置IP地址 R1的配置 <Huawe…...

华为OD机试 - 数列还原(Python) | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】 华为OD机试 - 双十一(Python) | 机试题算法思路 【2023】 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 华为OD机试 - Excel 单元格数值统计(Python) | 机试题算法思路 …...

华为OD机试题 - 新工号系统(JavaScript)| 代码+思路+重要知识点
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

Java-算法竞赛中常用的Java API之大数类
Java-算法竞赛中常用的Java API之大数类摘要BigInteger和BigDecimal创建赋值加法减法乘法除法*取余*求最大公因数求最值*(a^b)%mod比较大小*进制转化类型转化BigDecimal精度问题保留n位小数摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1, 对应的十进制数是92…...

了解Nginx,这一篇就够了
了解Nginx,这一篇就够了1.Nginx应用场景2.Nginx相关概念正向代理和反向代理负载均衡动静分离3.Nginx配置文件解析全局块events块http块1.Nginx应用场景 HTTP服务器:Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可…...

k8s删除pod或deployment
查看pod或者deployment信息 deployment: kubectl get deployment -n 命名空间pod: kubectl get pod -n 命名空间删除pod或者deployment 删除pod: kubectl delete pod <pod名> -n <命名空间>可是,此时你会发现刚刚…...

Visual Studio 2022: 增加对虚幻引擎的支持
自 Visual Studio 2022 发布以来,我们一直专注于为游戏和大型项目开发人员提供一系列生产力和性能改进。今天,我们很高兴与大家分享下一组专门用来提高虚幻引擎开发效率的功能。我们听到并看到了来自你(我们的游戏开发人员)的大量…...

【Python】以邮件的方式定时发送一天的股票分析报告
【Python】以邮件的方式定时发送一天的股票分析报告 文章目录【Python】以邮件的方式定时发送一天的股票分析报告1、Python发送邮件1)EmailSender封装2)可能存在的问题2、jinja2动态渲染html页面3、阿里云OSS搭建图床1)Python上传图片到OSS中…...

mybatis条件构造器(二)
mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…...

C++【类与对象】
文章目录类与对象(1)类与对象一1.0.面向过程和面向对象初步认识1.1.类的引入1.2.类的定义1.3.类的访问限定符及封装1.4.类的作用域1.5.类的实例化1.6.类的对象大小的计算1.8.类成员函数的this指针(2)类与对象二2.0类的6个默认成员…...

假设检验选择统计量重点-----正态总体参数的假设检验
文章目录单个正态总体参数的假设检验单个正态总体N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)的均值μ\muμ的假设检验1.σ2\sigma^2σ2已知(U检验法)单个正态总体方差的假设检验单边检验简介--计算拒绝域两个正态总体参数的假设检验方差已知的两正态总体均值的假设检验均值未知的两正态…...

华为OD机试 - 通信误码(Python) | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】 华为OD机试 - 双十一(Python) | 机试题算法思路 【2023】 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 华为OD机试 - Excel 单元格数值统计(Python) | 机试题算法思路 …...

设计模式之装饰者模式
文章の目录一、什么是装饰者模式二、优势三、缺点四、应用场景五、示例参考写在最后一、什么是装饰者模式 装饰者模式也称为包装器模式,在不改变原有对象的基础上为其动态的添加上新的功能。 装饰者模式有以下特点: 添加功能时不改变原对象结构。装饰…...