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节点数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook安装使用教程

Jupyter Notebook 是一个基于网页的交互式计算环境,允许你创建和共享包含代码、文本说明、图表和可视化结果的文档。它支持多种编程语言,包括 Python、R、Julia 等。其应用场景非常广泛,特别适用于数据科学、机器学习和教育领域。它可以用于数…

动态SQL:MyBatis强大的特性之一

一般来说,一个程序的服务器可以部署多个,但是数据库却只能有一个。这么多服务器,如果每天都要给数据库海量的操作数据,数据库的压力就会非常大。 所以为了减轻数据库的压力,我们可以把一些查询数据库的语句简化&#…

Vulnhub靶机:FunBox 5

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:FunBox 5(10.0.2.30) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entry/funb…

服务器的组成

服务器的重要结构组成 家用电脑组成: CPU、主板、内存条、显卡、硬盘、电源、风扇、网卡、显示器、机箱、键盘鼠标等等。 CPU CPU是电脑的大脑, CPU发展史: 32 位CPU:最大的内存寻址地址2^32,大约4G的大小。 CP…

TA百人计划学习笔记 3.1.2深度测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影…

[ACM学习] 树形dp之换根

算法概述 总的来说: 题目描述:一棵树求哪一个节点为根时,XXX最大或最小 分为两步:1. 树形dp 2. 第二次dfs 问题引入 如果暴力就是 O(n^2) , 当从1到2的时候,2及其子树所有的深度都减一,其它…

UI自动化Selenium BeautifulReport报告中展示用例描述

BeautifulReport安装并运行后,发现用例描述为空NULL;怎么定义每个Testcase的用例描述并展示在报告中呢? 其实很简单: 只需要在每个测试方法第一行加上注释内容 即可; 当然也可以通过ddt 方式 在Excel中定义好用例描述…

sprignboot电商书城源码

运行环境: jdk1.8,maven,mysql 项目技术: 后台主要是springbootmybatisshirojsp,前端界面主要使用bootstrap框架搭建,并使用了ueditor富文本编辑器、highcharts图表库。 有需要的可以联系我。 功能介绍: 该系统分为前台展示和后台管理两…

【数据结构】 链队列的基本操作 (C语言版)

目录 一、链队列 1、链栈的定义: 2、链栈的优缺点: 二、链队列的基本操作算法(C语言) 1、宏定义 2、创建结构体 3、链栈的初始化 4、链队列的入队 5、链队列的出队 6、取链队列的对头元素 7、链队列的销毁 8、链…

Minio 判断对象是否存在

引 Minio数据模型 中描述了 MinIO 中什么是桶,什么是对象,也给出了操作桶和操作对象的API。 在 MinIO 中, 对象 中间前缀 对象名称 。如何判定对象是否存在呢? 分析 在 MinIO 中并没有提供判断对象是否存在的操作&#xff…

leetcode:排序链表(递归)

题目: 给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例…

【原创】linux为什么不是实时操作系统

文章目录 一、什么是实时操作系统(RTOS)?二、linux为什么不是实时操作系统?中断响应时间中断处理时间任务调度时间1、No Forced Preemption(Server)2、Voluntary Kernel Preemption(Desktop)3、Preemptible Kernel(Low-Latency De…

yarn集群HDFS datanode无法启动问题排查

一、问题场景 hdfs无法访问,通过jps命令查看进程,发现namenode启动成功,但是所有datanode都没有启动,重启集群(start-dfs.sh)后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

Java实现考研专业课程管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

/** description: 将普通的publicKey转化得到一个RSAPublicKey* author: zkw* date: 2024/1/24 16:17* param: publicKey 普通的publicKey* return: RSAPublicKey 得到一个新的RSAPublicKey**/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorit…

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力? 可能很多初学者在学完 SpringBoot 之后,做了 1-2 个项目之后,不知道该去学习什么了,其实这时候需要去学习的东西还有很多,接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机!!!!!!!)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

SpringMVC-RESTFul

文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 (GET)2.根据id查询用户信息3.添加用户(POST)4.修改用户 (PUT)5.删除用户 (DELETE) RESTFul 一、基础概念 二、增删改…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views(Model-Based) 项目视图(基于模型)4.1、 B…