转 Kafka设计理念浅析

本文将从以下两个方面去尝试讲解Kafka的设计理念,主要参考文献在这里

  • Kafka设计背景及原因
  • Kafka的设计特色

Kafka设计背景及原因

Kafka最初被LinkedIn设计来处理活动流数据(activity stream data)和系统处理数据(operaitonal data)。活动流数据是指像page view、用户搜索关键词等等通过用户操作产生的数据,它的常见场景有时间线(time line)即新鲜事提醒、用户浏览量 搜索量排名等等。系统处理数据是服务器性能相关的数据,如CPU、负载、用户请求数等,它的应用场景多数是为后台服务,如在安全方面,可以监控到恶意攻击服务器的用户,从而做出相应措施,还有监控服务器性能,在其出现问题时即时报警等。

这两种数据都属于日志数据的范畴。常见的日志系统,如scribe等都是将这些数据收集起来,然后再通过线下批处理,如hadoop集群等,获取所需的结果。线下处理的频率一般不会太高,比如一个小时甚至一天一次,这是不适合做实时应用的,如timeline这种应用。现有的消息队列系统非常适合这种实时性要求高的场景,但是由于它们都是在内存中维护消息队列,所以处理数据的大小就受到了限制。看到这里,相信聪明的读者已经知晓了Kafka出现的原因,就是要将上面讲的这两种场景整合到一个系统中,即offline的大数据分析和online的实时数据分析都可以通过该系统实现。

Kafka在设计上保留了消息队列的常用操作,而这也使得在其诞生后被越来越广泛的作为一个消息队列使用,而不仅仅局限于处理上面提到的两种数据。

Kafka的设计特色

Kafka在设计上有以下几个特色:

  • 消息数据通过磁盘线性存取
  • 强调吞吐率
  • 消费状态由消费者自己维护
  • 分布式

消息数据通过磁盘线性存取

该特性应该是Kafka最让惊叹的特性。在我们的认识中,硬盘较内存的数据处理速度(读写)是慢很多的,所以基本所有设计数据处理的程序都是尽量使用内存。然而Kafka的设计者在经过一番调研测试后,大胆地采用了全硬盘存取消息数据的方案,他们的主要依据是:

  • 硬盘在线性读写的情况下性能优异。

    • 有测试表明在一个6 7200rpm 的SATA RAID-5 阵列上,线性写可以达到300MB/Sec,而随机写只有50KB/Sec。线性读写之所以可以有这么优异的表现与文件系统是分不开的,因为对写操作,操作系统一般会进行缓冲,而对于读操作,操作系统会进行预抓取的缓冲操作,这会极大地提高读取效率。又由于这一层缓存操作是在OS级的,也就意味着即便Kafka挂掉了重启,缓存也不会失效。
  • 减少JVM的GC触发。
    • JVM中的对象会占用除实际数据外的较多空间(如类的信息等等),结构不够紧凑,浪费空间。而当内存中维护的消息数据逐渐增多后,GC便会被频繁触发,这会极大影响应用的响应速度。因此,舍弃内存,使用磁盘可以减少GC触发带来的影响。

Kafka论文中与ActiveMQ等消息队列的性能比较也进一步肯定了Kafka的这一设计理念。

强调吞吐率

Kafka的设计初衷便是要能处理TB级的数据,其更强调的是吞吐率。吞吐率表现在读和写两个方面,Kafka在这两个方面都做了很多优化。

前面的文章中我们曾经提到过kafka存储消息数据的形式,如下图: topic-partition–0000.kafka –1024.kafka –2048.kafka kafka在启动时会将该文件夹中的所有文件以channel形式打开,并且只有最后一个kafka文件以读写形式打开,其他都以只读方式打开,新到的消息都直接append到最后一个kafka文件中,这样就实现了顺序写。而前面已经提到,顺序写的性能是极高的,这样写的性能就有了保障。

Kafka在读方面使用了sendfile这个高级系统函数,也即zero-copy技术,感兴趣的同学可以去阅读IBM的文章。 这项技术通过减少系统拷贝次数,极大地提高了数据传输的效率。简单说明如下:

程序读文件内容,调用socket发送内容,过程涉及以下几个步骤

  • 调用syscall,如read,陷入内核,读文件内容到内核缓存区pagecache
  • 程序将文件内容由内核缓存区拷贝到用户空间内存
  • 调用syscall,如socket write函数,陷入内核,将用户空间的内容拷贝的socket缓冲区内存,准备发送
  • 将socket缓冲区内存拷贝到NIC(Network Interface Controller)缓冲区,发送数据。

其中涉及了2次syscall和4次数据拷贝。相信读者一定发现这4次数据拷贝是显然没有必要的,直接把数据从pagecache的内核缓存区读到NIC缓冲区不就可以了吗?sendfile系统函数做的就是这件事情。显然这会极大地提升数据传输的效率。在java中对应的函数调用是

FileChannle.transferTo

另外,Kafka还通过多条数据压缩传输、存取的办法来进一步提升吞吐率。

消费状态由消费者自己维护

Kafka消息数据的消费状态由消费者自己维护,原因这里不再详述了,感兴趣的同学可以去阅读文章开头的参考文献。这里简单说一下这么做的好处:

  • 去除了服务端维护消费状态的压力。
  • 提升了消费者存储消费状态的自由度,如存储位置,可以存在zookeeper 数据库或者HDFS中,根据消费者自身的需求即可。
  • 针对特殊需求,如消息消费失败,消费者可以回滚而重新消费消息。

分布式

Kafka的broker producer和consumer都是可分布的,其实现是通过zookeeper来维护集群中这三者的信息,从而实现三者的交互,详细实现留待以后再说。

通过上面的介绍相信大家已经对Kafka的设计有了一定的了解。这样的设计完全可以整合offline大数据处理和online实时处理的需求。对于offline处理,kafka支持将数据批量的迁移到hdfs中,而对于online的实时处理,只要合理的设置consumer处理特性就可以很容易地做到。LinkedIn在其文章中曾举到一个kafka的应用案例,这里与大家分享下。使用kafka来更新索引,当用户更新了自己的数据后,producer便产生一条消息发送到broker,consumer会即时获取该数据,进而更新索引,这样也就可以做到搜索时数据”秒级更新“的特性了。

小结

本文尝试向大家讲解Kafka的由来和设计特色,但笔者能力有限,如果有理解错误的地方,欢迎读者留言交流。接下来,笔者会针对kafka源码进行简单的剖析,也希望感兴趣的读者可以参与进来。

原文地址:http://rockybean.github.io/2012/07/30/jafka-design/

时间: 2024-10-03 14:56:22

转 Kafka设计理念浅析的相关文章

浅析Banner设计理念

当今,无论任何一款互联网产品,都需要搭载PC平台进行推广,Banner更是推广的一大利器,怎么将Banner设计好就成为一个需要探讨研究的课题. Banner规格尺寸大小不一,文件大小也有一定的限制,这就使得在设计上增加了许多障碍,颜色不能太丰富,否则会在文件大小的限制下失真,软文不能太多,否则会没有重点,得不偿失,怎么在方寸间把握平衡,变得十分重要.接下来,我为大家总结累一些,如有鄙陋,请指正,万分感谢.   第一部分:颜色 1.Banner与环境对比 试想如果在一个以浅色调为基准的网站上投放

为PostgreSQL讨说法 - 浅析《UBER ENGINEERING SWITCHED FROM POSTGRES TO MYSQL》

背景 最近有一篇文档,在国外闹得沸沸扬扬,是关于UBER使用mysql替换postgres原因的文章. 英文原文https://eng.uber.com/mysql-migration/ 来自高可用架构的 中文翻译 文章涉及到 PG数据库的部分,背后的原理并没有深入的剖析,导致读者对PostgreSQL的误解 . uber在文章阐述的遇到的PG问题 We encountered many Postgres limitations: Inefficient architecture for wri

Spark设计理念与基本架构

<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析>一书第一章的内容请看链接<第1章 环境准备> 本文主要展示本书的第2章内容: 第2章 设计理念与基本架构 "若夫乘天地之正,而御六气之辩,以游无穷者,彼且恶乎待哉?" --<庄子·逍遥游> 本章导读:       上一章,介绍了Spark环境的搭建,为方便读者学习

Kafka设计解析(一)- Kafka背景及架构介绍

本文转自Jason's Blog, 原文链接 http://www.jasongj.com/2015/03/10/KafkaColumn1 摘要 Kafka是由LinkedIn开发并开源的分布式消息系统,因其分布式及高吞吐率而被广泛使用,现已与Cloudera Hadoop,Apache Storm,Apache Spark集成.本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Producer消息路由,Consumer Group

Kafka深度解析

[本文转自于Kafka深度解析] 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 为什么要用消息系统 解耦 在项目启动之初来预测将来项目

Kafka和Twitter新开源的DistributedLog技术对比

我们在2016年五月开源了DistributedLog项目,引起了社区的广泛关注.大家常常问起的问题之一就是DistributedLog与Apache Kafka相对比,各有什么优劣. 从技术上来讲DistributedLog并不是一个象Apache Kafka那么成熟的.有分区机制的广播/订阅系统.DistributedLog是一个复制日志流仓库,它用Apache BookKeeper来做日志分区仓库.它关注的是构建可靠的实时系统所需要的持久性.副本和强一致性.可以把DistributedLo

Apache Kafka:大数据的实时处理时代

在过去几年,对于 Apache Kafka 的使用范畴已经远不仅是分布式的消息系统:我们可以将每一次用户点击,每一个数据库更改,每一条日志的生成,都转化成实时的结构化数据流,更早的存储和分析它们,并从中获得价值.同时,越来越多的企业应用也开始从批处理数据平台向实时的流数据数据平台转移.本演讲将介绍最近 Apache Kafka 添加的一些系统架构,包括 Kafka Connect 和 Kafka Streams,并且描述一些如何使用它们的实际应用体验. 注:本文由王国璋在 QCon 北京 201

浅析Hadoop1.0与2.0设计原理

浅析Hadoop1.0与2.0设计原理 尧炜 马又良 简要介绍了Hadoop发展历史及其版本演进进程:详细阐述了Hadoop 1. 0中的HDFS 设计理念.架构.读取/写入数据流程和MapReduce架构.任务执行流程,以及Hadoop1. 0 功能不足问题:详细阐述了针对Hadoop1. 0 功能不足问题,Hadoop2. 0 所做的增强功能应对方案,包括NameNode HA 方案.HDFS Federation方案和YARN 设计原理等. 浅析Hadoop1.0与2.0设计原理

kafka详解一、Kafka简介

背景:      当今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它        如何及时做到如上两点      以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁-消息系统.      从一个微观层面来说,这种需求也可理解为不同的系统之间如何传递消息. Kafka诞生