【kafka】kafka基础架构

文章目录

  • 1、kafka简介
  • 2、kafka的特性
  • 3、kafka的应用场景
  • 4、kafka架构(重点)
    • 4.1、broker
    • 4.2、topic
    • 4.3、partition
    • 4.4、offset
    • 4.5、producer
    • 4.6、consumer
    • 4.7、consumer group
    • 4.8、leader
    • 4.9、follower
    • 4.10、rebalance
  • 5、对kafka架构的几点解释
  • 6、几种MQ对比
  • 7、 kafka的吞吐量为什么这么高?
    • 7.1、顺序读写磁盘
    • 7.2、page cache
    • 7.3、零拷贝
    • 7.4、分区分段

1、kafka简介

Kafka最初由Linkedin公司开发,是一个分布式的、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常用于web/nginx日志、访问日志、消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

2、kafka的特性

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;

  • 可扩展性:kafka集群支持热扩展;

  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止丢失;

  • 容错性:允许集群中的节点失败(若分区副本数量为n,则允许n-1个节点失败);

  • 高并发:单机可支持数千个客户端同时读写;

3、kafka的应用场景

  • 日志收集:一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口开放给各种消费端,例如hadoop、Hbase、Solr等。

  • 消息系统:解耦生产者和消费者、缓存消息等。

  • 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索记录、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。

  • 运营指标:Kafka也经常用来记录运营监控数据。

  • 流式处理

4、kafka架构(重点)

在这里插入图片描述

整体来看,kafka架构中包含四大组件:生产者、消费者、kafka集群、zookeeper集群

4.1、broker

kafka集群包含一个或多个服务器,每个服务器节点称为一个broker。

4.2、topic

每条发布到kafka集群的消息都有一个类别,这个类别称为topic,其实就是将消息按照topic来分类,topic就是逻辑上的分类,同一个topic的数据既可在同一个broker上也可以在不同的broker节点上

4.3、partition

分区,每个topic被物理划分为一个或多个分区,每个分区在物理上对应一个文件夹,该文件夹里面存储了这个分区的所有消息和索引文件。在创建topic时可以指定partition数量,生产者将消息发送到topic时,消息会根据分区策略追加到分区文件的末尾,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)

在这里插入图片描述

上面提到分区策略,所谓分区策略就是决定生产者将消息发送到哪个分区的算法?

  • Kafka 为我们提供了默认的分区策略,同时它也支持自定义分区策略。
  • kafka允许为每条消息设置一个key,一旦消息被定义了 Key,
  • 那么就可以保证同一个 Key 的所有消息都进入到相同的分区,
  • 这种策略属于自定义策略的一种,被称作"按消息key保存策略",或Key-ordering 策略。

同一主题topic的多个partition分区可以部署在不同的机器上,以此来实现kafka的伸缩性。同一个partition的数据是有序的,但topic主题下多个partition之间在消费数据时不能保证有序性,在需要严格保证消息顺序性的场景下,可以将partition数设为1,但是这种做法的缺点就是降低吞吐量,一般来说,只需要保证每个分区的有序性,再对消息设置key来保证相同的key消息落入同一个分区,就可以满足绝大多数场景。

4.4、offset

partition中的每条消息都被标记了一个序号,这个序号表示消息在partition中的偏移量,称为offset,每一条消息在partition都有唯一的offset,消费者可以通过指定offset来指定要消费的消息。

正常情况下,消费者在消费完一条消息后会递增offset,准备去消费下一条消息,但也可以将offset设成一个较小的值,重新消费一些消费过的消息,可见offset是由consumer控制的,consumer想消费哪一条消息就消费哪一条消息,所以kafka broker是无状态的,它不需要标记哪些消息被消费过。

4.5、producer

生产者,生产者发送消息到指定的topic下,消息再根据分配规则append到某个partition的末尾。

4.6、consumer

消费者,消费者从topic中消费数据。

4.7、consumer group

消费者组,每个consumer属于一个特定的consumer group,可为每个consumer指定consumer group,若不指定则属于默认group。

同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。这也是kafka用来实现一个topic消息的广播和单播的手段,如果需要实现广播,一个consumer group内只放一个消费者即可,要实现单播,将所有的消费者放到同一个consumer group即可。

用consumer group还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。

4.8、leader

每个partition有多个副本,其中有且仅有一个作为leader,leader会负责所有的客户端读写操作。

4.9、follower

follower不对外提供服务,只与leader保持数据同步,如果leader失效,则选举一个follower来充当新的leader。当follower与leader挂掉、卡住或者同步太慢,leader会把这个follower从ISR列表中删除,重新创建一个follower。

4.10、rebalance

同一个consumer group下有多个消费者互相协调消费工作,我们这样想,一个topic分为多个分区,一个consumer group里面的所有消费者合作,一起去消费所订阅的某个topic下的所有分区(每个消费者消费部分分区),kafka会将该topic下的所有分区均匀的分配给consumer group下的每个消费者,如下图:

在这里插入图片描述

Rebalance表示"重平衡",consumer group内某个消费者挂掉后,其他消费者自动重新分配订阅主题分区的过程,是 Kafka 消费者端实现高可用的重要手段。如下图Consumer Group A中的C2挂掉,C1会接收P1和P2,以达到重新平衡。同样的,当有新消费者加入consumer group,也会触发重平衡操作。

5、对kafka架构的几点解释

  • 一个典型的kafka集群中包含若干producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个zookeeper集群。kafka通过zookeeper协调管理kafka集群,选举分区leader,以及在consumer group发生变化时进行rebalance。

  • kafka的topic被划分为一个或多个分区,多个分区可以分布在一个或多个broker节点上,同时为了故障容错,每个分区都会复制多个副本,分别位于不同的broker节点,这些分区副本中(不管是leader还是follower都称为分区副本),一个分区副本会作为leader,其余的分区副本作为follower。

leader负责所有的客户端读写操作,follower不对外提供服务,仅仅从leader上同步数据,当leader出现故障时,其中的一个follower会顶替成为leader,继续对外提供服务。

  • 对于传统的MQ而言,已经被消费的消息会从队列中删除,但在Kafka中被消费的消息也不会立马删除,在kafka的server.propertise配置文件中定义了数据的保存时间,当文件到设定的保存时间时才会删除。
# 数据的保存时间(单位:小时,默认为7天)
 
log.retention.hours=168

因为Kafka读取消息的时间复杂度为O(1),与文件大小无关,所以这里删除过期文件与提高Kafka性能并没有关系,所以选择怎样的删除策略应该考虑磁盘以及具体的需求。

  • 点对点模式 VS 发布订阅模式

传统的消息系统中,有两种主要的消息传递模式:点对点模式、发布订阅模式

①点对点模式

生产者发送消息到queue中,queue支持存在多个消费者,但是对一个消息而言,只可以被一个消费者消费,并且在点对点模式中,已经消费过的消息会从queue中删除不再存储。

②发布订阅模式

生产者将消息发布到topic中,topic可以被多个消费者订阅,且发布到topic的消息会被所有订阅者消费。而kafka就是一种发布订阅模式。

  • 消费端 PULL和PUSH

①Push方式:由消息中间件主动地将消息推送给消费者;

②Pull方式:由消费者主动向消息中间件拉取消息;

6、几种MQ对比

比较项ActiveMQRabbitMQRocketMQKafka
所属社区/公司ApacheMozilla Public License阿里巴巴Apache
成熟度及授权成熟/开源成熟/开源比较成熟/开源成熟/开源
开发语言javaErlangjavaScala&java
客户端支持语言Java、C/C++、Python、PHP、Perl、.net等官方支持Erlang,java,Ruby等,社区产出多种语言API,几乎支持所有常用语言Java、C++官方支持java,开源社区有多语言版本,如PHP,Python,Go,C/C++,Ruby等
协议支持OpenWire、STOMP、REST、XMPP、AMQP多协议支持:AMQP,XMPP,SMTP,STOMP自己定义的一套(社区提供JMS–不成熟)自有协议,社区封装了HTTP协议支持
HA基于ZooKeeper + LevelDB的Master-Slave实现方式master/slave模式,master提供服务,slave仅作备份(冷备)支持多Master模式,多Master多Slave模式,异步复制模式、同步双写支持replica机制,leader宕掉后,备份自动顶替,并重新选举leader(基于Zookeeper)
数据可靠性Master/slave,有较低的概率丢失数据可以保证数据不丢,有slave用作备份支持异步实时刷盘,同步刷盘,同步复制,异步复制数据可靠,且有replica机制,有容错容灾能力
单机吞吐量万级万级十万级,支撑高吞吐十万级,高吞吐,一般配合大数据类的系统进行实时数据计算、日志采集等场景
消息延迟毫秒级微秒级毫秒级毫秒级以内
流量控制基于Credit-Based算法,是内部被动触发的保护机制,作用于生产者层面。支持client和user级别,通过主动设置可将流控作用于生产者或消费者。
持久化能力默认内存,正常关闭时将内存中未处理的消息持久化文件,如果使用JDBC策略,则入数据库内存、文件,支持数据堆积。但堆积反过来影响吞吐量磁盘文件磁盘文件。只要磁盘容量够,可以做到无限消息堆积
负载均衡支持支持支持支持
管理界面一般较好命令行界面官方只提供命令行版,yahoo开源自己的web管理界面
部署方式及难易独立/容易独立/容易独立/容易独立/容易
功能支持MQ领域的功能较为完备基于Erlang开发,并发能力很强,性能极好,时延很低MQ功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集方面被大规模使用

7、 kafka的吞吐量为什么这么高?

7.1、顺序读写磁盘

Kafka是将消息持久化到本地磁盘中的,一般人会认为磁盘读写性能差,可能会对Kafka性能提出质疑。实际上不管是内存还是磁盘,快或慢的关键在于寻址方式,磁盘分为顺序读写与随机读写,内存一样也分为顺序读写与随机读写。基于磁盘的随机读写确实很慢,但基于磁盘的顺序读写性能却很高,一般而言要高出磁盘的随机读写三个数量级,一些情况下磁盘顺序读写性能甚至要高于内存随机读写,这里给出著名学术期刊 ACM Queue 上的一张性能对比图:

在这里插入图片描述

7.2、page cache

为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存。这样做是因为,

JVM中一切皆对象,对象的存储会带来额外的内存消耗;

使用JVM会受到GC的影响,随着数据的增多,垃圾回收也会变得复杂与缓慢,降低吞吐量;

另外操作系统本身对page cache做了大量优化,通过操作系统的Page Cache,Kafka的读写操作基本上是基于系统内存的,读写性能也得到了极大的提升。

7.3、零拷贝

零拷贝是指Kafka利用 linux 操作系统的 “zero-copy” 机制在消费端做的优化。首先来看一下消费端在消费数据时,数据从broker磁盘通过网络传输到消费端的整个过程:

操作系统从磁盘读取数据到内核空间(kernel space)的page cache;

应用程序读取page cache的数据到用户空间(user space)的缓冲区;

应用程序将用户空间缓冲区的数据写回内核空间的socket缓冲区(socket buffer);

操作系统将数据从socket缓冲区复制到硬件(如网卡)缓冲区;

在这里插入图片描述

整个过程如上图所示,这个过程包含4次copy操作和2次系统上下文切换,而上下文切换是CPU密集型的工作,数据拷贝是I/O密集型的工作,性能其实非常低效。零拷贝就是使用了一个名为sendfile()的系统调用方法,将数据从page cache直接发送到Socket缓冲区,避免了系统上下文的切换,消除了从内核空间到用户空间的来回复制。从上图可以看出,"零拷贝"并不是说整个过程完全不发生拷贝,而是站在内核的角度来说的,避免了内核空间到用户空间的来回拷贝。

7.4、分区分段

Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的。这也非常符合分布式系统分区分桶的设计思想。

通过这种分区分段的设计,Kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。为了进一步的查询优化,Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度。

总之,Kafka采用顺序读写、Page Cache、零拷贝以及分区分段等这些设计,再加上在索引方面做的优化,另外Kafka数据读写也是批量的而不是单条的,使得Kafka具有了高性能、高吞吐、低延时的特点。

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

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

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 21 日论文合集)

文章目录 一、检测相关(14篇)1.1 CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection1.2 Depth and DOF Cues Make A Better Defocus Blur Detector1.3 Spatiotemporal Pyramidal CNN with Depth-Wise Separable Convolution for Eye Blinking Detection …

Windows 离线安装mysql5.7

一、下载MySQL5.7最新版 1、官网地址 https://downloads.mysql.com/archives/community/ 2、下载MySQL5.7最新版 下载下图所示的安装包: 二、安装MySQL5.7 1、解压 将刚才下载压缩包解压搭配目录C:\software\mysql-5.7.41,(路径大家可…

物联网通信技术

通信的技术指标是什么?AB A. 可靠性 B. 有效性 C. 实时性D. 广覆盖 多路复用技术有哪些?ABCD A. FDMA B. CDMA C. SDMA D. TDMA 使用多个频率来传输信号的技术被称为扩展频谱技术,该技术使用的目的是什么? AB A. 抗干扰B. 提…

python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录 一、前言二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略三、轨迹图像的处理要点四、本篇部分核心控制策略python代码:五、结论 一、前言 基于最近的测试,得到了一种粗略控制的算法,其控制效果适合单线路和急转弯的情…

我们该如何提升测试效率?

在大部分研发项目经理心中,进度往往会放在第一位,其次是成本,最后是质量,当然人员队伍最好也要稳定。天下武功,唯快不破:进度 > 成本 > 质量 > 人。 这个说法并不是绝对,今天我们并不是…

高频前端React面试题汇总

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上&#xff0…

DDOS攻击防御实战(威胁情报)

背景&#xff1a; 不知道大家最近有没有关注到&#xff0c;百度云CDN不支持免费了&#xff0c;网站安全问题越来越严重了…… 常见攻击 DDOS Distributed Denial of Service 分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击&#xff0c;使攻击的目标无法正常使用&…

css基础知识六:谈谈你对BFC的理解?

一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f; 归根究底是元素之间相互的影响&#xff0c;导致了意料之外的情况&#…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器&#xff08;了解&#xff09…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…

【前端布局篇】响应式布局 Bootstrap 移动端布局

前言 1. 布局介绍 布局:layout 对事物的全面规划和安排 页面布局&#xff1a;对页面的文字、图形或表格进行格式设置。包括字体、字号、颜色纸张大小和方向以及页边距等。 网页布局&#xff1a;利用html搭建结构与内容&#xff0c;使用CSS添加装饰 网页布局有很多种方式&a…

Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

零、Binder的传递 Android系统中&#xff0c;存在大量的 IPC 交互&#xff0c;同时也使用了大量的 Binder&#xff0c;那么Binder是怎么在各进程中进行对象的传递&#xff1f; 一、调用系统服务时&#xff0c;Binder的传递 回忆一下&#xff0c;Android系统的启动流程&#x…

数据结构--》从数据结构开始,打好算法基础

目录 数据结构的基本概念 数据结构的三要素 算法的基本概念 数据结构的基本概念 在学习某个知识之前&#xff0c;我们是否都有问过自己我们到底在学习的目的是什么&#xff1f;学习数据结构也一样&#xff0c;我们学习数据结构主要是为了用程序把现实世界的问题信息化&#…

Fiddler之日常使用简介

目录 前言&#xff1a; Fiddler界面简介 一、Fiddler抓取http、https请求配置 二、抓取指定域名会话 三、http请求统计试图 前言&#xff1a; Fiddler是一款功能强大的Web调试工具&#xff0c;它可以帮助开发人员在开发和测试过程中捕获、修改和检查HTTP请求和响应。 使用Fiddl…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…

leetcode46. 全排列(回溯算法-java)

全排列 leetcode46. 全排列题目描述解题思路代码演示 回溯算法专题 leetcode46. 全排列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有…

pandas---文件读取与存储(csv、hdf、json、excel、sql)

数据大部分存在于文件当中&#xff0c;所以pandas会支持复杂的IO操作&#xff0c;pandas的API支持众多的文件格 式&#xff0c;如CSV、SQL、EXCEL、JSON、 HDF5。 1. csv文件 pandas.read_csv(filepath_or_buffer, sep ,, usecols ) filepath_or_buffer:文件路径 sep :…

组合式API - provide和inject、Vue3小案例【Vue3】

组合式API - provide和inject 作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据 顶层组件通过provide函数提供数据 provide(key, 顶层组件中的数据)底层组件通过inject函数获取数据 const message inject(key) …