前言

应大部分的小伙伴的要求,在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后,大文件可以分散存储在不同的服务器上。

注意:

  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.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的调优有关,这也是为什么它能支持高并发的原因

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

转自:掘金

juejin.im/post/5dcf6b6e51882510a23314f3

end

最新整理的 2TB 技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MongoDB、电子书、Java基础课程、Java实战项目、ELK Stack、机器学习、BAT面试精讲视频等。只需在「 民工哥技术之路」微信公众号对话框回复关键字:1024 即可获取全部资料。 

精彩文章推荐:


Zoom停止中国个人用户注册,不再提供免费服务

为什么中国开发不出流行的操作系统和编程语言?

华为狼文化被喷,任正非回应:华为没有996,更没有007!

卧槽!牛皮了,头一次见有大佬把TCP三次握手四次挥手解释的这么明白

介绍一款免费好用的可视化数据库管理工具

全网最新、最全Linux面试题(2020版)!

好文章,朕在看」❤️↓↓↓

kafka集群为什么需要三个节点_大白话带你认识 Kafka相关推荐

  1. kafka集群为什么需要三个节点_每天处理千亿级日志量,Kafka是如何做到的?

    之前为大家分享了不少 Kafka 原理解析类的干货,今天咱们一起来看看 360 基于 Kafka 千亿级数据量的深度实践! 图片来自 Pexels 本文主要围绕如下内容分享: 消息队列选型 Kafka ...

  2. kafka集群为什么需要三个节点_Kafka突然宕机了?稳住,莫慌!

    " 问题要从一次 Kafka 的宕机开始说起.笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的 RabbitMQ,而是采用了设计之初就为日志处理而生的 Kafka, ...

  3. Kafka集群在马蜂窝大数据平台的优化与应用扩展

    导读 Kafka 是当下热门的消息队列中间件,它可以实时地处理海量数据,具备高吞吐.低延时等特性及可靠的消息异步传递机制,可以很好地解决不同系统间数据的交流和传递问题. Kafka 在马蜂窝也有非常广 ...

  4. centos7搭建Linux集群,CentOS 7下Kafka集群安装

    一.环境操作系统和软件版本介绍 1.环境操作系统为CentOS Linux release 7.2.1511 (Core) 可用cat /etc/RedHat-release查询 2.软件版本 Kaf ...

  5. kafka集群下载、启动、部署、测试

    文章目录 一.kafka基础操作 1. kafka下载 2. 解压 3. 重命名 4. 在kafka目录下创建 data 数据文件夹 5. 修改配置文件 6. 配置kafka环境变量 7. 刷新环境变 ...

  6. 几种常见的Kafka集群监控工具「送书」

    本文选自电子工业出版社的新书<kafka进阶>,推荐一下. 送书规则:文末留言,精选精彩留言,对留言点赞最多的4位包邮送书一本~ 截止时间:2022.06.20  8:00 一个功能健全的 ...

  7. Kafka 集群在马蜂窝大数据平台的优化与应用扩展

    Kafka 是当下热门的消息队列中间件,它可以实时地处理海量数据,具备高吞吐.低延时等特性及可靠的消息异步传递机制,可以很好地解决不同系统间数据的交流和传递问题. Kafka 在马蜂窝也有非常广泛的应 ...

  8. ELK+kafka集群实战

    ELK+Kafka集群 前言 前言 业务层可以直接写入到kafka队列中,不用担心elasticsearch的写入效率问题. 图示 Kafka Apache kafka是消息中间件的一种,是一种分布式 ...

  9. 【K8S】 基于Kubernetes部署Kafka集群

    主要参考了https://stackoverflow.com/questions/44651219/kafka-deployment-on-minikube和https://github.com/ra ...

最新文章

  1. vue入门总结(3)
  2. php添加gd扩展,centos下为php添加gd扩展
  3. c语言得到系统的函数,c语言系统函数(C language system function).doc
  4. [蓝桥杯2018决赛]最大乘积-dfs
  5. [Linux C]递归遍历指定目录下的子目录和文件
  6. python网络爬虫系列(四)——requests模块
  7. win11可以支持win10驱动吗 Windows11更新驱动的步骤方法
  8. mysql 6.17,mysql小结篇2(17.6.27)
  9. 迅捷PDF虚拟打印机怎么安装和使用
  10. oracle数据库有64位的吗,plsql有64位的吗
  11. 计算机专业及课程设置,清华及各大高校公布计算机专业培养方案课程
  12. Android利用shape画虚线
  13. JDK类库创建一张简单图片
  14. cpuz检测硬件真假_难道CPU真的没有真假,只有好坏?
  15. html颜色趋势,跟上色彩潮流!带你展望2015年的网页设计配色趋势
  16. 29 Redis 应对并发访问的无锁原子操作
  17. 电路实验一阶电路误差分析_常见滤波电路分析技巧
  18. 如何查看linux系统版本
  19. devC++代码格式化对齐的快捷键
  20. Android应用程序签名 debug签名

热门文章

  1. iOS-BMK标注覆盖物
  2. 阅读 LdrInitializeThunk
  3. 在BingoCC上面解析域名实现智能路由
  4. 00001-整数倒置-Java-leetcode-要考虑到溢出问题
  5. 情感数据对LSTM股票预测模型的影响研究
  6. windows c++ 内存映射大文件问题记录
  7. win8 oracle10g,win7/win8 下安装oracle10g的方法
  8. python定义类时括号_为什么在定义类时括号是可选的,而在定义函数时括号是必需的?...
  9. 读取打印TFRecord格式数据
  10. tensor也可以作为索引