点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

I once heard that,the only thing you can do when you no longer have something is not to forget.

我曾经听人说过,当你不能再拥有的时候,唯一可以做的就是令自己不要忘记。

每日掏心话

万物皆有动人之处,然非众人皆能洞悉。太耀眼的城市不适合看星星,就像你的心,不适合谈安定。

责编:乐乐 | 来自:juejin.cn/post/6844903999066341384

编程技术圈(ID:study_tech)第 1235 次推文

往日回顾:2W 字你全面认识 Nginx

     

   正文   

前言一、Kafka基础消息系统的作用1.Topic 主题2.Partition 分区3.Producer - 生产者4.Consumer - 消费者5.Message - 消息二、kafka的集群架构Replica - 副本Consumer Group - 消费者组Controllerkafka和zookeeper如何配合工作加餐时间1.Kafka性能好在什么地方?2.日志分段存储3.Kafka的网络设计finally一、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版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的kafkaReplica - 副本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 = a
consumerB:group.id = aconsumerC:group.id = b
consumerD:group.id = b再让consumerB也去消费TopicA的数据,它是消费不到了,但是我们在consumerC中重新指定一个另外的group.id,consumerC是可以消费到topicA的数据的。而consumerD也是消费不到的,所以在kafka中,不同组可有唯一的一个消费者去消费同一主题的数据 。所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息,如下,consumerA,B,C是不会互相干扰的consumer group:aconsumerAconsumerBconsumerC如图,因为前面提到过了消费者会直接和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.index
00000000000000000000.log
00000000000000000000.timeindex00000000000005367851.index
00000000000005367851.log
00000000000005367851.timeindex00000000000009936472.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的调优有关,这也是为什么它能支持高并发的原因首先客户端发送请求全部会先发送给一个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的一些基础,在之后的更新中会继续逐步推进,进行更加深入浅出的讲解。PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
欢迎加入后端架构师交流群,在后台回复“学习”即可。
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。别找了,想获取史上最简单的Java大厂面试题学习资料扫下方二维码回复「面试」就好了猜你还想看阿里、腾讯、百度、华为、京东最新面试题汇集阿里面试官的 "说一下从url输入到返回请求的过程" 问的难度就是不一样!
拜托!不要用“ ! = null ”做判空了!
Git使用的奇技淫巧,看这篇就够了!
嘿,你在看吗?

大白话认识 Kafka 背后优秀的架构设计相关推荐

  1. 大白话教你认识 Kafka 背后优秀的架构设计

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 一.Kafka基础 消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我 ...

  2. Kafka 的生产者优秀架构设计

    作者 | 孙玄 责编 | 郭芮 来源 | 架构之美(ID:beautyArch) Kafka 是一个高吞吐量的分布式的发布订阅消息系统,在全世界都很流行,在大数据项目里面使用尤其频繁.笔者看过多个大数 ...

  3. Kafka的生产者优秀架构设计

    来自:架构之美 前言 Kafka 是一个高吞吐量的分布式的发布订阅消息系统,在全世界都很流行,在大数据项目里面使用尤其频繁.笔者看过多个大数据开源产品的源码,感觉 Kafka 的源码是其中质量比较上乘 ...

  4. 敏捷思维- 架构设计中的方法学

    敏捷思维-架构设计中的方法学 目录 1.从方法论看架构设计... 2 2.架构设计的敏捷视图... 7 3.源自需求... 13 4.团队设计... 18 5.简单设计... 24 6.迭代设计... ...

  5. 敏捷思维-架构设计中的方法学

    敏捷思维-架构设计中的方法学 1.    从方法论看架构设计 1.    架构设计的敏捷视图 2.    源自需求 3.    团队设计 4.    简单设计 5.    迭代设计 6.    组合使 ...

  6. 工行“去O”数据库选型与分布式架构设计

    魏亚东 工商银行软件开发中心经理 中国工商银行软件开发中心三级经理,资深架构师.杭州研发部数据库专家牵头人和开发中心安全团队成员,负责技术管理.数据库和安全相关工作. 2009年加入中国工商银行软件开 ...

  7. 架构设计中的方法学(七)

    十三.代码验证 要保证架构的稳定和成功,利用代码对架构进行验证是一种实用的手段.代码验证的核心是测试,特别是单元测试.而测试的基本操作思路是测试优先,它是敏捷方法中非常重要的一项实践,是重构和稳定核模 ...

  8. Nginx 核心架构设计

    前言 最近在读 Nginx 相关的书籍,做一下读书笔记. Nginx 作为业界知名的高性能服务器,被广泛的应用.它的高性能正是由于其优秀的架构设计,其架构主要包括这几点:模块化设计.事件驱动架构.请求 ...

  9. IT架构设计_隽语集(Design Thinking _0901)

    前言:架构设计的主要流派有二:1) 抽象思维派:致力于抽象出稳定.可靠.不变的共同性架构:亦即,追求<万变不离其宗>的宗.2)组合创新派:致力于组合出具体独特性的创新架构:亦即,追求< ...

最新文章

  1. 由右移运算符引发的思考(计算机原理)
  2. 【leetcode】97. Interleaving String
  3. YII1 MVC初认识(二)
  4. 采用个hook技术对writefile函数进行拦截(2)
  5. linux中网络怎么检查,如何在Linux中检查以太网?
  6. c++什么时候数组溢出_C语言,营养丰富的C语言五,变长数组不是动态数组
  7. centos搭建rsync服务!
  8. tensorflow2.0 图像处理项目_游戏爱好者应该看看这个开源项目
  9. 电子之嵌入式主流芯片浏览
  10. exp参数feedback_Oracle数据库逻辑增量备份恢复之exp/imp参数inctype
  11. Eight Queens UVa 750
  12. linux 分区 LVM 挂载
  13. Flex读取非UTF-8中文数据乱码问题的解决方案
  14. 使用fsck修复文件系统
  15. 成都软通动力的的OFFER
  16. Java模拟HTTP/POST方式请求接口
  17. 初探微信小游戏(一)
  18. 多协议BGP-----MPBGP
  19. Dicom 图像--像素值(灰度值)转为CT值
  20. Allegro PCB快速查找并定位元器件

热门文章

  1. 人工智能入门从这里开始
  2. HTML特殊字符编码对照表(最全特殊字符编码)
  3. python用turtle画樱花飘落_如何用Python画出一颗漂亮的樱花
  4. Python——报数出圈
  5. 华科计算机创新实验班,经济学创新实验班
  6. 【SCI征稿】工程建筑材料数学类SCI,进展顺利,接收领域广
  7. Interview:算法岗位面试—11.14下午上海电***公司(国企)简单面试+技术一面之兴趣爱好、项目考察等
  8. 《MVC智慧商贸》项目研发阶段性总结
  9. 信息安全服务资质是什么?
  10. 中医的肝指的是哪里?