再过半小时,你就能理解Kafka的基本原理了

news2024/11/15 11:32:41

kafka总结

  • 一.定义
  • 二.基础架构及术语
  • 三.工作流程分析
    • 3.1发送数据
    • 3.2保存数据
      • 3.2.1 partition结构
      • 3.2.2 message结构
      • 3.2.3 存储策略
      • 3.2.4 消费数据

一.定义

Kafka是一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据,具有高性能,持久化,多副本备份,横向扩展能力等。

二.基础架构及术语

在这里插入图片描述
Producer: 生产者,消息的生产者,消息的入口
Kafka cluster:
Broker: brocker是kafka的实例,每个服务器上有一个或多个kafka的实例,每个broker对应一台服务器,每个kafka集群内的broker都有一个编号,如broker0,broker1等
Topic: 消息的主题,可以理解为分类,kafka的数据就保存在topic。在每个broker上可以创建多个topic
Partiton: Topic的分区,每个topic有多个分区,分区的作用做负载,提高kafka的吞吐。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹
Replication: 每一个分区都有多个副本,主分区也就是leader故障的时候就会选择一个备胎(follower)上位升级成一个leader,在kafka中默认副本的最大数量是10个,副本的数量不能大于broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只能存放一个副本
Message: 每一条发送的消息主体
Consumer: 消费者,即消息的消费方,是消息的出口
Consumer Group: 我们可以将多个消费者组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量
Zookeeper: kafka集群依赖zookeper来保存集群的元信息,保证系统的可用性

三.工作流程分析

3.1发送数据

生产者在写入数据的时候永远先找leader,不会直接将数据写入备胎
在这里插入图片描述
消息写入leader之后,follower是主动去找leader进行同步,生产者把数据push到broker,每条消息追加到分区中,顺序写入磁盘,写入磁盘的顺序如下:
在这里插入图片描述
所以kafka为什么要做分区有如下几个目的:

  • 方便扩展,一个topic可以有多个partition,所以我们通过扩展机器去轻松的应对逐渐增长的数据量
  • 提高并发,以partition为读写单位,可以多个消费者进行同时消费,提高消息处理效率

那么在Kafka中,某个topic有多个partition,生产者怎么判断将数据发往哪个partition?

  1. partition在写入的时候是可以指定需要写入的partition,如果有指定,则写入对应的partition
  2. 如果没有指定partition,但是设置了数据的key值,则会根据key值的hash一个对应的partition
  3. 如果前两者都没有,则轮询选择

在生产者写数据时如何保证数据不丢失呢?

  1. 通过ACK应答机制,在生产者向队列写入数据时可以设置参数来确定是否接收到数据,这个参数数据可以设置为0
  2. 0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高
  3. 1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功
  4. all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低

如果生产者向不存在的topic分区中写入数据,Kafka会自动创建topic,分区和副本的数量根据默认配置都是1

3.2保存数据

producer将数据写入后,集群就要对数据进行保存了,Kafka是将数据保存在磁盘中,Kafka会单独开辟一块磁盘空间,顺序写入数据(效率比随机写入高)

3.2.1 partition结构

每个topic都可以分为一个或多个partition,如果topic理解起来抽象,那么partition比较具体,本质在服务器上就是一个一个的文件夹,每一个partition文件夹下面会有多个segment文件,每组segment文件又包含.index文件、.log文件、.timeindex文件,log文件存储message,index和timeindex为索引文件,用于检索消息
在这里插入图片描述
如上图,这个partition有三组segment文件,每个log文件的大小是一样的,但是存储的message数量是不一定相等的(每条的message大小不一致)。文件的命名是以该segment最小offset来命名的,如000.index存储offset为0~368795的消息,kafka就是利用分段+索引的方式来解决查找效率的问题。

3.2.2 message结构

log文件时存储message的地方,那么producer在向kafka写入的也是一条条的message,那么存储在log的message是什么样子的,消息主要包含消息体、消息大小、offset、压缩类型等,主要关注如下三点:

  1. offset:是一个占8byte的有序id号,可以确定每条消息在partition内的位置
  2. 消息大小:消息大小占用4byte,描述消息大小
  3. 消息体:消息体存放的是实际的消息数据,占用的空间根据具体的消息而不一样

3.2.3 存储策略

无论消息是否被消费,kafka都会保存所有的消息,那么对于旧数据有什么淘汰策略呢?

  1. 时间策略:默认配置168小时(7天)
  2. 大小策略:默认是1073741824

需要注意的是,kafka读取特定消息的时间复杂度是O(1),所以这里删除过期的文件并不会提高kafka的性能

3.2.4 消费数据

消息存储在log文件后,消费者可以开始消费了,多个消费者组成一个消费者组,每个消费者组都有一个组id,同一个消费者组的消费者可以消费同一topic下不同分区的数据,但是不会消费同一分区的数据!
在这里插入图片描述
上图中消费者组内的消费者小于partition,3个消费者,4个分区,这样就会出现消费者消费多个partition数据的情况,可能消费不过来,简单说就是供大于求,如消费者数大于分区数,是否会出现供不应求的情况,这种情况是不会出现的,多出来的消费者是不消费任何partition的数据的,所以在实际应用中,建议消费者的数量和分区数量一致。


在保存数据那里说过,partition划分为多组segment,每个segment又包含几个文件,存放的每条message包含offset、消息大小、消息体等。那么在查找过程中,每次提到segment和offset,比如现在想要查找一个offset为368801的message,该怎么找呢?
在这里插入图片描述

  1. 先找到offset的368801message所在的segment文件(二分法)
  2. 打开找到的segment中的.index文件(368796.index,起始偏移量为368796+1,我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引。
  3. 根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message
  4. 这套机制是建立在offset为有序的基础上,利用segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!至此,消费者就能拿到需要处理的数据进行处理了。那每个消费者又是怎么记录自己消费的位置呢?在早期的版本中,消费者将消费到的offset维护zookeeper中,consumer每间隔一段时间上报一次,这里容易导致重复消费,且性能不好!在新的版本中消费者消费到的offset已经直接维护在kafk集群的__consumer_offsets这个topic中

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

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

相关文章

基于 PyTorch 的目标检测(YOLO实现)

目标检测是一个直到最近才开始逐渐被征服的挑战。解决这个问题对于自动化和自动驾驶来说是至关重要的。对解决办法的追求导致了各种方法的发展。我想要描述一些主要的方法,在过去的21目标检测已经被使用,然后讨论 Yolov3的实现。讨论方法引言虽然深度学习…

windows 7 离线安装vs20219,GraalVM 打包java成可执行程序

环境准备 由于vs2022不支持windows 7 ,故用vs2019版。 如果是 win7 系统,在安装下载的依赖项前需要安装 win7 所需要的两个补丁 KB4490628和KB4474419 ,下载地址分别为(下载后直接安装即可): 参考这篇博客…

vite --- 搭建开发环境

目录 下载安装和初始化VSCode 安装Node.js yarn 使用 pnpm 安装与使用 搭建第一个Vite项目 使用 PNPM创建项目 项目目录解读 下载安装和初始化VSCode 1、访问网站 Visual Studio Code - Code Editing. Redefined 2、选择平台版本 选择符合自己操作系统的安装包下载完毕…

接口测试及接口抓包常用的测试工具有哪些?

目录 接口 接口测试的重要性 常用抓包工具 01、F12 02、Fiddler抓包工具 03、Charles抓包工具 04、Firebug抓包工具 05、httpwatch抓包工具 06、Wireshark抓包工具 07、SmartSniff抓包工具 常用接口测试工具 01、Postman 02、Jmeter 03、RESTClient 04、WireMock…

655. 汽车大甩卖2 etiger.vip 答案

题目描述 有n辆车大甩卖,第i辆车售价a[i]元。有m个人带着现金来申请购买,第i个到现场的人带的现金为b[i]元,只能买价格不超过其现金额的车子。你是大卖场总经理,希望将车和买家尽量多地进行一对一配对,请问最多卖出多…

Qt 开发环境搭建

一、Qt下载与安装 1、qt下载网站https://download.qt.io/ 其中各个目录含义如下: 目录说明snapshots/预览版,最新开发测试的Qt库和开发工具online/在线安装源official_releases/正式发布版,是与开发版相对应的稳定版Qt库和开发工具&#x…

利用哨兵简化实现难度

首先先回顾一下链表的插入和删除,如果需要在一个结点p后边插入一个结点,那么只需要下边两行代码: new_node->next p->next; p->next new_node;但是当往链表插入第一个结点时候,上边的代码就不能用了。需要进行下边的处…

【vue2】vue框架学习前置必备基础知识

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:数组 | 字符串中常用方法、对象解构语法、function |箭头函数this指向、展开运算符、原型…

为了会做题而学习期权合约

基本术语 买入期权:按照固定价格购买特定物品的期权。卖出期权:按照固定价格出售特定物品的期权。执行价格:期权合约中约定的固定价格。到期日:在其后期权不再被执行的日期。欧式期权:期权只能在到期日当日被执行。美…

python带你采集热点事件,让你第一时间掌握全发展

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 开发环境: python 3.8: 解释器 pycharm: 代码编辑器 requests: 发送请求 parsel: 解析数据 jieba pandas stylecloud 实现流程: 一. 思路分析 找到数据来源 network 记录网页数据 请求 二…

windows下djaongo项目移植至centos7系统并启动

概述:在windows下开发完成的django项目需要移植至centos系统并启动。 文章目录1,在django项目目录下生成requirements.txt文件2,下载FileZilla安装并连接Linux系统3,本地传输文件至linux系统3.1,可用vim修改settings.py的参数4,安装requirements.txt依赖包5,启动项目…

pwn小白入门 装载 笔记

所看视频奉上:5、装载与汇编_哔哩哔哩_bilibili笔记如下:1.查看文件类型:file 文件名其中:add:文件名ELF:文件格式64-bit:64位LSB:端序 lsb:小端序 msb:大端序x86-64:架构…

sqlserver2012数据库,日志文件损坏修复

背景 服务器突然断电,导致数据库日志文件损坏,数据库无法启动。 本方案也同样适用于不小心删除数据库日志文件的情况。 相关报错 master数据库日志异常,导致数据库无法启动: 无法在数据库“master”(数据库 ID 为 1)的分配单元 …

windows下生成自签证书并配置到chrome

Windows自签证书生成工具:XCA – X Certificate and Key Management 简称:XCA 下载地址: https://github.com/chris2511/xca/releases 或者 http://sourceforge.net/projects/xca/files/latest/download 界面(1.4.1版本&#xff0…

从0开始学python -19

Python3 字典 字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示: d {key1 : value1, key2 : value2, key3…

剑指Offer 第23天 数组中出现次数超过一半的数字 数组中数字出现的次数 I 数组中数字出现的次数 II(异或运算)

剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 来源:力扣&a…

Python自动化测试实战篇(2)unittest实现批量接口测试,并用HTMLTestRunner输出测试报告

代码已上传Python接口项目实战篇(2)源码 项目场景: 由于关于接口的测试用例任务越来越多,单纯靠人工手敲的方式输入和校验,速度上已经不能够满足项目的进行速度,而且都是针对登录的框框进行用例测试&…

一站式轻监控轻运维系统nezha(下篇)

本文软件由网友 114514 推荐; 命令行安装 docker安装所需要的文件都能在 https://github.com/naiba/nezha/tree/master/script 找到,config.yaml 和 docker-compose.yml 老苏都做了调整 你可以在 data 目录中新建一个空的 config.yaml 文件,…

基于“Doris”的type2拉链表的Mysql实现

基于“Doris”的type2拉链表的Mysql实现 需求说明 基于Doris实现Type2、拉链表。主要对上游系统里的面积字段进行监控,如果发现变化则跟踪记录到维度表里。 解决方案 type2相关概念见如下链接: SCD缓慢变化维拉链表 这里特别需要注意的是: 1、因为…

scrapy_redis原理分析并实现断点续爬以及分布式爬虫

scrapy_redis原理分析并实现断点续爬以及分布式爬虫 学习目标 了解 scrapy实现去重的原理了解 scrapy中请求入队的条件掌握 scrapy_redis基于url地址的增量式单机爬虫掌握 scrapy_redis分布式爬虫 1. 下载github的demo代码 clone github scrapy-redis源码文件 git clone http…