Kafka之Broker原理

1. 日志数据的存储

1.1 Partition

1. 为了实现横向扩展,把不同的数据存放在不同的 Broker 上,同时降低单台服务器的访问压力,我们把一个Topic 中的数据分隔成多个 Partition
2. 每个 Partition 中的消息是有序的,顺序写入,但是全局不一定有序
3. 在服务器上,每个 Partition 都有一个物理目录( TopicN )后面的数字代表分区

 

1.2 Replica副本

1. 为了提高分区的可靠性, Kafka 设计了副本机制
2. 副本数必须小于等于节点数,而不能大于 Broker 的数量
3. Leader 对外提供读写服务, Follower 唯一的任务就是从 Leader 异步拉取数据

 

1.3 Segment段

1. 为了防止Log不断追加导致文件过大,导致检索消息效率变低,一个Partition又 被划分成多个Segment来组织数据.

在这里会有3个配置,也就是log的阈值配置。什么时候下进行分段

  • log.segment.bytes :根据日志文件大小
  • log.roll.hours log.roll.ms :根据时间戳差值

    log.index.size.max.bytes:根据索引文件大小

每一个segment都是由一个log文件和2个index文件组成的,其中时间戳索引的创建方式可以自定义的执行createTime或LogAppendTime.默认是creareTime

 1.4 Sparse Index(稀疏索引)

索引文件的查看可以通过以下命令进行查看

 kfaka索引文件中记录的Offset不是连续的,而是采用了稀疏索引。根据配置的大小,稀疏索引记录的是从Log中的哪个位置开始检索,比如配置的是4kb,则当log文件中向下存储的数据达到4kb的话,就会记录一个索引值

 1.5 分区副本在Broker上的分布

创建一个topic

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--create--topic3p3r--partitions3--replication-factor3

 假设配置的是3p3r,则我们看下服务器上的存储

查看Topic信息

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--describe--topic3p3r

 其中 Partition是分区,Leader后面代表的是在哪台服务器上,Replicas就是副本信息,ISR是个副本队列

 假设配置的是4p2r,则物品们查看topic信息如图所示

创建、查看topic

./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --create --topic 4p2r --partitions 4 --replication-factor 2
./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --describe --topic 4p2r

 假设我们配置的是6p2r

由以上我们可以看出,副本分配的两个基本原则和规律

1、副本会被平均分布在所有的Broker之上

2 partition 的多个副本应该分配在不同的 Broker

基于上面的规则,分区副本最终落入哪个节点,还会收到两个随机数的影响

1、第一个随机数:startIndex,决定了第一个分区的第一个副本的放置位置

2 、第二个随机数: nextReplicaShift ,决定了分区中,副本跟副本的间距nextReplicaShift%(BrokerSize-1)

这样设计的目的在于提高Broker服务器的容灾能力 

2. 消息保留与清理机制

对于一些太久的日志,我们需要一定的清理策略。

当开启清理策略后,有两种方式提供开发者选择

log.cleanup.policy=delete (默认项) // 删除策略
log.cleanup.policy=compact    // 压缩策略

 2.1 删除策略(delete)

kafka可以通过定时任务实现日志数据的删除,默认5分钟执行一次

log.retention.check.interval.ms=300000

那么要删除什么样的数据呢?kafka提供了两个纬度以及对应不同的配置

时间纬度

log.retention.hours(默认值是168个小时,时间戳超过的数据会被删除)

log.retention.minutes (默认值是空,优先级比小时高)
log.retention.ms (默认值是空,优先级比分钟高)

若产生消息的速度不均匀,有时多、有时少,就可以根据日志大小删除

log.retention.bytes (表示所有日志文件的总大小,默认值是 -1 ,代表不限制大小)
log.segment.bytes (对单个 Segment 文件大小进行限制,默认值 1G

 2.2 压缩策略(compact)

若设置为压缩策略compact,则表示不清楚日志,只对日志数据进行压缩处理

思考问题: 如果同一个key重复写入多次,是会存储多次?还是会更新?

kafka中是存储多次的,如: _ _consumer_offsets

那么压缩策略是怎么做的呢?(将相同的key进行去重压缩)

3. Broker高可用架构

高可用,无非就是选举机制、数据的一致性也就是主从同步,以及对于故障的处理,由于kafka是直接数据存储在磁盘中的,因此无需考虑持久化,Broker的高可用 涉及到一系列的动作 

  • 选举出一个Controller
  • 从分区中选举出Leader角色
  • 主从同步
  • Replica故障处理

3.1 选举机制

3.1.1 Controller选举

Controller其实就是一个Broker,由它来负责选举出新的Leader,那么Controller是怎么选举出来的呢

 3.1.2 分区副本Leader的选举

在讲解Leader选举前,我们先复习以下博客Kafka之Producer原理-CSDN博客中提到的ISR机制的几个概念

AR Assigned-Replicas ),一个分区所有的副本
ISR In-Sync Replicas ),在 AR 中,跟 Leader 保持积极同步数据的副本
OSR Out-Sync-Replicas ),在 AR 中,跟 Leader 同步滞后的副本
AR = ISR + OSR
  •  当Leader副本发生故障时,只有在ISR中的副本才能参与新Leader的选举
    • 问题:如果ISR为空呢? unclean.leader.election.enable配置为false OSR也可以进行选举
  • Kafka采用了类似于继位传嫡的选举协议,选择ISR中位置靠前的节点成为新的Leader.

3.2 主从同步

从节点和主节点的同步过程如下:

1 、首先, Follower 节点向 Leader 发送一个 fetch 请求
2 、然后, Leader Follower 发送数据
3 、接着, Follower 接收到数据响应后,依次写入消息、并更新 LEO
4 、最后, Leader 更新 HW ISR 最小的 LEO
5 、循环上述过程,直至所有 Follower 完成数据同步

 整体流程图如下所示:

 

 

 Kafka设计的ISR复制,既可以在保障数据一致性,又可以提供高吞吐量(ISR队列中清除响应不积极的Follower节点)

3.3 Replica故障处理

  • Follower发生故障,会被先提出ISR,Follower恢复之后,从HW开始同步数据
  • Leader发生故障,会先选举出一个新的Leader,其它的Follower将高于HW的消息截取掉,然后从新的Leader同步数据

4. 总结

        本文介绍Broker服务器,主要讲了Broker中日志的存储,从大到小依次为Partition、Segment,副本机制的具体存储形式,是怎么进行负载均衡和容灾保障的,在Segment中我们直到了Segment是由一个Log文件和两个索引文件组成的,索引文件主要起的是一个提升查询效率的作用。随后当kafka中log文件过大的时候,kagka中提供了两种维度上的删除策略以及相同key去重压缩的compact策略。最后,kafka高可用中的选举机制是先到先得选举Controller,再根据ISR副本队列嫡长子继位的算法进行Leader的选举;以及Kafka中的主从同步是以高水位HW为界限,不断的同步数据,直到LEO值相等完成数据的同步。最后讲到了副本故障的处理,针对follwe节点故障,则直接踢出ISR队列,Leader故障,就会触发选举机制,选举出一个新的Leader,最后数据从LEO处以上的开始同步,高于HW的消息全部截断。

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

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

相关文章

【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战

目录 一、引言 二、模型简介 2.1 Qwen1.5 模型概述 2.2 Qwen1.5 模型架构 三、训练与推理 3.1 Qwen1.5 模型训练 3.2 Qwen1.5 模型推理 四、总结 一、引言 Qwen是阿里巴巴集团Qwen团队的大语言模型和多模态大模型系列。现在,大语言模型已升级到Qwen1.5&…

分布式session共享配置

目录 1、spring-session 1.1 添加依赖 1.2 spring-mvc.xml配置文件 1.3 web.xml 2、tomcat配置session、共享 2.1 Tomcat配置 2.2 Web.xml配置 1、spring-session 官方文档:https://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/ 1.…

【vue-7】图片轮播

实现功能&#xff1a; 1、通过button实现图片轮训播放&#xff1b; 2、通过标签列表项实现图片的播放&#xff1b; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

AI网络爬虫:对网页指定区域批量截图

对网页指定区域批量截图&#xff0c;可以在deepseek的代码助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;一步一步的思考&#xff0c;完成一个对网页指定区域截图的python脚本的任务&#xff0c;具体步骤如下&#xff1a; 设置User-Agent: Mozilla/5.0 (…

【AIOT-Robot】3D pos 相关

1. Mediapipe 3D detection 使用移动增强现实(AR)会话数据(session data),开发了新的数据pipeline。大部分智能手机现在都具备了增强现实的功能,在这个过程中捕捉额外的信息,包括相机姿态、稀疏的3D点云、估计的光照和平面。 利用相机的姿势、检测到的平面、估计的照明,来生…

JVM学习-监控工具(一)

使用数据说明问题&#xff0c;使用知识分析问题&#xff0c;使用工具处理问题 无监控&#xff0c;不调优&#xff01; 命令行工具 在JDK安装目录下&#xff0c;可以查看到相应的命令行工具&#xff0c;如下图 jps(Java Process Status) 显示指定系统内所有的Hotpot虚拟机…

网络工程师----第四十七天

1、请简述super vlan和sub vlan的区别&#xff1f; 2、请简述mux vlan 中不同vlan的特点&#xff1f; 3、请基于工作原理简述GVRP协议中三种接口模式的特点&#xff1f; 4、请简述STP的选举过程&#xff1f; 5、两台交换机在不增加成本的情况下为提高链路带宽和可靠性采用链路聚…

STM32与陶晶驰串口屏交互

1、串口屏界面设计 1.新建工程 保存位置自定义&#xff0c;作为一个合格的嵌入式工程师要有路径下没有中文的情况并命名。 选择自己串口屏对应的芯片&#xff0c;一般屏幕背面会有&#xff0c;也可以查看资料。 选择显示方向&#xff0c;自行选择。按照自己的爱好 右边可对当前…

Android约束布局ConstraintLayout的使用

Android引入约束布局的目的是为了减少布局层级的嵌套&#xff0c;从而提升渲染性能。约束布局综合线性布局、相对布局、帧布局的部分功能&#xff0c;缺点也很明显&#xff0c;就是可能要多写几行代码。所以约束布局使用时&#xff0c;还得综合考虑代码量。提升性能也并不一定非…

EulerMaker Yocto Open Build Service

EulerMaker & Yocto & Open Build Service 1 介绍1.1 概述 2 工具2.1 Yocto 【嵌入式领域】介绍目标好处三大关键组件创建流程发行版本 2.2 Open Build Service 【OBS】【服务器领域】介绍应用 2.3 EulerMaker 【全场景】介绍特性需求背景&#xff08;1&#xff09;能支…

群体优化算法---鲸鱼优化算法应用于电力系统优化

介绍 鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种基于鲸鱼行为的智能优化算法&#xff0c;由Seyedali Mirjalili等人于2016年提出。WOA受鲸鱼捕食行为的启发&#xff0c;尤其是座头鲸的气泡网捕食策略&#xff0c;模拟了鲸鱼围绕猎物游动和…

Qt图像处理技术十二:QImage实现边缘检测(sobel算法)

效果图 原理 Sobel算法是一种常用的边缘检测算法&#xff0c;它利用图像的灰度变化来检测图像中物体的边缘。Sobel算法主要包括以下几个步骤&#xff1a; 灰度化&#xff1a; 首先将彩色图像转换为灰度图像&#xff0c;因为灰度图像只包含单通道的灰度信息&#xff0c;有利于…

LeetCode刷题之HOT100之全排列

九点半了&#xff0c;做题吧。聊天聊到十一点多哈哈。 1、题目描述 2、逻辑分析 给定一个不重复数组&#xff0c;要求返回所有可能的全排列。这道题跟我上一道题思想一致&#xff0c;都是使用到回溯的算法思想来解决。直接用代码来解释吧 3、代码演示 public List<List&…

java的clone

一、clone的用法&#xff1a; package chatRoom.F5;class Person implements Cloneable{//1.public String name;public Person(String name) {this.name name;}//2.protected Person clone() throws CloneNotSupportedException {return (Person)super.clone();//重写Object…

mac安装nigix

1. 查看是否存在 nginx 执行brew search nginx 命令查询要安装的软件是否存在 brew search nginx 2. 安装nginx brew install nginx 3. 查看版本 nginx -v 4. 查看信息 查看ngxin下载的位置以及nginx配置文件存放路径等信息 brew info nginx 下载的存放路径 /usr/loca…

Django基础学习(一)

前端开发 目的&#xff1a;开发一个平台(网站)- 前端开发&#xff1a; HTML, CSS,JavaScript- web框架&#xff1a;接收请求并进行处理- MySQL数据库&#xff1a;存储相应的数据1.快速开发网站 pip install flask创建项目并导入flask框架,然后建立网址和函数的对应关系。 fr…

C++设计模式——Adapter适配器模式

一&#xff0c;适配器模式简介 适配器模式是一种结构型设计模式&#xff0c;用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如&#xff0c;现有一个名为"Reader()"的API接口只能解析txt格式的文件&#xff0c;给这…

JavaEE_CAS_Synchronized原理_线程安全集合类

文章目录 一、CAS1.什么是CAS2.CAS有哪些应用1.实现原子类 - AtomicInteger2.基于CAS实现的自旋锁3.CAS的ABA问题 二、Synchronized原理1.基本特点2.偏向锁3.锁消除4.锁粗化 三、JUC(java.util.concurrent)的常见类1.Callable接口2.ReentrantLock3.信号量Semaphore4.CountDownL…

11.7 堆排序

目录 11.7 堆排序 11.7.1 算法流程 11.7.2 算法特性 11.7 堆排序 Tip 阅读本节前&#xff0c;请确保已学完“堆“章节。 堆排序&#xff08;heap sort&#xff09;是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”…

(uniapp)简单带动画的tab切换效果

效果图 代码 <template><view class"tabBox"><view :style"{transform: translateX(${translateX})}" class"whiteBox"></view><view click"changeTab(k)" class"itemBox" v-for"(v,k) in…