0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

带你认识Kafka背后优秀的架构设计

Linux爱好者 来源:掘金 作者:说出你的愿望吧 2021-04-30 15:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

消息系统的作用

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

be057462-a83e-11eb-9728-12bb97331649.jpg

所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。

be0fa5b8-a83e-11eb-9728-12bb97331649.jpg

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

1.Topic 主题

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

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

2.Partition 分区

kafka还有一个概念叫Partition(分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。

这些分区主要的信息就存在了.log文件里面。跟数据库里面的分区差不多,是为了提高性能。

be291d4a-a83e-11eb-9728-12bb97331649.jpg

至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多Topic和partition像是HBASE里的table和region的概念,table只是一个逻辑上的概念,真正存储数据的是region,这些region会分布式地存储在各个服务器上面,对应于kafka,也是一样,Topic也是逻辑概念 ,而partition就是分布式存储单元。这个设计是保证了海量数据处理的基础。我们可以对比一下,如果HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以分散存储在不同的服务器上。注意:1.分区会有单点故障问题,所以我们会为每个分区设置副本数2.分区的编号是从0开始的

3.Producer - 生产者

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

be33a6ca-a83e-11eb-9728-12bb97331649.jpg

4.Consumer - 消费者

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

be3ffeac-a83e-11eb-9728-12bb97331649.jpg

5.Message - 消息

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

二、kafka的集群架构

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

be4b365a-a83e-11eb-9728-12bb97331649.jpg

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

Replica - 副本

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

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

be539f98-a83e-11eb-9728-12bb97331649.jpg

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

be5d89cc-a83e-11eb-9728-12bb97331649.jpg

Consumer Group - 消费者组

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

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

consumerA: group.id = a consumerB: group.id = a consumerC: group.id = b consumerD: group.id = b再让consumerB也去消费TopicA的数据,它是消费不到了,但是我们在consumerC中重新指定一个另外的group.id,consumerC是可以消费到topicA的数据的。而consumerD也是消费不到的,所以在kafka中,不同组可有唯一的一个消费者去消费同一主题的数据 。所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息,如下,consumerA,B,C是不会互相干扰的

consumer group:a consumerA consumerB consumerC

be68b34c-a83e-11eb-9728-12bb97331649.jpg

如图,因为前面提到过了消费者会直接和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用的是顺序写,追加数据是追加到末尾,磁盘顺序写的性能极高,在磁盘个数一定,转数达到一定的情况下,基本和内存速度一致随机写的话是在文件的某个位置修改数据,性能会较低。

② 零拷贝

先来看看非零拷贝的情况

be794928-a83e-11eb-9728-12bb97331649.jpg

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

be895534-a83e-11eb-9728-12bb97331649.jpg

2.日志分段存储

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

00000000000000000000.index 00000000000000000000.log 00000000000000000000.timeindex 00000000000005367851.index 00000000000005367851.log 00000000000005367851.timeindex 00000000000009936472.index 00000000000009936472.log 00000000000009936472.timeindex这个9936472之类的数字,就是代表了这个日志段文件里包含的起始offset,也就说明这个分区里至少都写入了接近1000万条数据了。

Kafka broker有一个参数,log.segment.bytes,限定了每个日志段文件的大小,最大就是1GB,一个日志段文件满了,就自动开一个新的日志段文件来写入,避免单个文件过大,影响文件的读写性能,这个过程叫做log rolling,正在被写入的那个日志段文件,叫做active log segment。如果大家有看前面的两篇有关于HDFS的文章时,就会发现NameNode的edits log也会做出限制,所以这些框架都是会考虑到这些问题。

3.Kafka的网络设计

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

be98b484-a83e-11eb-9728-12bb97331649.jpg

首先客户端发送请求全部会先发送给一个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的一些基础,在之后的更新中会继续逐步推进,进行更加深入浅出的讲解。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 耦合
    +关注

    关注

    13

    文章

    611

    浏览量

    104090
  • 存储
    +关注

    关注

    13

    文章

    4892

    浏览量

    90290
  • 磁盘
    +关注

    关注

    1

    文章

    401

    浏览量

    26592
  • 数据库
    +关注

    关注

    7

    文章

    4083

    浏览量

    68547

原文标题:大白话认识 Kafka 背后优秀的架构设计

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何确保微电网标准化架构设计流程的完整性?

    当前,微电网建设普遍存在设计流程碎片化、环节衔接不畅、标准执行不到位、成果追溯缺失等问题,导致架构设计与实际需求脱节、工程落地困难、运维成本偏高,甚至影响系统长期稳定运行。GB/T
    的头像 发表于 04-24 11:19 59次阅读
    如何确保微电网标准化<b class='flag-5'>架构设</b>计流程的完整性?

    交流微电网架构设计:拓扑结构、核心组件与适配场景

    “双碳”目标实现的重要载体。交流微电网架构设计的核心,是通过合理规划拓扑结构、科学配置核心组件,实现与应用场景的精准适配,最终达成安全稳定、高效经济的运行目标。拓扑结构决定架构的整体布局与运行特性,核心
    的头像 发表于 04-09 16:54 822次阅读
    交流微电网<b class='flag-5'>架构设</b>计:拓扑结构、核心组件与适配场景

    西格电力微电网总体架构设计:分层分布式控制体系构建

    随着分布式新能源规模化渗透、负荷需求多元化升级,微电网作为整合“源、储、荷、网”多单元的新型能源系统,其安全稳定、高效经济运行的核心诉求,对总体架构设计与控制体系提出了更高要求。微电网总体架构是系统
    的头像 发表于 03-31 11:44 517次阅读
    西格电力微电网总体<b class='flag-5'>架构设</b>计:分层分布式控制体系构建

    2022全新版!Java分布式架构设计与开发实战(完结)

    2022全新版!Java分布式架构设计与开发实战(完结) 分库分表实战:Java海量数据存储架构设计 在现代互联网应用中,随着业务规模的指数级增长,数据库性能瓶颈已成为制约系统发展的关键因素。当单
    发表于 03-30 15:20

    微电网总体架构设计原则:安全、高效、灵活的三重导向

    的运行稳定性、能源利用效率与场景适配能力。在微电网架构设计中,“安全、高效、灵活”三大导向并非孤立存在,而是相互支撑、协同统一的有机整体——安全是底线,筑牢微电网运行的根基;高效是核心,彰显微电网的能源
    的头像 发表于 03-27 14:12 281次阅读
    微电网总体<b class='flag-5'>架构设</b>计原则:安全、高效、灵活的三重导向

    X (Twitter) 推荐系统架构设计深度解析

    推荐系统到底是如何理解海量用户与内容的?本期文章带你深入 X (前 Twitter) 推荐算法库的底层源码。解构推荐系统关键的“漏斗型”架构——从高效的双塔召回到复杂精妙的 Transformer
    的头像 发表于 02-25 23:56 5147次阅读

    工程师之夜系列分享第三十九篇:Kafka、RocketMQ、JMQ 存储架构深度对比

    引言 消息队列的存储架构是决定其可靠性、吞吐量、延迟性能的核心因素,直接影响业务场景适配能力。本文聚焦三款主流消息队列 ——Kafka(LinkedIn 开源,侧重高吞吐)、RocketMQ(阿里
    的头像 发表于 01-13 16:19 291次阅读
    工程师之夜系列分享第三十九篇:<b class='flag-5'>Kafka</b>、RocketMQ、JMQ 存储<b class='flag-5'>架构</b>深度对比

    嵌入式软件分层架构设计原则

    嵌入式软件分层架构的设计原则如下: 模块化和可扩展性:每一层应当保持松耦合,这样当硬件变化或某些功能扩展时,只需要修改对应的层次,而不影响整体架构。 硬件无关性:上层代码应当尽量避免直接依赖硬件
    发表于 11-28 07:05

    TensorRT-LLM的大规模专家并行架构设

    之前文章已介绍引入大规模 EP 的初衷,本篇将继续深入介绍 TensorRT-LLM 的大规模专家并行架构设计与创新实现。
    的头像 发表于 09-23 14:42 1387次阅读
    TensorRT-LLM的大规模专家并行<b class='flag-5'>架构设</b>计

    深入剖析RabbitMQ高可用架构设

    在微服务架构中,消息队列故障导致的系统不可用率高达27%!如何构建一个真正可靠的消息中间件架构?本文将深入剖析RabbitMQ高可用设计的核心要点。
    的头像 发表于 08-18 11:19 1096次阅读

    Kafka生产环境应用方案

    Apache Kafka作为分布式流处理平台,在现代大数据架构中扮演着消息中间件的核心角色。本文将从运维工程师的角度,详细介绍Kafka在生产环境中的部署方案、配置优化、监控运维等关键技术。通过实战案例和代码示例,帮助运维团队构
    的头像 发表于 07-09 09:56 686次阅读

    光伏运维管理系统架构设计及其应用分析

    开展。 光伏运维管理系统集成先进的数据监测、故障诊断、运维任务管理等多种功能内容,为光伏电站提供全面、高效、智能的运维服务。其系统分层架构设计,覆盖感知层、网络层、平台层和应用层。感知层通过传感器和摄像头等设
    的头像 发表于 06-10 11:34 772次阅读
    光伏运维管理系统<b class='flag-5'>架构设</b>计及其应用分析

    明晚开播 | 数据智能系列讲座第6期:大模型革命背后的算力架构创新

    鹭岛论坛数据智能系列讲座第6期「大模型革命背后的算力架构创新」/RVEI并行计算工作组(SIG-PP)技术沙龙/明晚(21日)8点精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目大模型革命
    的头像 发表于 05-20 08:04 577次阅读
    明晚开播 | 数据智能系列讲座第6期:大模型革命<b class='flag-5'>背后</b>的算力<b class='flag-5'>架构</b>创新

    Kafka工作流程及文件存储机制

    Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的。
    的头像 发表于 05-19 10:14 1067次阅读
    <b class='flag-5'>Kafka</b>工作流程及文件存储机制

    直播预约 | 数据智能系列讲座第6期:大模型革命背后的算力架构创新

    鹭岛论坛数据智能系列讲座第6期「大模型革命背后的算力架构创新」/RVEI并行计算工作组(SIG-PP)技术沙龙/5月21日(周三)20:00精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目
    的头像 发表于 05-12 14:05 723次阅读
    直播预约 | 数据智能系列讲座第6期:大模型革命<b class='flag-5'>背后</b>的算力<b class='flag-5'>架构</b>创新