Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,以后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。linux
在大数据系统中,经常会碰到一个问题,整个大数据是由各个子系统组成,数据须要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并非很是适合大规模的数据处理。为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka就出现了。Kafka能够起到两个做用:算法
Kafka的总体架构很是简单,是显式分布式架构,producer、broker(kafka)和consumer均可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的做用。broker分发注册到系统中的consumer。broker的做用相似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通讯,是基于简单,高性能,且与编程语言无关的TCP协议。几个基本概念:apache
一、吞吐量编程
高吞吐是kafka须要实现的核心目标之一,为此kafka作了如下一些设计:缓存
负载均衡服务器
拉取系统架构
因为kafka broker会持久化数据,broker没有内存压力,所以,consumer很是适合采起pull的方式消费数据,具备如下几点好处:负载均衡
可扩展性框架
当须要增长broker结点时,新增的broker会向zookeeper注册,而producer及consumer会根据注册在zookeeper上的watcher感知这些变化,并及时做出调整。运维
Kayka的应用场景:
1.消息队列
比起大多数的消息系统来讲,Kafka有更好的吞吐量,内置的分区,冗余及容错性,这让Kafka成为了一个很好的大规模消息处理应用的解决方案。消息系统通常吞吐量相对较低,可是须要更小的端到端延时,并尝尝依赖于Kafka提供的强大的持久性保障。在这个领域,Kafka足以媲美传统消息系统,如ActiveMR或RabbitMQ。
2.行为跟踪
Kafka的另外一个应用场景是跟踪用户浏览页面、搜索及其余行为,以发布-订阅的模式实时记录到对应的topic里。那么这些结果被订阅者拿到后,就能够作进一步的实时处理,或实时监控,或放到hadoop/离线数据仓库里处理。
3.元信息监控
做为操做记录的监控模块来使用,即聚集记录一些操做信息,能够理解为运维性质的数据监控吧。
4.日志收集
日志收集方面,其实开源产品有不少,包括Scribe、Apache Flume。不少人使用Kafka代替日志聚合(log aggregation)。日志聚合通常来讲是从服务器上收集日志文件,而后放到一个集中的位置(文件服务器或HDFS)进行处理。然而Kafka忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让Kafka处理过程延迟更低,更容易支持多数据源和分布式数据处理。比起以日志为中心的系统好比Scribe或者Flume来讲,Kafka提供一样高效的性能和由于复制致使的更高的耐用性保证,以及更低的端到端延迟。
5.流处理
这个场景可能比较多,也很好理解。保存收集流数据,以提供以后对接的Storm或其余流式计算框架进行处理。不少用户会将那些从原始topic来的数据进行阶段性处理,汇总,扩充或者以其余的方式转换到新的topic下再继续后面的处理。例如一个文章推荐的处理流程,多是先从RSS数据源中抓取文章的内容,而后将其丢入一个叫作“文章”的topic中;后续操做多是须要对这个内容进行清理,好比回复正常数据或者删除重复数据,最后再将内容匹配的结果返还给用户。这就在一个独立的topic以外,产生了一系列的实时数据处理的流程。Strom和Samza是很是著名的实现这种类型数据转换的框架。
6.事件源
事件源是一种应用程序设计的方式,该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka能够存储大量的日志数据,这使得它成为一个对这种方式的应用来讲绝佳的后台。好比动态汇总(News feed)。
7.持久性日志(commit log)
Kafka能够为一种外部的持久性日志的分布式系统提供服务。这种日志能够在节点间备份数据,并为故障节点数据回复提供一种从新同步的机制。Kafka中日志压缩功能为这种用法提供了条件。在这种用法中,Kafka相似于Apache BookKeeper项目。
一、直接使用linux 文件系统的cache,来高效缓存数据。
二、采用linux Zero-Copy提升发送性能。传统的数据发送须要发送4次上下文切换,采用sendfile系统调用以后,数据直接在内核态交换,系统上下文切换减小为2次。根据测试结果,能够提升60%的数据发送性能。Zero-Copy详细的技术细节能够参考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/
三、数据在磁盘上存取代价为O(1)。kafka以topic来进行消息管理,每一个topic包含多个part(ition),每一个part对应一个逻辑log,有多个segment组成。每一个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。每一个part在内存中对应一个index,记录每一个segment中的第一条消息偏移。发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到必定的大小后将不会再往该segment写数据,broker会建立新的segment。
四、显式分布式,即全部的producer、broker和consumer都会有多个,均为分布式的。Producer和broker之间没有负载均衡机制。broker和consumer之间利用zookeeper进行负载均衡。全部broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。若是某个broker和consumer发生了变化,全部其余的broker和consumer都会获得通知。
愿意了解框架技术或者源码的朋友直接加求求(企鹅):2042849237
更多详细源码参考来源:http://minglisoft.cn/technology