三、简单了解kafka设计原理

news2025/1/15 6:55:29

系列文章目录


文章目录

  • 系列文章目录
  • 一、Kafka核心总控制器Controller
  • 二、kafka高性能简单理解


一、Kafka核心总控制器Controller

在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。

  • 当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。
  • 当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。
  • 当使用kafka-topics.sh脚本为某个topic增加分区数量时,同样还是由控制器负责让新分区被其他节点感知到。
    关于总控制器是怎么选出来的呢?
    在这里插入图片描述
    情况一:
    如果kafka集群是一台一台启动的,那么最先启动的就是controller。
    情况二;
    同时启动,所有的kafka节点都会向zookeeper发送create命令,谁先创建成功,谁就是controller,如果controller挂了,还是会按照这样重新选举。
    controller具体细节:
    1.监听broker相关的变化。为zookeeper中的/brokers/ids/节点添加BrokerChangeListener,用来处理broker增加减少变化(kafka集群增加减少节点)
    2.监听topic相关变化。为zookeeper中的/brokers/topics/节点添加TopicChangeListener,用来处理topic的增加减少变化。为zookeeper中的/admin/delete_topics/[topic]/节点添加TopicDeletionListener,用来处理删除topic的动作。
    3.从zookeeper中获取当前所有的与topic、partition和broker有关的信息进行相应的管理。对于所有topic所对应的zookeeper中的/brokers/topics/[topic]/中添加PartitionModificationsListener,用来监听topic中的分区分配变化。
    4.更新集群的元数据信息,同步到其他普通的broker节点中。

Partition副本选举Leader机制
controller感知到分区leader所在的broker挂了(controller监听了很多zookeeper节点可以感知到broker存活),controller会从ISR列表(配置为unclean.leader.election.enable=false的前提下)里挑一个broker为leader,如果isr列表里边都挂了,那么会一直卡在这块,影响消息的写入。(在Isr前面的broker,也就是最先放假isr列表的broker,可能是同步数据最多的副本),如果配置为unclean.leader.election.enable=true,这种情况下,只有在isr列表的broker都挂了之后,回去取isr列表之外的存活的broker,这种设置可以提高可用性,但是新的leader可能有部分数据没有同步,数据会少很多。
消费者消费消息的offset记录机制
每个consumer会定期将自己消费分区的offset提交给kafka内部topic:_consumer_offsets,提交过去的时候,key是consumerGroupId+topic+分区号,value就是当前的offset值,kafka会定期清理topic里的消息,最后就保留最新的那条数据,因为_consumer_offsets可能会接受高并发的请求,kafka默认给其分配50个分区(通过offsets.topic.num.partitions设置),这样做的好处是可以更好的抗并发。
如果没有指定提交的分区,会有一个公式来计算提交的那个分区上。
公式:hash(consumerGroupId) % __consumer_offsets主题的分区数

消费者Rebalance机制
rebalance就是消费组里的消费者数量变化,或者消费的分区数有变化,kafka会重新分配消费组消费分区的关系。例如消费组中某个消费者挂了,此时会自动把分配给他的分区交给其他消费者,如果他又重新启动,那么又会把一些分区重新分给他。
Rebalance只针对subscribe这种不指定分区消费的情况,如果通过assign指定分区消费,则kafka不会进行rebanlance
可能触发kafka的Rebalance的情况:
1.消费组里的consumer增加或减少了。
2.动态给topic增加了分区
3.消费组订阅了更多的topic
Rebalance过程中,消费者无法从kafka消费消息,这对kafka的tps会有影响,如果kafka集群内节点较多,那么重平衡会耗时非常多,尽量避免业务高峰时间发生。
消费者Rebalance分区分配策略:
主要有三种策略:range、round-robin、sticky。
1.range:按照分区序号排序。假设 n=分区数/消费者数量 = 3, m=分区数%消费者数量 = 1,那么前 m 个消费者每个分配 n+1 个分区,后面的(消费者数量-m )个消费者每个分配 n 个分区。比如分区0-3给一个consumer,分区4-6给一个consumer,分区7-9给一个onsumer。
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

二、kafka高性能简单理解

1.磁盘顺序读写:kafka不能修改以及不会从文件中间删除保证了磁盘顺序读(保证数据连续),kafka的消息写入文件都是追加在文件末尾,不会写入文件中的某个位置保证了磁盘顺序写。
2.数据传输零拷贝
3.读写数据的批量处理,以及压缩传输

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[ZJCTF 2019]Login--动态调试--详细版

前言 主要是因为太菜了,看了别人的exp,还是懵懵懂懂的,都是静态分析,不明白为会在改密码的时候会导致最后的getshell。今天给它动态分析整一个,看看到底哪里出错了。 基本原理 网上有很多介绍的,在这里说…

Linux学习——01 gcc编译器

一、程序构建过程 高级语言的代码无法被计算机执行,需要将高级语言代码编译成汇编语言,然后再将汇编语言翻译成机器指令,最后通过链接生成最后的可执行文件,此时该文件才可以被计算机执行。总共有四步: 1.1 预编译&a…

[02] BLEMotion-Kit 基于QMI8658传感器使用加速度计进行倾斜检测

文章目录1. 先修知识2. 原理(单轴为例)2.1 单轴倾斜2.2 双轴倾斜2.3 三轴倾斜1. 先修知识 2. 原理(单轴为例) 首先我们要知道的是:当目标轴(本例中为X轴)与地球表面平行时,传感器处于 0g 场。顺时针或逆时针旋转90 将…

springboot+java大学生西部计划志愿者岗位补助管理系统

本课题要求实现一套大学生西部计划管理系,系统主要包括系统个人中心、志愿者管理、岗位信息管理、补助信息管理、交流论坛、系统管理等功能模块。 为完善志愿者、岗位信息,应当建立健全志愿者的补助和管理机制,建立有效的激励机制&#xff0c…

Android Studio无法连接设备,一直显示Loading Devices...

不知道什么时候做了啥,从某个时间点之后,电脑就特别容易断开adb,有时候重启电脑都不管用。 一直显示"Loading Devices...",拔插设备,重启Android Studio都没用,甚至重启电脑有时候也不行。 反正…

全部售罄!1,000 多个Sports Land NFT 在 24 小时内被抢空!

现在还来得及,抓紧时间!👀 在不到24小时的时间里,来自《Sports Land:足球爱好者》作品集(2022 年 11 月 16 日发布)的1000 多个可穿戴 NFT 已被售出! 祝贺 Hermit Crab Game Studio …

bootstrap学习(一)

(1)bootstrap第一个程序 (2)bootstrap排版 (1)bootstrap第一个程序 创建boot文件夹方置bootstrap所需要的文件目录,拷贝过来 创建base目录,创建html页面: 引入css&#…

python复杂网络分析库NetworkX

文章目录1.Networkx简介2.图的类型(Graphs)3.图的创建(Graph Creation)4.图的属性(Graph Reporting)5.图算法(Algorithms)6.图的绘制(Drawing)7.数据结构8.图…

A股api交易接口文档怎么使用?

A股api交易接口是在股票量化交易中常用到的一种量化工具,对于它的用法,小编针对性的以文档的例子说明: 交易接口API 功能概述: 名称 功能 基本函数 Init API 初始化 Deinit API 反初始化 Logon 登录交易账户 Logoff 登…

年底了,接个大活儿,做一个回顾公司五年发展的总结ppt,要求做成H5网页

公司想做个五年总结 这不快年底了么,公司高层打算把这五年的发展历程做一次回顾巡礼,一方面宣扬一下公司文化,另一方面歌颂一下公司这五年来取得的辉煌成就,单纯的做个海报,写个公众号文章,或整个传统ppt在…

最强大脑记忆曲线(11)—— 30天结束第一轮复习后的操作

对于30天以后,结束第一轮(6次)复习以后,我们要做点什么操作呢? 对第一轮复习效果的评判可以是客观的,也可以是主观的。所谓客观的,是按“复习的正确率”来评判,大于某个值&#xff0…

内部类_Java

作者:爱塔居的博客_CSDN博客-JavaSE领域博主 专栏:JavaSE 文章目录 目录 文章目录 一、内部类的概念 二、内部类的分类 1.静态内部类(被static修饰) 2.非静态内部类 3.局部内部类 4.匿名内部类 一、内部类的概念 当一个事物…

【JVM】jvm的双亲委派机制

双亲委派机制一、JVM体系结构二、双亲委派机制的含义三、双亲委派机制的源代码四、双亲委派机制的意义五、示例代码一、JVM体系结构 我们先在这里放一张 JVM 的体系架构图,方便我们有个总体认知。 在了解JVM的双亲委派机制之前,你不得不需要知道的几个…

【Mapbox GL JS 入门】Hello world

目录Mapbox GL JS 简介安装Access tokenHello worldMapbox GL JS 简介 官网:https://www.mapbox.com/ git:https://github.com/mapbox/mapbox-gl-js/ 是一个客户端JavaScript库,为了web开发人员可以在web浏览器中动态绘制地图,在…

pico3pro使用unity播放360全景视频及事件交互

1.准备好全景视频,看起来是这样子的。 2.新建一个Materal 注意选择Shader如上图,Render Queue选择AlphaTest,因为我们要在视频前面放置按钮,UI的渲染值为3000,所以可以避免UI不显示的问题,这样UI会一直显示…

代码随想录算法训练营第四十一天| LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 1:题目描述(343. 整数拆分) 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 2:…

【Linux系统】网络配置保姆级教学

目录 文章目录网络配置yum install tree 安装和tree显示Linux网络配置[原理图](https://so.csdn.net/so/search?q原理图&spm1001.2101.3001.7020)查看ip和网关ipconfig查看windows网络配置ifconfig查看Linux网络配置ping测试主机之间网络连通性Linux网络环境配置**第一种方…

在 Azure AKS 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。针对大规模分布式物联网 MQTT 消息服务器 EMQX 全生命期管理的自动化管理工具 EMQX Kubernetes Operator&#xff0…

Android最全的setContentView源码分析

前言 我们在开发过程中,在布局文件里添加TextView,代码运行起来就可以看到对应文字显示出来,那系统是如何把我们的TextView加载并显示出来的呢? 源码分析(这里版本对应30) 第一阶段 我们直接从Activity.setContent…

《第一行代码》核心知识点:Activity(活动)

Android四大组件之一:Activity前言二、Android四大组件之一:Activity(活动)2.1 活动基本介绍2.2 活动的基本用法2.2.1 如何在应用中弹出提示信息2.2.2 如何在活动中添加Menu菜单(就一般右上角的三点)2.2.3 如何实现活动跳转2.2.5 …