文末有重磅福利。

作者:ninetyhe,腾讯 CDG 后台开发工程师

温故而知新,反复学习优秀的框架,定有所获。因为工作原因,需要用到 Kafka 的特殊场景,周末再次阅读了 kafka 的资料,收获不少。

kafka 由 LinkedIn 公司推出的一个高吞吐的分布式消息系统,通俗的说就是一个基于发布和订阅的消息队列,官网地址:

https://kafka.apache.org/intro

应用场景

  • 异步解构:在上下游没有强依赖的业务关系或针对单次请求不需要立刻处理的业务;

  • 系统缓冲:有利于解决服务系统的吞吐量不一致的情况,尤其对处理速度较慢的服务来说起到缓冲作用;

  • 消峰作用:对于短时间偶现的极端流量,对后端的服务可以启动保护作用;

  • 数据流处理:集成 spark 做实事数据流处理。

Kafka 拓扑图(多副本机制)

由上图我们可以发现 Kafka 是分布式,同时对于每一个分区都存在多副本,同时整个集群的管理都通过 zookeeper 管理。

Kafka 核心组件

broker

Kafka 服务器,负责消息存储和转发;一 broker 就代表一个 kafka 节点。一个 broker 可以包含多个 topic

topic

消息类别,Kafka 按照 topic 来分类消息

partition

  • topic 的分区,一个 topic 可以包含多个 partition,topic 消息保存在各个 partition 上;由于一个 topic 能被分到多个分区上,给 kafka 提供给了并行的处理能力,这也正是 kafka 高吞吐的原因之一。

  • partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写(这也是 kafka 比较快的原因之一,不需要随机写)。每个 Segment 数据文件以该段中最小的 offset ,文件扩展名为.log。当查找 offset 的 Message 的时候,通过二分查找快找到 Message 所处于的 Segment 中。

offset

  • 消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号

  • 同时也是主从之间的需要同步的信息。

Producer

生产者,负责向 Kafka Broker 发消息的客户端

Consumer

消息消者,负责消费 Kafka Broker 中的消息

Consumer Group

消费者组,每个 Consumer 必须属于一个 group;(注意的是 一个分区只能由组内一个消费者消费,消费者组之间互不影响。

Zookeeper

管理 kafka 集群,负责存储了集群 broker、topic、partition 等 meta 数据存储,同时也负责 broker 故障发现,partition leader 选举,负载均衡等功能。

服务治理

既然 Kafka 是分布式的发布/订阅系统,这样如果做的集群之间数据同步和一致性,kafka 是不是肯定不会丢消息呢?以及宕机的时候如果进行 Leader 选举呢?

数据同步

在 Kafka 中的 Partition 有一个 leader 与多个 follower,producer 往某个 Partition 中写入数据是,只会往 leader 中写入数据,然后数据才会被复制进其他的 Replica 中。而每一个 follower 可以理解成一个消费者,定期去 leader 去拉去消息。而只有数据同步了后,kafka 才会给生产者返回一个 ACK 告知消息已经存储落地了。

ISR

在 Kafka 中,为了保证性能,Kafka 不会采用强一致性的方式来同步主从的数据。而是维护了一个:in-sync Replica 的列表,Leader 不需要等待所有 Follower 都完成同步,只要在 ISR 中的 Follower 完成数据同步就可以发送 ack 给生产者即可认为消息同步完成。同时如果发现 ISR 里面某一个 follower 落后太多的话,就会把它剔除。

具体流程如下:

上述的做法并无法保证 kafka 一定不丢消息。 虽然 Kafka 通过多副本机制中最大限度保证消息不会丢失,但是如果数据已经写入系统 page cache 中但是还没来得及刷入磁盘,此时突然机器宕机或者掉电,那消息自然而然的就会丢失。

Kafka 故障恢复

Kafka 通过 Zookeeper 连坐集群的管理,所以这里的选举机制采用的是 Zab(zookeeper 使用)。

  • 生产者发生消息给 leader,这个时候 leader 完成数据存储,突然发生故障,没有给 producer 返回 ack;

  • 通过 ZK 选举,其中一个 follower 成为 leader,这个时候 producer 重新请求新的 leader,并存储数据。

Kafka 为什么这么快

顺序写磁盘

Kafka 采用了顺序写磁盘,而由于顺序写磁盘相对随机写,减少了寻地址的耗费时间。(在 Kafka 的每一个分区里面消息是有序的。

Page Cache

Kafka 在 OS 系统方面使用了 Page Cache 而不是我们平常所用的 Buffer。Page Cache 其实不陌生,也不是什么新鲜事物。

我们在linux上查看内存的时候,经常可以看到buff/cache,两者都是用来加速IO读写用的,而cache是作用于读,也就是说,磁盘的内容可以读到cache里面这样,应用程序读磁盘就非常快;而buff是作用于写,我们开发写磁盘都是,一般如果写入一个buff里面再flush就非常快。而kafka正是把这两者发挥了极致:Kafka虽然是scala写的,但是依旧在Java的虚拟机上运行,尽管如此,kafka它还是尽量避开了JVM的限制,它利用了Page cache来存储,这样躲开了数据在JVM因为GC而发生的STW。另一方面也是Page Cache使得它实现了零拷贝,具体下面会讲。

零拷贝

无论是优秀的 Netty 还是其他优秀的 Java 框架,基本都在零拷贝减少了 CPU 的上下文切换和磁盘的 IO。当然 Kafka 也不例外。零拷贝的概念具体这里不作太详细的复述,大致的给大家讲一下这个概念。

传统的一次应用程请求数据的过程

这里大致可以发传统的方式发生了 4 次拷贝,2 次 DMA 和 2 次 CPU,而 CPU 发生了 4 次的切换。_(DMA 简单理解就是,在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情)。

零拷贝的方式

通过优化我们可以发现,CPU 只发生了 2 次的上下文切换和 3 次数据拷贝。(linux 系统提供了系统事故调用函数“ sendfile()”,这样系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态)。

分区分段

我们上面也介绍过了,kafka 采取了分区的模式,而每一个分区又对应到一个物理分段,而查找的时候可以根据二分查找快速定位。这样不仅提供了数据读的查询效率,也提供了并行操作的方式。

数据压缩

Kafka 对数据提供了:Gzip 和 Snappy 压缩协议等压缩协议,对消息结构体进行了压缩,一方面减少了带宽,也减少了数据传输的消耗。

Kafka 安装

安装 JDK

由于使用压缩包还需要自己配置环境变量,所以这里推荐直接用 yum 安装,熟悉查看目前 Java 的版本:

yum -y list Java*

安装你想要的版本,这里我是 1.8

yum install java-1.8.0-openjdk-devel.x86_64

查看是否安装成功

Java -version

安装 Zookeeper

首先需要去官网下载安装包,然后解压

tar -zxvf zookeeper-3.4.9.tar.gz

要做的就是将这个文件复制一份,并命名为:zoo.cfg,然后在 zoo.cfg 中修改自己的配置即可

cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

主要配置解释如下

# zookeeper内部的基本单位,单位是毫秒,这个表示一个tickTime为2000毫秒,在zookeeper的其他配置中,都是基于tickTime来做换算的
tickTime=2000
# 集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。
initLimit=10
#syncLimit:集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5
# 数据存放文件夹,zookeeper运行过程中有两个数据需要存储,一个是快照数据(持久化数据)另一个是事务日志
dataDir=/tmp/zookeeper
## 客户端访问端口
clientPort=2181

配置环境变量

vim ~/.bash_profile
export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin
export PATH=$PATH:$ZK/bin
export PATH
// 启动
zkServer.sh start

下面能看启动成功

安装 Kafka

下载 kafka

https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

安装 kafka

 tar -xzvf kafka_2.12-2.0.0.tgz

配置环境变量

 export ZK=/usr/local/src/apache-zookeeper-3.7.0-binexport PATH=$PATH:$ZK/binexport KAFKA=/usr/local/src/kafkaexport PATH=$PATH:$KAFKA/bin

启动 Kafka

 nohup kafka-server-start.sh 自己的配置文件路径/server.properties &

大功告成!

参考资料

《深入理解 Kafka:核心设计实践原理》

“码上有趣” 视频挑战活动来了!

上传视频赢HHKB键盘和罗技鼠标!

了解活动可加微信:teg_helper(备注码上有趣)

视频号最新视频

一文入门 Kafka相关推荐

  1. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  2. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  3. 石油专业:一文入门机器学习,以测井岩性分类预测为例

    石油工程:一文入门机器学习,以测井岩性分类预测为例 1 前言 1.1 机器学习的相关背景 1.2 机器学习的八股文 2 模型实战 2.0 导入相关库 2.1 数据处理 2.1.1 数据读取 2.1.2 ...

  4. 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)

    最近博主在看强化学习的资料,找到这两个觉得特别适合入门,一个是"一文入门深度学习",一个是"莫烦PYTHON". 建议:看资料的时候可以多种资料一起参考,一边调 ...

  5. 一文入门HTML+CSS+JS(样例后续更新)

    一文入门HTML+CSS+JS(样例后续更新) 前言 HTML,CSS和JS的关系 HTML head元素 title link meta body元素 设置网页正文颜色与背景颜色 添加网页背景图片 ...

  6. 超详细讲解,带你零基础入门 kafka!

    作者:alonghub cnblogs.com/along21/p/10278100.html 认识 kafka kafka简介 Kafka 是一个分布式流媒体平台,kafka官网:http://ka ...

  7. 一文入门 Python 数据分析库 Pandas

    Pandas 通常用于快速简单的数据操作.聚合和可视化.在这篇文章中,我将概述如何学习这一工具的使用. Pandas 通常用于快速简单的数据操作.聚合和可视化.在这篇文章中,我将概述如何学习这一工具的 ...

  8. 一文入门基于三维数据的深度学习

    本文转载自北京智源人工智能研究院. 这是一篇三维数据深度学习的入门好文,兼顾基础与前沿,值得收藏!为方便大家学习,本文PDF版本和所列出的所有文献提供下载,(2020年7月27日11点后)在我爱计算机 ...

  9. 超详细教程,一文入门Istio架构原理及实战应用

    Istio简介 2.1.istio架构 实际上Istio 就是 Service Mesh 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 ...

最新文章

  1. linux文件IO与内存映射:用户空间的IO缓冲区
  2. Spring异常解决 java.lang.NullPointerException,配置spring管理hibernate时出错
  3. 英语应用文写作之感谢信
  4. 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
  5. 网管,待遇为何如此差劲?
  6. CloudFoundry和BOSH的关系
  7. 浅谈.Net异步编程的前世今生----APM篇
  8. 如何将nodejs项目程序部署到阿里云服务器上
  9. 关于maven导入工程pom文件报错问题及解决
  10. python3.5安装scrapy_在Python3.5下安装和测试Scrapy爬网站
  11. HanLP的自定义词典使用方式与注意事项介绍
  12. 关于灵魂安放,年轻人如何选择适合自己的城市呢?学长有话说
  13. SAP License:SE16N
  14. 数据中心运维管理经验39条
  15. html页面枚举 暴力,暴力枚举进程模块(示例代码)
  16. c语言电子钢琴课程设计,单片机课程设计(电子琴).doc
  17. 【软件开发】【项目管理】项目管理那些事儿之那些权力
  18. 30天自制操作系统笔记
  19. 9 matlab入门求一元二元函数的最小值和零点
  20. mySQL插入数据自动生成时间

热门文章

  1. 为什么很多招聘信息都要求三年以上的工作经验?
  2. ×××:关于促进云计算创新发展 培育信息产业新业态的意见
  3. REST 之 Spring 4 RESTful service
  4. ngCloak 实现 Angular 初始化闪烁最佳实践
  5. [Step By Step]SAP HANA PAL K分值硬聚类算法K-Means实现KMEANS
  6. 使用Custom.pll修改标准Form的LOV
  7. 牛客 - Dance with a stick(大风车模型)
  8. HDU - 2176 取(m堆)石子游戏(尼姆博奕)
  9. bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
  10. TensorFlow2-基础操作