您的位置 首页 大数据运维

kafka原理之为什么快

kafka原理之为什么快

消息持久化及其缓存

磁盘性能:在传统的磁盘写入很慢,因为它使用随机写入 50k/s(6 个 7200 转的 sata 硬盘组成的 raid-5),但是线性写入速度有 300ms/s 的速度,所以 kafka 利用线性写入的方式。

线性写入:将数据调用操作系统文件接口写到文件系统里面去这样就缓存到操作系统的页面缓存中,然后传统意思来说将其 flush 一下到磁盘中,但是 kafka 并没有这样,而是保存在页面缓存中(相当于放在内存当中)并没有进行 flush 操作,这样他就会提供比较高的读的性能,下次读就从内核页面缓存中读数据,但是内存中存储数量不是无限大的,所以我们配置参数(每当接收到 N 条信息或者每过 M 秒),进行一个 flush操作,从而可以为系统硬件崩溃时“处于危险之中”的数据在量上加个上限。

kafka 的缓存不是在内存中保存尽可能多的数据并在需要时将这些数刷新到文件系统,而是做完全相反的事情,将所有的数据立即写入文件系统中的持久化的日志中,但不进行刷刷新数据的调用,实际这么做意味着数据被传输到 os 内核的页面缓存中去了,随后在根据配置刷新到硬盘。

持久化常量时间

以往的消息系统元数据的持久化数据结构往往采用 BTree。BTree 是目前最常用额数据结构,在消息系统中它可以用来广泛支持多种不同的事物性活非事务性的语义,他的确带来了一个非常高的处理开销,Btree 的运算时间的复杂度为 0(LOG n),Btree 需要一种非常负责的页面级或者行级锁才能避免在每次操作时锁定整颗树。实现这种机器就要为行级锁定付出非常昂贵的代价,负责就必须所有的读取操作进行串行化(serialize).因为对磁盘寻道操作的高度依赖,就不太可能高效的从驱动器密码的提高中获得改善,因而就不得不使用容量较小(<100GB)转速较快的 sas 驱动,以维持一种比较合理的数据与寻道容量之比。kafka 的设计是什么样的呢?kafka 利用按照通常的日志解决方案的样子构建,只是简单的文件读取和简单地向文件中追加内容。当然相比的劣势在于不支持 Btree 这样事物和非事物的语义支持,但是优势在于其所有的操作复杂度都是 0(1),读取操作并不需要阻止写入操作,而且反之亦然。这样做显然有性能优势,因为性能完全同数据大小之间脱离了关系。能够存取到几乎无限大的磁盘空间而无须付出性能代价,意味着,我们可以提供其他消息系统并不常见的功能,例如在 kafka 中,消息在使用完全后并没有立即删除,而是会将这些消息保存相当长一段时间,这样可以利用offset功能进行多次消费,比如说 可以设置从某个 offset id 往下进行消费,当然一般只有是消费失败才会这么做。

 

传统的消息发送:

a、操作系统将数据从磁盘中读取到内核空间里的页面缓存。
b、应用程序将数据从内核空间读入到用户空间的缓冲区。
c、应用程序将读到的数据写会内核空间并放入 socket 的缓冲区
d、操作系统将数据从 socket 的缓冲区拷贝到 NIC(网络接口卡,即网卡)的缓冲区,自此数据才能通过网络发送出去,这样效率显然很低,因为里面涉及到 4 此拷贝,2 次系统调用。

 

kafka 的信息发送是如何的呢?

kafka 使用 sendfile(0 拷贝)就可以避免这些重复的拷贝操作,让 os 直接将数据从页面缓存发送到网络中,其中只需最后一步中的将数据拷贝到 NIC的缓冲区。
kafka 采用全文所属的 sendfile 拷贝优化方案,数据只需要拷贝到页面缓存中一次,然后每次发送给使用者时都对他重复使用即可,一次拷贝发给多个消费者

 

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章