白话教你认识 Kafka,秒懂原理

news2024/12/28 20:57:42

一、Kafka 基础

消息系统的作用

应该大部份小伙伴都清楚,用机油装箱举个例子

图片

所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。

引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。

图片

按照刚刚前面提到的消息系统的作用,我们知道了消息系统其实就是一个模拟缓存,且仅仅是起到了缓存的作用而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。

1.Topic 主题

kafka 学习了数据库里面的设计,在里面设计了topic(主题),这个东西类似于关系型数据库的表。

图片

此时我需要获取中国移动的数据,那就直接监听 TopicA 即可

2.Partition 分区

kafka还有一个概念叫Partition(分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。这些分区主要的信息就存在了.log文件里面。跟数据库里面的分区差不多,是为了提高性能。

图片

至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多

Topic 和 partition 像是 HBASE 里的 table 和 region 的概念,table 只是一个逻辑上的概念,真正存储数据的是 region,这些 region 会分布式地存储在各个服务器上面,对应于kafka,也是一样,Topic 也是逻辑概念,而 partition 就是分布式存储单元。

这个设计是保证了海量数据处理的基础。我们可以对比一下,如果 HDFS 没有 block 的设计,一个 100T 的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入 block后,大文件可以分散存储在不同的服务器上。

注意:

  1. 分区会有单点故障问题,所以我们会为每个分区设置副本数

  2. 分区的编号是从0开始的

3.Producer - 生产者

往消息系统里面发送数据的就是生产者

图片

4.Consumer - 消费者

从 kafka 里读取数据的就是消费者

图片

5.Message - 消息

kafka 里面的我们处理的数据叫做消息

二、kafka的集群架构

创建一个 TopicA 的主题,3个分区分别存储在不同的服务器,也就是 broker 下面。Topic 是一个逻辑上的概念,并不能直接在图中把 Topic 的相关单元画出

图片

需要注意:kafka在0.8版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的kafka

Replica - 副本

kafka 中的 partition 为了保证数据安全,所以每个 partition 可以设置多个副本。

此时我们对分区 0,1,2 分别设置 3 个副本(其实设置两个副本是比较合适的)

图片

而且其实每个副本都是有角色之分的,它们会选取一个副本作为 leader,而其余的作为follower,我们的生产者在发送数据的时候,是直接发送到 leader partition 里面,然后follower partition 会去 leader 那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的。

图片

Consumer Group - 消费者组

我们在消费数据时会在代码里面指定一个 group.id,这个 id 代表的是消费组的名字,而且这个 group.id 就算不设置,系统也会默认设置。

 
conf.setProperty("group.id","tellYourDream")

我们所熟知的一些消息系统一般来说会这样设计,就是只要有一个消费者去消费了消息系统里面的数据,那么其余所有的消费者都不能再去消费这个数据。可是 kafka 并不是这样,比如现在 consumerA 去消费了一个 topicA 里面的数据。

consumerA:    group.id = aconsumerB:    group.id = a
consumerC:    group.id = bconsumerD:    group.id = b

再让 consumerB 也去消费 TopicA 的数据,它是消费不到了,但是我们在 consumerC中重新指定一个另外的 group.id,consumerC 是可以消费到 topicA 的数据的。而consumerD 也是消费不到的,所以在 kafka 中,不同组可有唯一的一个消费者去消费同一主题的数据。

所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息,如下,consumerA,B,C是不会互相干扰的​​​​​​​

consumer group:a    consumerA    consumerB    consumerC

图片

如图,因为前面提到过了消费者会直接和leader建立联系,所以它们分别消费了三个leader,所以一个分区不会让消费者组里面的多个消费者去消费,但是在消费者不饱和的情况下,一个消费者是可以去消费多个分区的数据的。

Controller

熟知一个规律:在大数据分布式文件系统里面,95%的都是主从式的架构,个别是对等式的架构,比如 ElasticSearch。

kafka也是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和zookeeper 进行配合管理整个kafka集群。

kafka和zookeeper如何配合工作

kafka严重依赖于zookeeper集群(所以之前的zookeeper文章还是有点用的)。所有的broker在启动的时候都会往zookeeper进行注册,目的就是选举出一个controller,这个选举过程非常简单粗暴,就是一个谁先谁当的过程,不涉及什么算法问题。

那成为controller之后要做啥呢,它会监听zookeeper里面的多个目录,例如有一个目录/brokers/,其他从节点往这个目录上注册(就是往这个目录上创建属于自己的子目录而已)自己,这时命名规则一般是它们的id编号,比如/brokers/0,1,2

注册时各个节点必定会暴露自己的主机名,端口号等等的信息,此时controller就要去读取注册上来的从节点的数据(通过监听机制),生成集群的元数据信息,之后把这些信息都分发给其他的服务器,让其他服务器能感知到集群中其它成员的存在。

此时模拟一个场景,我们创建一个主题(其实就是在zookeeper上/topics/topicA这样创建一个目录而已),kafka会把分区方案生成在这个目录中,此时controller就监听到了这一改变,它会去同步这个目录的元信息,然后同样下放给它的从节点,通过这个方法让整个集群都得知这个分区方案,此时从节点就各自创建好目录等待创建分区副本即可。这也是整个集群的管理机制。

加餐时间

1.Kafka性能好在什么地方?

① 顺序写

操作系统每次从磁盘读写数据的时候,需要先寻址,也就是先要找到数据在磁盘上的物理位置,然后再进行数据读写,如果是机械硬盘,寻址就需要较长的时间。

kafka的设计中,数据其实是存储在磁盘上面,一般来说,会把数据存储在内存上面性能才会好。但是kafka用的是顺序写,追加数据是追加到末尾,磁盘顺序写的性能极高,在磁盘个数一定,转数达到一定的情况下,基本和内存速度一致随机写的话是在文件的某个位置修改数据,性能会较低。

② 零拷贝

先来看看非零拷贝的情况

图片

可以看到数据的拷贝从内存拷贝到 kafka 服务进程那块,又拷贝到socket缓存那块,整个过程耗费的时间比较高,kafka 利用了 Linux 的 sendFile 技术(NIO),省去了进程切换和一次数据拷贝,让性能变得更好。

图片

2.日志分段存储

Kafka规定了一个分区内的.log文件最大为1G,做这个限制目的是为了方便把.log加载到内存去操作​​​​​​​

00000000000000000000.index00000000000000000000.log00000000000000000000.timeindex
00000000000005367851.index00000000000005367851.log00000000000005367851.timeindex
00000000000009936472.index00000000000009936472.log00000000000009936472.timeindex

3.Kafka的网络设计

kafka的网络设计和Kafka的调优有关,这也是为什么它能支持高并发的原因

图片

首先客户端发送请求全部会先发送给一个Acceptor,broker里面会存在3个线程(默认是3个),这3个线程都是叫做processor,Acceptor不会对客户端的请求做任何的处理,直接封装成一个个socketChannel发送给这些processor形成一个队列,发送的方式是轮询,就是先给第一个processor发送,然后再给第二个,第三个,然后又回到第一个。消费者线程去消费这些socketChannel时,会获取一个个request请求,这些request请求中就会伴随着数据。

线程池里面默认有8个线程,这些线程是用来处理request的,解析请求,如果request是写请求,就写到磁盘里。读的话返回结果。processor会从response中读取响应数据,然后再返回给客户端。这就是Kafka的网络三层架构。

所以如果我们需要对kafka进行增强调优,增加processor并增加线程池里面的处理线程,就可以达到效果。request和response那一块部分其实就是起到了一个缓存的效果,是考虑到processor们生成请求太快,线程数不够不能及时处理的问题。

所以这就是一个加强版的reactor网络线程模型。

finally

集群的搭建会再找时间去提及。这一篇简单地从角色到一些设计的方面讲述了Kafka的一些基础,在之后的更新中会继续逐步推进,进行更加深入浅出的讲解。

作者:说出你的愿望吧
链接:https://juejin.cn/post/6844903999066341384

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

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

相关文章

谷歌浏览器从c盘剪切到d盘书签消失的找回方式

目录 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 2.我们只需要将上述的两个文件Bookmarks和Bookmarks.bak先备份到一个地方,替换文件: 3.重启谷歌浏览器 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 移动后的新路径\Google\C…

vue自行封装错误提示信息——$message——技能提升

在使用vue的过程中,我们经常用到的是这一种的提示信息: 该组件提供的属性有以下几个: 但是,如果想要自定义提示信息,则可以使用下面的方式来处理: 1.自定义提示信息组件 import Vue from vue export fu…

Linux基本指令二

Linux基本指令二 一、more指令1、语法2、功能3、常用操作 二、less指令1、语法2、功能3、常用选项4、常用操作 三、head指令1、语法2、功能3、常用选项4、示例 四、tail指令1、语法2、功能3、常用选项4、示例 五、date指令1、语法2、功能3、常用的标记4、设置时间5、时间戳6、示…

VxeTable 表格组件推荐

VxeTable 表格组件推荐 https://vxetable.cn 在前端开发中,表格组件是不可或缺的一部分,它们用于展示和管理数据,为用户提供了重要的数据交互功能。VxeTable 是一个优秀的 Vue 表格组件,它提供了丰富的功能和灵活的配置选项&…

linux上negix部署静态页面

1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名,服务是http://test.fun-med.cn/#/,后面加服务名(你的前端) 2.看下页面位置 和上面的路径要匹配

IDEA工具的 CTRL + Shift + F 全局搜索失效

失效原因:快捷键冲突,与输入法默认的简繁体切换快捷键冲突了。 解决方式: 1、微软输入法 1.1 、任务栏 – 微软任务 – 语言首选项 1.2、微软拼音 – 选项 1.3、按键 – 热键(简体/繁体中文输入切换)关闭或修改 …

华为云CodeArts Check代码检查插件(VSCode IDE版本)使用指南

CodeArts Check VSCode IDE代码检查插件 本插件致力于守护开发人员代码质量,成为开发人员的助手和利器。秉承极简、极速、即时看护的理念,提供业界规范(含华为云)的检查、代码风格一键格式化及代码自动修复功能。 感兴趣的小伙伴…

并网型虚拟同步发电机控制仿真(Matlabsimulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间 前言正文1、获取plotItem的bottom轴对象2、设置刻度值,即获取时间3、刻度值与显示数值绑定4、设置bottom轴的刻度数值显示前言 基于PySide2、PyQtGraph和PySide2动态绘图,将X轴坐标设置为系统事件…

Linux 实践项目之论坛搭建

目录 一、思路 1、环境搭建(lamp--Linux apache mysql php ) 2、关闭防火墙SELinux启动服务 3、将论坛源代码上传至/var/www/html路径下 4、设置MySQL数据库名称和密码 5、浏览器上搭建Discuz论坛 二、实操 1、安装 2、关闭防火墙SELinux启动服务…

Activiti工作流引擎详解与应用

一、简介 Activiti是一个开源的工作流引擎,基于BPMN2.0标准进行流程定义。它可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti进行管…

第三节:AntDisgn安装与导入

AntDisgn官网 1.安装:npm install -g vue/cli或者 yarn global add vue/cli 2.导入(我这进行的是全局使用在main.js里边进行配置) import { createApp } from vue import ./style.css import App from /App.vue import router from /router/index 导入路由 import …

18369-2022 玻璃纤维无捻粗纱 课堂随笔

声明 本文是学习GB-T 18369-2022 玻璃纤维无捻粗纱.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了玻璃纤维无捻粗纱(以下简称"无捻粗纱")的分类和标记、技术要求、试验方法、检验 规则、标志、包装、运输和储存。…

unity脚本_MonoBehaviour c#

在MonoBehaviour里可以获取: 自己物体身上的属性 和 位置 及 其他类物体身上的属性 和 位置 this.gameObject.属性 this.transform.position this.transform.eulerAngles this.transform.lossyScale 如果是其他类 需要创建一个类对象 然后用类对象去 点 另外…

DRM全解析 —— encoder详解(1)

本文参考以下博文: Linux内核4.14版本——drm框架分析(3)——encoder分析 特此致谢! 1. 简介 encoder是编码器/输出转换器,负责将CRTC输出的timing时序转换成外部设备所需要的信号,如HDMI转换器或DSI Controller。 具体来讲&a…

【生成模型】解决生成模型面对长尾类型物体时的问题 RE-IMAGEN: RETRIEVAL-AUGMENTED TEXT-TO-IMAGE GENERATOR

介绍 尽管最先进的模型可以生成常见实体的高质量图像,但它们通常难以生成不常见实体的图像,例如“Chortai(狗)”或“Picarones(食物)”。为了解决这个问题,我们提出了检索增强文本到图像生成器…

超实用的蓄电池小技巧,不会用就太可惜了!

蓄电池在现代社会中扮演着重要的角色,用于供电备份、电动交通工具、可再生能源储存等各种应用。然而,蓄电池的性能监控和维护管理对于确保其可靠性和寿命至关重要。 随着科技的不断进步,蓄电池监控系统成为了一种关键工具,帮助用户…

3D目标检测:DFA3D: 3D Deformable Attention For 2D-to-3D Feature Lifting

论文作者:Hongyang Li,Hao Zhang,Zhaoyang Zeng,Shilong Liu,Feng Li,Tianhe Ren,Lei Zhang 作者单位:South China University of Technology; The Hong Kong University of Science and Technology; International Digital Economy Academy (IDEA); Ts…

大数据软件项目的数据清洗

大数据软件项目中的数据清洗是数据预处理过程中的重要环节,用于识别和纠正数据集中的错误、不一致性和不完整性。虽然没有专门的"数据清洗开发框架",但有许多工具和库可用于数据清洗任务。以下是一些常见的数据清洗工具和库,可以与…

RK3588 DDR电源电路设计详解

RK3588 VCC_DDR电源PCB设计 1、VCC_DDR覆铜宽度需满足芯片的电流需求,连接到芯片电源管脚的覆铜足够宽,路径不能被过孔分割太严重,必须计算有效线宽,确认连接到CPU每个电源PIN脚的路径都足够。 2、VCC_DDR的电源在外围换层时&am…