作者 | 雷架

来源 | 爱笑的架构师

谈到大数据传输都会想到 Kafka,Kafka 号称大数据的杀手锏,在业界有很多成熟的应用场景并且被主流公司认可。这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用。

在业界已经有很多成熟的消息中间件如:RabbitMQ, RocketMQ, ActiveMQ, ZeroMQ,为什么 Kafka 在众多的敌手中依然能有一席之地,当然靠的是其强悍的吞吐量。

Kafka 如何做到支持百万级 TPS ?

先用一张思维导图直接告诉你答案:

Kafka 支持百万TPS的秘密

顺序读写磁盘

生产者写入数据和消费者读取数据都是顺序读写的,先来一张图直观感受一下顺序读写和随机读写的速度:

顺序读写 VS 随机读写

从图中可以看出传统硬盘或者SSD的顺序读写甚至超过了内存的随机读写,当然与内存的顺序读写对比差距还是很大。

所以Kafka选择顺序读写磁盘也不足为奇了。

下面以传统机械磁盘为例详细介绍一下什么是顺序读写和随机读写。

盘片盘面:一块硬盘一般有多块盘片,盘片分为上下两面,其中有效面称为盘面,一般上下都有效,也就是说:盘面数 = 盘片数 * 2。

磁头:磁头切换磁道读写数据时是通过机械设备实现的,一般速度较慢;而磁头切换盘面读写数据是通过电子设备实现的,一般速度较快,因此磁头一般是先读写完柱面后才开始寻道的(不用切换磁道),这样磁盘读写效率更快。

传统机械磁盘

磁道:磁道就是以中间轴为圆心的圆环,一个盘面有多个磁道,磁道之间有间隙,磁道也就是磁盘存储数据的介质。磁道上布有一层磁介质,通过磁头可以使磁介质的极性转换为数据信号,即磁盘的读,磁盘写刚好与之相反。

柱面:磁盘中不同盘面中半径相同的磁道组成的,也就是说柱面总数 = 某个盘面的磁道数。

扇区:单个磁道就是多个弧形扇区组成的,盘面上的每个磁道拥有的扇区数量是相等。扇区是最小存储单元,一般扇区大小为512bytes。

单盘片示意图

如果系统每次只读取一个扇区,那恐怕效率太低了,所以出现了block(块)的概念。文件读取的最小单位是block,根据不同操作系统一个block一般由多个扇区组成。

有了磁盘的背景知识我们就可以很容易理解顺序读写和随机读写了。

插播维基百科定义:

顺序读写:是一种按记录的逻辑顺序进行读、写操作的存取方法 ,即按照信息在存储器中的实际位置所决定的顺序使用信息。

随机读写:指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。

当读取第一个block时,要经历寻道、旋转延迟、传输三个步骤才能读取完这个block的数据。而对于下一个block,如果它在磁盘的其他任意位置,访问它会同样经历寻道、旋转、延时、传输才能读取完这个block的数据,我们把这种方式叫做随机读写。但是如果这个block的起始扇区刚好在刚才访问的block的后面,磁头就能立刻遇到,不需等待直接传输,这种就叫顺序读写

好,我们再回到 Kafka,详细介绍Kafka如何实现顺序读写入数据。

Kafka 写入数据是顺序的,下面每一个Partition 都可以当做一个文件,每次接收到新数据后Kafka会把数据插入到文件末尾,虚框部分代表文件尾。

顺序写

这种方法有一个问题就是删除数据不方便,所以 Kafka 一般会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个 offset 用来记录读取进度或者叫坐标。

顺序读

Memory Mapped Files(MMAP)

在文章开头我们看到硬盘的顺序读写基本能与内存随机读写速度媲美,但是与内存顺序读写相比还是太慢了,那 Kafka 如果有追求想进一步提升效率怎么办?可以使用现代操作系统分页存储来充分利用内存提高I/O效率,这也是下面要介绍的 MMAP 技术。

MMAP也就是内存映射文件,在64位操作系统中一般可以表示 20G 的数据文件,它的工作原理是直接利用操作系统的 Page 来实现文件到物理内存的直接映射,完成映射之后对物理内存的操作会被同步到硬盘上。

MMAP原理

通过MMAP技术进程可以像读写硬盘一样读写内存(逻辑内存),不必关心内存的大小,因为有虚拟内存兜底。这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销。

也有一个很明显的缺陷,写到MMAP中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用 flush 的时候才把数据真正的写到硬盘。

Kafka提供了一个参数:producer.type 来控制是不是主动 flush,如果Kafka写入到MMAP之后就立即flush然后再返回Producer叫同步(sync);写入MMAP之后立即返回Producer不调用flush叫异步(async)。

Zero Copy(零拷贝)

Kafka 另外一个黑技术就是使用了零拷贝,要想深刻理解零拷贝必须得知道什么是DMA。

什么是DMA?

众所周知 CPU 的速度与磁盘 IO 的速度比起来相差几个数量级,可以用乌龟和火箭做比喻。

一般来说 IO 操作都是由 CPU 发出指令,然后等待 IO 设备完成操作后返回,那CPU会有大量的时间都在等待IO操作。

但是CPU 的等待在很多时候并没有太多的实际意义,我们对于 I/O 设备的大量操作其实都只是把内存里面的数据传输到 I/O 设备而已。比如进行大文件复制,如果所有数据都要经过 CPU,实在是有点儿太浪费时间了。

基于此就有了DMA技术,翻译过来也就是直接内存访问(Direct Memory Access),有了这个可以减少 CPU 的等待时间。

Kafka 零拷贝原理

如果不使用零拷贝技术,消费者(consumer)从Kafka消费数据,Kafka从磁盘读数据然后发送到网络上去,数据一共发生了四次传输的过程。其中两次是 DMA 的传输,另外两次,则是通过 CPU 控制的传输。

四次传输过程

第一次传输:从硬盘上将数据读到操作系统内核的缓冲区里,这个传输是通过 DMA 搬运的。

第二次传输:从内核缓冲区里面的数据复制到分配的内存里面,这个传输是通过 CPU 搬运的。

第三次传输:从分配的内存里面再写到操作系统的 Socket 的缓冲区里面去,这个传输是由 CPU 搬运的。

第四次传输:从 Socket 的缓冲区里面写到网卡的缓冲区里面去,这个传输是通过 DMA 搬运的。

实际上在kafka中只进行了两次数据传输,如下图:

两次传输,零拷贝技术

第一次传输:通过 DMA从硬盘直接读到操作系统内核的读缓冲区里面。

第二次传输:根据 Socket 的描述符信息直接从读缓冲区里面写入到网卡的缓冲区里面。

我们可以看到同一份数据的传输次数从四次变成了两次,并且没有通过 CPU 来进行数据搬运,所有的数据都是通过 DMA 来进行传输的。没有在内存层面去复制(Copy)数据,这个方法称之为零拷贝(Zero-Copy)。

无论传输数据量的大小,传输同样的数据使用了零拷贝能够缩短 65% 的时间,大幅度提升了机器传输数据的吞吐量,这也是Kafka能够支持百万TPS的一个重要原因。

Batch Data(数据批量处理)

当消费者(consumer)需要消费数据时,首先想到的是消费者需要一条,kafka发送一条,消费者再要一条kafka再发送一条。但实际上 Kafka 不是这样做的,Kafka 耍小聪明了。

Kafka 把所有的消息都存放在一个一个的文件中,当消费者需要数据的时候 Kafka 直接把文件发送给消费者。比如说100万条消息放在一个文件中可能是10M的数据量,如果消费者和Kafka之间网络良好,10MB大概1秒就能发送完,既100万TPS,Kafka每秒处理了10万条消息。

看到这里你可以有疑问了,消费者只需要一条消息啊,kafka把整个文件都发送过来了,文件里面剩余的消息怎么办?不要忘了消费者可以通过offset记录消费进度。

发送文件还有一个好处就是可以对文件进行批量压缩,减少网络IO损耗。


总结

最后再总结一下 Kafka 支持百万级 TPS 的秘密:

(1)顺序写入数据,在 Partition 末尾追加,所以速度最优。

(2)使用 MMAP 技术将磁盘文件与内存映射,Kafka 可以像操作磁盘一样操作内存。

(3)通过 DMA 技术实现零拷贝,减少数据传输次数。

(4)读取数据时配合sendfile直接暴力输出,批量压缩把所有消息变成一个批量文件,合理减少网络IO损耗。

推 荐

CSDN公众号全新搜索技能上线啦!

只要在公众号后台回复消息

就能自动回复想搜索的内容啦!

简直是程序员必备的搜索神器!

猜猜回复“Mysql安装”会出现什么

支持百万级TPS,Kafka是怎么做到的?相关推荐

  1. 支持百万级TPS,Kafka是怎么做到的?答案藏在这10张图里

    谈到大数据传输都会想到 Kafka,Kafka 号称大数据的杀手锏,在业界有很多成熟的应用场景并且被主流公司认可.这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠 ...

  2. 实测|超融合数据库 MatrixDB 实现百万级 TPS

    01 背景 本次我们基于 Intel 提供的服务器,详细介绍在不同的硬件配置和数据集下,使用国际标准基准测试(Benchmark)TPC-B 对超融合时序数据库 MatrixDB 进行 OLTP 性能 ...

  3. Eurasia3 支持百万级用户的服务器和框架 - 国内开源项目介绍

    项目名称: Eurasia3 发起时间: 2004年 代码托管:http://code.google.com/p/eurasia 项目介绍: Eurasia3 是一种能够支持百万级同时在线长连接用户数 ...

  4. 迅雷链技术沙龙第一站:百万级TPS是怎样炼成的

    9月15日下午,由迅雷集团主办的链创未来·迅雷链技术沙龙在北京举行,作为此系列技术沙龙的首期活动,本期邀请了来自迅雷链开放平台产品负责人.研发负责人.研发工程师.HGBC等企业的技术大咖,为区块链爱好 ...

  5. 迅雷链的百万级TPS是怎样炼成的

    9月15日下午,由迅雷集团主办的链创未来·迅雷链技术沙龙在北京举行,作为此系列技术沙龙的首期活动,本期邀请了来自迅雷链开放平台产品负责人.研发负责人.研发工程师.HGBC等企业的技术大咖,为区块链爱好 ...

  6. 当数据库遇见FPGA:X-DB异构计算如何实现百万级TPS?

    阿里妹导读:X-Engine 是集团数据库事业部研发的新一代存储引擎,也是新一代分布式数据库X-DB的根基.在线事务处理的数据库存储引擎中,如何有效率的回收多版本的旧数据一直是一个难题,尤其在writ ...

  7. 车联网平台百万级消息吞吐架构设计

    前言 在之前的文章中,我们提到车联网 TSP 平台拥有很多不同业务的主题,并介绍了如何根据不同业务场景进行 MQTT 主题设计.车辆会持续不断产生海量的消息,每一条通过车联网上报的数据都是非常珍贵的, ...

  8. Java物联网开发(二) —— 开源百万级分布式 MQTT 消息服务器EMQX

    开源百万级分布式 MQTT 消息服务器EMQX 一. 是什么 1. 简介 2. 分类 3. EMQ X 消息服务器功能列表 二. 安装 1. 安装方式 rpm安装 docker安装 免安装 2. 目录 ...

  9. 多数据中心的百万级消息服务实战

    背景 利用RabbitMQ集群横向扩展能力,均衡流量压力,让消息集群的秒级服务能力达到百万,Google曾做过此类实验:有货在某些推送场景下也做了类似尝试,在此对此前实践经验以及踩得坑做些总结工作. ...

最新文章

  1. 为什么2100万个BTC发行总量少了0.0231?
  2. MySQL输入密码后闪退的解决方法
  3. Java和HTML有什么区别?哪个更重要?
  4. 零基础不建议学前端_web前端开发零基础怎样入门-哈尔滨前端学习
  5. OPPO Find X5/Pro搭载一体化流线设计,采用双芯片战略
  6. ip设计包括什么_一天卖200多万个潮玩,泡泡玛特如何打造超级IP?
  7. 凝聚 • 融合 • 协作——记webpower2015新春年会
  8. 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件
  9. 集 8 万员工之力, Google 开放 Bard,我们将它和 ChatGPT 正面 PK 了一下
  10. Js去除路径和文件后缀名
  11. 【git 报错】git add添加到暂存区报错:fatal: pathspec ‘xxx‘ did not match any files
  12. C#链接SQL知识点
  13. Face Paper: DSSD论文详解
  14. 【中控技术加持荣信化工智能工厂,尽显科技范儿】
  15. 第六届全国大学生生物医学工程创新设计竞赛参赛经历
  16. 江苏移动CM101s-MV100-EMMC- M8233_强刷固件包
  17. 软件测试外包到蚂蚁金服,2019蚂蚁金服面试经验(服务运营岗,测试开发工程师等)...
  18. rk3399 hdmi HDCP key烧录
  19. 有感腾讯入股搜狗,掌握入口才是王道
  20. Ubuntu16.04下安装类似于windows下微信软件,非网页版微信(内附安装包和详细安装指令)

热门文章

  1. Ubuntu 安装MySQL报共享库找不到
  2. Mac下SSH Key配置
  3. 20180908 2018-2019-2 《密码与安全新技术专题》第3周作业
  4. 对AUTOCAD软件的一些配置
  5. Jmeter4.X - 使用本身自带的脚本录制功能录制脚本
  6. java---同步与并发概念
  7. HDU 1257 最少拦截系统【最长上升子序列】
  8. 尖括号与双引号所引起的错误
  9. conda创建环境及激活环境失败问题
  10. 【LeetCode题解】402.移掉K位数字问题