阿里巴巴国际站的前台网址是,门户网站的区别,自己做网站导航页,自己做网站哪种好做前言应大部分的小伙伴的要求#xff0c;在Yarn之前先来一个kafka的小插曲#xff0c;轻松愉快。一、Kafka基础消息系统的作用应该大部份小伙伴都清楚#xff0c;用机油装箱举个例子所以消息系统就是如上图我们所说的仓库#xff0c;能在中间过程作为缓存#xff0c;并且实… 前言应大部分的小伙伴的要求在Yarn之前先来一个kafka的小插曲轻松愉快。一、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后大文件可以分散存储在不同的服务器上。注意分区会有单点故障问题所以我们会为每个分区设置副本数分区的编号是从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 aconsumerB: group.id aconsumerC: group.id bconsumerD: group.id b再让consumerB也去消费TopicA的数据它是消费不到了但是我们在consumerC中重新指定一个另外的group.idconsumerC是可以消费到topicA的数据的。而consumerD也是消费不到的所以在kafka中不同组可有唯一的一个消费者去消费同一主题的数据。所以消费者组就是让多个消费者并行消费信息而存在的而且它们不会消费到同一个消息如下consumerABC是不会互相干扰的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.timeindex00000000000005367851.index00000000000005367851.log00000000000005367851.timeindex00000000000009936472.index00000000000009936472.log00000000000009936472.timeindex这个9936472之类的数字就是代表了这个日志段文件里包含的起始offset也就说明这个分区里至少都写入了接近1000万条数据了。Kafka broker有一个参数log.segment.bytes限定了每个日志段文件的大小最大就是1GB一个日志段文件满了就自动开一个新的日志段文件来写入避免单个文件过大影响文件的读写性能这个过程叫做log rolling正在被写入的那个日志段文件叫做active log segment。如果大家有看前面的两篇有关于HDFS的文章时就会发现NameNode的edits log也会做出限制所以这些框架都是会考虑到这些问题。3.Kafka的网络设计kafka的网络设计和Kafka的调优有关这也是为什么它能支持高并发的原因首先客户端发送请求全部会先发送给一个Acceptorbroker里面会存在3个线程(默认是3个)这3个线程都是叫做processorAcceptor不会对客户端的请求做任何的处理直接封装成一个个socketChannel发送给这些processor形成一个队列发送的方式是轮询就是先给第一个processor发送然后再给第二个第三个然后又回到第一个。消费者线程去消费这些socketChannel时会获取一个个request请求这些request请求中就会伴随着数据。线程池里面默认有8个线程这些线程是用来处理request的解析请求如果request是写请求就写到磁盘里。读的话返回结果。processor会从response中读取响应数据然后再返回给客户端。这就是Kafka的网络三层架构。所以如果我们需要对kafka进行增强调优增加processor并增加线程池里面的处理线程就可以达到效果。request和response那一块部分其实就是起到了一个缓存的效果是考虑到processor们生成请求太快线程数不够不能及时处理的问题。所以这就是一个加强版的reactor网络线程模型。finally集群的搭建会再找时间去提及。这一篇简单地从角色到一些设计的方面讲述了Kafka的一些基础在之后的更新中会继续逐步推进进行更加深入浅出的讲解。转自掘金juejin.im/post/5dcf6b6e51882510a23314f3end最新整理的 2TB 技术干货包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MongoDB、电子书、Java基础课程、Java实战项目、ELK Stack、机器学习、BAT面试精讲视频等。只需在「 民工哥技术之路」微信公众号对话框回复关键字1024 即可获取全部资料。 精彩文章推荐Zoom停止中国个人用户注册不再提供免费服务为什么中国开发不出流行的操作系统和编程语言华为狼文化被喷任正非回应华为没有996更没有007卧槽牛皮了头一次见有大佬把TCP三次握手四次挥手解释的这么明白介绍一款免费好用的可视化数据库管理工具全网最新、最全Linux面试题(2020版)好文章朕「在看」❤️↓↓↓