首页 优德88中文正文

红霉素软膏的作用,3台廉价机器每秒写入2百万!Kafka为什么那么快?-优德88手机客户端

admin 优德88中文 2019-05-16 283 0

Kafka 的音讯是保存或缓存在磁盘上的,一般以为在磁盘上读写数据是会下降功能的,因为寻址会比较耗费时刻,可是实际上,Kafka 的特性之一便是高吞吐率。

Kafka 的音讯是保存或缓存在磁盘上的,一般以为在磁盘上读写数据是会下降功能的,因为寻址会比较耗费时刻,可是实际上,Kafka 的特性之一便是高吞吐率。



即使是一般的服务器,Kafka 也能够轻松支撑每秒百万级的写入恳求,超越了大部分的音讯中间件,这种特性也使得 Kafka 在日志处理等海量数据场景广泛应用。

针对 Kafka 的基准测验能够参阅 Apache Kafka 基准测验(可点击阅览原文检查)《每秒写入 2 百万(在三台廉价机器上)》:

http://ifeve.com/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines/ 

下面从数据写入和读取两方面剖析,为什么 Kafka 速度这么快。

数据写入

Kafka 会把收到的音讯都写入到硬盘中,它必定不会丢掉数据。为了优化写入速度 Kafka 采用了两个技能, 次序写入和 MMFile(Memory Mapped File)。

次序写入

磁盘读写的快慢取决于你怎样运用它,也便是次序读写或许随机读写。在次序读写的情况下,磁盘的次序读写速度和内存相等。

因为硬盘是机械结构,每次读写都会寻址->写入,其间寻址是一个“机械动作”,它是最耗时的。

所以硬盘最厌烦随机 I/O,最喜欢次序 I/O。为了进步读写硬盘的速度,Kafka 便是运用次序 I/O。

而且 Linux 关于磁盘的读写优化也比较多,包含 read-ahead 和 write-behind,磁盘缓存等。

假如在内存做这些操作的时分,一个是 Java 目标的内存开支很大,另一个是跟着堆内存数据的增多,Java 的 GC 时刻会变得很长。

运用磁盘操作有以下几个优点:

  • 磁盘次序读写速度超越内存随机读写。
  • JVM 的 GC 功率低,内存占用大。运用磁盘能够防止这一问题。
  • 体系冷启动后,磁盘缓存仍然可用。

下图就展现了 Kafka 是怎么写入数据的, 每一个 Partition 其实都是一个文件 ,收到音讯后 Kafka 会把数据刺进到文件结尾(虚框部分):



这种办法有一个缺点——没有办法删去数据 ,所以 Kafka 是不会删去数据的,它会把一切的数据都保存下来,每个顾客(Consumer)对每个 Topic 都有一个 Offset 用来表明读取到了第几条数据 。



两个顾客:

  • Consumer1 有两个 Offset 别离对应 Partition0、Partition1(假定每一个 Topic 一个 Partition)。
  • Consumer2 有一个 Offset 对应 Partition2。

这个 Offset 是由客户端 SDK 担任保存的,Kafka 的 Broker 彻底无视这个东西的存在。

一般情况下 SDK 会把它保存到 Zookeeper 里边,所以需求给 Consumer 供给 Zookeeper 的地址。

假如不删去硬盘必定会被撑满,所以 Kakfa 供给了两种战略来删去数据:

  • 根据时刻
  • 根据 Partition 文件巨细

详细装备能够参看它的装备文档。

Memory Mapped Files

即便是次序写入硬盘,硬盘的拜访速度仍是不可能追上内存。所以 Kafka 的数据并不是实时的写入硬盘 ,它充分运用了现代操作体系分页存储来运用内存进步 I/O 功率。

Memory Mapped Files(后边简称 mmap)也被翻译成内存映射文件 ,在 64 位操作体系中一般能够表明 20G 的数据文件,它的作业原理是直接运用操作体系的 Page 来完结文件到物理内存的直接映射。

完结映射之后你对物理内存的操作会被同步到硬盘上(操作体系在恰当的时分)。

经过 mmap,进程像读写硬盘相同读写内存(当然是虚拟机内存),也不用关怀内存的巨细,有虚拟内存为咱们兜底。

运用这种办法能够获取很大的 I/O 进步,省去了用户空间到内核空间仿制的开支。(调用文件的 Read 会把数据先放到内核空间的内存中,然后再仿制到用户空间的内存中)

但也有一个很明显的缺点——不可靠,写到 mmap 中的数据并没有被真实的写到硬盘,操作体系会在程序自动调用 Flush 的时分才把数据真实的写到硬盘。

Kafka 供给了一个参数 producer.type 来操控是不是自动 Flush:

  • 假如 Kafka 写入到 mmap 之后就当即 Flush,然后再回来 Producer 叫同步 (Sync)。
  • 假如 Kafka 写入 mmap 之后当即回来 Producer 不调用 Flush 叫异步 (Async)。

数据读取

Kafka 在读取磁盘时做了哪些优化?

根据 Sendfile 完结Zero Copy

传统方式下,当需求对一个文件进行传输的时分,其详细流程细节如下:

  • 调用 Read 函数,文件数据被 Copy 到内核缓冲区。
  • Read 函数回来,文件数据从内核缓冲区 Copy 到用户缓冲区
  • Write 函数调用,将文件数据从用户缓冲区 Copy 到内核与 Socket 相关的缓冲区。
  • 数据从 Socket 缓冲区 Copy 到相关协议引擎。

以上细节是传统 Read/Write 办法进行网络文件传输的办法,咱们能够看到,在这个进程傍边,文件数据实际上是经过了四次 Copy 操作:

硬盘—>内核 buf—>用户 buf—>Socket 相关缓冲区—>协议引擎

而 Sendfile 体系调用则供给了一种削减以上屡次 Copy,进步文件传输功能的办法。

在内核版别 2.1 中,引入了 Sendfile 体系调用,以简化网络上和两个本地文件之间的数据传输。

Sendfile 的引入不只削减了数据仿制,还削减了上下文切换。

sendfile(socket, file, len); 

运转流程如下:

  • Sendfile 体系调用,文件数据被 Copy 至内核缓冲区。
  • 再从内核缓冲区 Copy 至内核中 Socket 相关的缓冲区。
  • 最终再 Socket 相关的缓冲区 Copy 到协议引擎。

相较传统 Read/Write 办法,2.1 版别内核引入的 Sendfile 现已削减了内核缓冲区到 User 缓冲区,再由 User 缓冲区到 Socket 相关缓冲区的文件 Copy。

而在内核版别 2.4 之后,文件描述符成果被改动,Sendfile 完结了更简略的办法,再次削减了一次 Copy 操作。

在 Apache、Nginx、Lighttpd 等 Web 服务器傍边,都有一项 Sendfile 相关的装备,运用 Sendfile 能够大幅进步文件传输功能。

Kafka 把一切的音讯都存放在一个一个的文件中,当顾客需求数据的时分 Kafka 直接把文件发送给顾客,合作 mmap 作为文件读写办法,直接把它传给 Sendfile。

批量紧缩

在许多情况下,体系的瓶颈不是 CPU 或磁盘,而是网络 IO,关于需求在广域网上的数据中心之间发送音讯的数据流水线特别如此。

进行数据紧缩会耗费少数的 CPU 资源,不过关于 Kafka 而言,网络 IO 更应该考虑:

  • 因为每个音讯都紧缩,可是紧缩率相对很低,所以 Kafka 运用了批量紧缩,行将多个音讯一同紧缩而不是单个音讯紧缩。
  • Kafka 答应运用递归的音讯调集,批量的音讯能够经过紧缩的方式传输而且在日志中也能够坚持紧缩格局,直到被顾客解紧缩。
  • Kafka 支撑多种紧缩协议,包含 Gzip 和 Snappy 紧缩协议。

总结

Kafka 速度的诀窍在于,它把一切的音讯都变成一个批量的文件,而且进行合理的批量紧缩,削减网络 IO 损耗,经过 mmap 进步 I/O 速度。

写入数据的时分因为单个 Partion 是结尾增加,所以速度最优;读取数据的时分合作 Sendfile 直接暴力输出。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    优德88手机客户端_w88优德_w88

    http://www.hongshengqp.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    w88出品