当前位置: 首页 > news >正文

Kafka(二)原理详解

一 、kafka核心总控制器(Controller)

在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。
作用:leader副本出现故障时,选举新的leder;
检测到某个分区的ISR发生变化时,通知所有borker更新元数据;
分区数量发生变化时,通知其它节点感应到新分区;
(*ISR,已与leader同步的副本的集合)
Controller的选举
集群启动时每个broker都会尝试在zookeeper上创建一个controller临时节点,zk会保证有且仅有一个创建成功;其它节点会一直监听这个临时节点,如果broker宕机,其它节点会再次创建临时节点,创建成功的成为controller;
controller相对于其它broker不同的职责
1、监听broker的变化: 为Zookeeper中的/brokers/ids/节中添加BrokerChangeListener节点,处理broker增减的变化;
2、监听topic变化:为Zookeeper中的Brokers/topics节点添加TopicChangeListener,用来处理topic增减的变化;TopicDeleteinoListener,处理删除topic的动作;
3、从zookeeper中读取当前所有topic、partition以及broker相关信息并进行相应的管理;对于所有topic所对应的Zookeeper中的/brokers/topics/[topic]节点添加PartitionModificationsListener,用来监听topic中的分区分配变化;
4、更新集群的元数据信息,同步到其它普通的broker节点中;

二、Partition副本选举Leader机制

初始化patitiion 会挑选编号最大的副本为leader;

Controller感知到分区所在的broker挂了(通过监听zk中的节点),controller会从ISR(已同步的数据集)里挑第一个broker作为leader(就是同步最多数据的副本);
         unclean.leader.election.enable=false 代表已同步的副本没有全部挂掉,相反已同步的副本全部挂掉,则从未同步的副本中选出leader,这种情况下的副本会 丢失消息
        副本进入ISR的条件:
                        1、副本节点不能产生分区,必须与zk和leader保持联通
                        2、副本能复制leader的所有写操作,并且不能落后太多。(副本与leader副本数据更新时间由replica.lag.time.max.ms配置决定,超出这个时间未同步,移除ISR列表)

三、消费者消费消息的offset记录

        每个消费者会定期将自己消费分区的offset提交给kafka内部的topic,提交的key是consumerGroupId+topic+分区号,value解释当前offset的值;kafka会定期清理topic的消息,最后保留最新的那条数据;
通过增加更多的分区,提高机器的并发量;

四、消费者Rebalance机制

rebalance就是说如果消费组里的消费者数量有变化,kafka会重新分配消费者与消费分区的关系;(只针对未指定消费分区的情况,指定了分区不会进行重新分配)
触发条件:
1、消费组中的消费者数量发生变化
2、增加了topic的分区
3、消费组订阅了更多的topic
rebalance过程中无法消费消息,如果集群内节点较多,此过程会相当耗时;
  Rebalance的工程
1、选择组协调器(GroupCoordinator):每个消费组都会选择一个broker作为自己的组协调器(coordinator),负责监控这个消费组里的所有消费者心跳,判断是否宕机;消费组中的每个消费者都会启动时向kafka集群中的某个节点发送findCoordinatorRequest请求来查找对应的组协调器;
选择公式:hash(consumer group id)%_consumer_offsets主题分区数;
2、加入消费组:成功找到组协调器后加入消费组,发送joinGroupRequest请求,组协调器会将第一个加入的消费者选为leader(消费组协调器),把consumer group情况发送给这个leader,这个leader负责指定分区方案;
3、方案同步:消费组leader(消费组协调器)向groupCoordinator发送SyncGroupRequest,groupCoordinator将方案下发给所有消费者,各个消费者将与指定的分区leader建立连接进行消费
Rabalance分区分配策略:range、round-robin、stocky
假设一个主题十分分区,现在又三个消费者:
rang策略:就是按照分区序号排序,假设 n=分区数/消费者数量 = 3, m=分区数%消费者数量 = 1,第一个消费者得到的分区为n+1(0~3),第二个消费者n(4~6),第三个消费者(7~9);
round-robin轮训策略:第一个消费者(0,3,6,9),第二个消费者(1,4,7),第三个消费者(2,5,8)
stocky与rouond-robin初试分配类似,  在rebalance的时候需要保证两个原则:
1、分区的分配要尽可能均匀
2、分区的分配尽可能与上次分配保持相同;
第一个目标优于第二个目标;比如第三个消费者挂了,原有的分配,第一个消费者(0,3,6,9),第二个消费者(1,4,7),第三个消费者(2,5,8);重新分配会将2分配给第一个消费者,5,8分给第二个消费者;

五、消息推送机制

1、写入方式producer push消息到broker,消息会被添加到patition最后,顺序写入磁盘(顺序写入效率比随机高)保证吞吐量;
2、消息路由机制:
a、指定patition,直接使用
b、未指定patition指定key,通过对key的hash选出patition
c、=都为指定,轮训
3、写入流程
1、producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader
2、producer 将消息发送给该 leader
3、leader 将消息写入本地 log 4. followers 从 leader pull 消息,写入本地 log 后 向leader 发送 ACK
5、leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK
 
六、HW与LEO详解(broker宕机后消息的保障)
HW俗称高水位,HighWatermark的缩写,取一个partition中对应的最小的LEO(log-end-offset)作为HW,consumer最多只能消费到HW所在位置。每个副本都有HW,leader和follower各自负责更新自己的HW。leader写入消息,consumer不能立刻消费,leader会等待该消息被所有ISR中的replicas同步更新后,consumer才能消费,这样即使broker挂了,新选举出来的消息仍然可以充新的leader中获取;(broker内部拉去消息,没有HW的限制)
kafka 的复制并非是完全同步复制,也并非是异步复制。同步复制要求所有的副本全部复制完成才会commit,这种复制性能较低;异步复制又不能保证消息不丢失;kafka的复制要结合提交的acks参数讨论;

六、日志分段存储

kafka一个分区的消息数据对应存储在一个文件夹下,以topic名称+分区号命名,消息在分区内是分段(segment)存储的,每段消息都存储在不一样的log文件里,方便快速删除,每个分段最大不能超过1g;方便加载到内存中;
部分消息的 offset 索引文件, kafka 每次往分区发 4K ( 可配置 ) 消息就会记录一条当前消息的 offset index 文件,如果要定位消息的offset 会先在这个文件里快速定位,再去 log 文件里找具体消息
00000000000000000000. index
消息存储文件,主要存 offset 和消息体
00000000000000000000. log
消息的发送时间索引文件, kafka 每次往分区发 4K ( 可配置 ) 消息就会记录一条当前消息的发送时间戳与对应的 offset timeindex 文件,如果需要按照时间来定位消息的 offset ,会先在这个文件里查找
00000000000000000000. timeindex
文件如下:
00000000000005367851. index
00000000000005367851. log
00000000000005367851. timeindex
00000000000009936472. index
00000000000009936472. log
00000000000009936472. timeindex
kafka在zookeeper节点数据

相关文章:

Kafka(二)原理详解

一 、kafka核心总控制器(Controller) 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 作用:leader副…...

Flutter 屏幕适配之相对尺寸适配

在Android中我们可以通过脚本来动态生成适配于各个厂商的屏幕的相对尺寸。 那么在Flutter中我们如何通过相同的思路来实现同样的效果呢?我们知道,Android的每个厂商的屏幕大小存在非常大区别。有些长,有的短,有的粗,有…...

在线预约小程序源码系统:适合任何行业的在线预约,快捷方便,省时省心 带完整的搭建教程

互联网技术的发展,人们对便捷服务的需求越来越高。特别是在线预约服务,无论是在医疗、美容、餐饮还是其他行业中,用户都希望能够通过简单的方式预约到所需的服务。然而,传统的预约方式往往效率低下,不能满足用户的快速…...

AI部署开发指南:用vs2019编译OnnxRuntime-v1.16.2

前言 要详细了解一个系统的部署,对其源码进行调试可能是最好的办法。 Pytorch的部署几经改版,最大的特点依然是不稳定,或者使用libtorch这种稳定但优化力度不够的部署方案。 而稳定且通用的方案,目前仍然是export to onnx的办法…...

【强化学习】QAC、A2C、A3C学习笔记

强化学习算法:QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式,它通过梯度上升方法来寻找最优策略。然而,REINFORCE算法也有其局限性,采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…...

android usb2.0 协议基础(2)

2.4 USB逻辑部件 USB 逻辑部件 设备---》 接口 (一个或多个):用于描述特定功能,包含多个端点----》端点(一个或多个): 传输的最终对象端点号,传输类型传输方向,最大的数据…...

C语言快速排序(非递归)图文详解

前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈…...

Java面试题136-150

36、用JDBC如何调用存储过程 代码如下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest…...

使用trace工具分析Mysql如何选择索引

背景说明 工作中,可能会遇到执行一个SQL,明明有索引,但是采用explain分析后发现执行结果并未走索引。甚至还有部分SQL语句相同就只是查询条件不一样也会出现有的走索引,有的不走索引情况。比如: 我的示例环境有个employees表,并有个idx_name_age_position的联合索引…...

微信小程序(十二)在线图标与字体的获取与引入

注释很详细,直接上代码 上一篇 新增内容: 1.从IconFont获取图标与文字的样式链接 2.将在线图标配置进页面中(源码) 3.将字体配置进页面文字中(源码) 4.css样式的多文件导入 获取链接 1.获取图标链接 登入…...

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…...

java web mvc-04-Apache Wicket

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…...

运行Navicat转储的数据库SQL文件失败

报错:1067 - Invalid default value for ‘publish_date’ 单独拎出来该建表语句执行,报错一样,都是默认值出错 查看该字段的设计语句 publish_date timestamp NOT NULL DEFAULT 0000-00-00 00:00:00 COMMENT 发布时间, 发现该字段的默认值…...

动静态库的理解、制作、使用。

一.动静态库的理解。 1.什么是库? 代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力…...

【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)

背景需求: 上个月,看到大4班一个孩子在玩“点兵点将点到谁就是谁”的小游戏,他在桌上摆放两排奥特曼卡片,然后点着数“点兵点将点到谁就是谁”,第10次点击的卡片,拿起来与同伴的卡片进行交换。他是从第一排…...

cherry键盘alt+tab无法切换窗口的问题解决

现象: alt 好用, tab好用,tabalt不好用。 原因: 键盘误触了关闭了alttab的功能。 不同的樱桃键盘可能方法不一样,下面是两个方案,本人的键盘是MX6.0 G80 3930红轴,用的方法一解决就了&#…...

「nuxt2配置tailwindcss」nuxt2添加tailwindcss详细步骤!解决版本不对称各种报错~~

运行环境 node和npm使用版本 node v14.21.3 (npm v6.14.18) 1.插件下载 官方文档说明 npm install -D nuxtjs/tailwindcss3.4.3 tailwindcss3.4.1 postcss^8.4.33 autoprefixer10.4.17 2.nuxt.config.js配置 module.exports {// ...buildModules: [nuxtjs/tailwindcss],// …...

1、中级机器学习课程简介

文章目录 1、课程简介2、先决条件 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 1、课程简介 欢迎来到机器学习中级课程! 如果你对机器学习有一些基础,并且希望学习如何快速提高模型质量…...

Mybtisplus对时间字段进行自动填充

一、引入依赖 <!-- mybatis-plus-boot-starter--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency> 二、配置类 这里我…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...