乐趣区

关于kafka:kafka是如何实现高吞吐量和高性能的

Kafka 是一个分布式、分区的、多正本的、多订阅者,基于 zookeeper 协调的分布式音讯零碎。
kafka 实现高吞吐量和性能,次要通过以下几点:

磁盘程序读写,保障了音讯的沉积

  • 程序读写,磁盘会预读,预读即在读取的起始地址间断读取多个页面,次要工夫破费在了传输工夫,而这个工夫两种读写能够认为是一样的。
  • 随机读写,因为数据没有在一起,将预读节约掉了。须要屡次寻道和旋转提早。而这个工夫可能是传输工夫的好多倍。

零拷贝

linux 操作系统“零拷贝”机制应用了 sendfile 办法,容许操作系统将数据从 Page Cache 间接发送到网络,只须要最初一步的 copy 操作将数据复制到 NIC 缓冲区,这样防止从新复制数据。示意图如下:

大家应该都晓得,从 Kafka 里常常要生产数据,那么生产的时候实际上就是要从 kafka 的磁盘文件里读取某条数据而后发送给上游的消费者,那么这里如果频繁的从磁盘读数据而后发给消费者,会减少两次没必要的拷贝。

一次是从操作系统的 cache 里拷贝到利用过程的缓存里,接着又从应用程序缓存里拷贝回操作系统的 Socket 缓存里。

而且为了进行这两次拷贝,两头还产生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。所以这种形式来读取数据是比拟耗费性能的。

Kafka 为了解决这个问题,在读数据的时候是引入零拷贝技术。

也就是说,间接让操作系统的 cache 中的数据发送到网卡后传输给上游的消费者,两头跳过了两次拷贝数据的步骤,Socket 缓存中仅仅会拷贝一个描述符过来,不会拷贝数据到 Socket 缓存

通过 零拷贝技术,就不须要把 os cache 里的数据拷贝到利用缓存,再从利用缓存拷贝到 Socket 缓存了,两次拷贝都省略了,所以叫做零拷贝。

对 Socket 缓存仅仅就是拷贝数据的描述符过来,而后数据就间接从 os cache 中发送到网卡下来了,这个过程大大的晋升了数据生产时读取文件数据的性能。

Kafka 从磁盘读数据的时候,会先看看 os cache 内存中是否有,如果有的话,其实读数据都是间接读内存的。

kafka 集群通过良好的调优,数据间接写入 os cache 中,而后读数据的时候也是从 os cache 中读。相当于 Kafka 齐全基于内存提供数据的写和读了,所以这个整体性能会极其的高。

页缓存技术

Kafka 是基于 操作系统 的页缓存来实现文件写入的。

操作系统自身有一层缓存,叫做 page cache,是在内存里的缓存,咱们也能够称之为 os cache,意思就是操作系统本人治理的缓存。

间接操作 page cache,而不是 JVM,防止 GC 耗时及对象创立耗时,且读写速度更高,过程重启、缓存也不会失落。

分区分段 + 索引

Kafka 的 message 是按 topic 分类存储的,topic 中的数据又是依照一个一个的 partition 即分区存储到不同 broker 节点。每个 partition 对应了操作系统上的一个文件夹,partition 实际上又是依照 segment 分段存储的。这也十分合乎分布式系统分辨别桶的设计思维。

通过这种分区分段的设计,Kafka 的 message 音讯实际上是分布式存储在一个一个小的 segment 中的,每次文件操作也是间接操作的 segment。为了进一步的查问优化,Kafka 又默认为分段后的数据文件建设了索引文件,就是文件系统上的.index 文件。这种分区分段 + 索引的设计,不仅晋升了数据读取的效率,同时也进步了数据操作的并行度。

批量压缩:多条音讯一起压缩,升高带宽

在很多状况下,零碎的瓶颈不是 CPU 或磁盘,而是网络 IO,对于须要在广域网上的数据中心之间发送音讯的数据流水线尤其如此。进行数据压缩会耗费大量的 CPU 资源, 不过对于 kafka 而言, 网络 IO 更应该须要思考。

如果每个音讯都压缩,然而压缩率绝对很低,所以 Kafka 应用了批量压缩,行将多个音讯一起压缩而不是单个消息压缩

Kafka 容许应用递归的音讯汇合,批量的音讯能够通过压缩的模式传输并且在日志中也能够放弃压缩格局,直到被消费者解压缩

Kafka 反对多种压缩协定,包含 Gzip 和 Snappy 压缩协定

Kafka 速度的秘诀在于,它把所有的音讯都变成一个批量的文件,并且进行正当的批量压缩,缩小网络 IO 损耗,通过 mmap 进步 I / O 速度,写入数据的时候因为单个 Partion 是开端增加所以速度最优;读取数据的时候配合 sendfile 间接暴力输入。

批量读写

Kafka 数据读写也是批量的而不是单条的。

除了利用底层的技术外,Kafka 还在应用程序层面提供了一些伎俩来晋升性能。最显著的就是应用批次。在向 Kafka 写入数据时,能够启用批次写入,这样能够防止在网络上频繁传输单个音讯带来的提早和带宽开销。假如网络带宽为 10MB/S,一次性传输 10MB 的音讯比传输 1KB 的音讯 10000 万次显然要快得多。

退出移动版