高速数据总线kafka介绍

1. Kafka的作用

在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。有没有一个系统可以同时搞定在线应用(消息)和离线应用(数据文件,日志)?这就需要kafka。Kafka可以起到两个作用:

1、降低系统组网复杂度。

2、降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka承担高速数据总线的作用。

2. Kafka产生背景

Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。 这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。

传统的日志分析系统提供了一种离线处理日志信息的可扩展方案,但若要进行实时处理,通常会有较大延迟。而现有的消(队列)系统能够很好的处理实时或者近似实时的应用,但未处理的数据通常不会写到磁盘上,这对于Hadoop之类(一小时或者一天只处理一部分数据)的离线应用而言,可能存在问题。Kafka正是为了解决以上问题而设计的,它能够很好地离线和在线应用。

3. Kafka架构

生产者(producer):消息和数据产生者

代理(Broker):缓存代理

消费者(consumer):消息和数据消费者

架构很简单,Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。

4. 设计要点

1、直接使用linux 文件系统的cache,来高效缓存数据。

2、采用linux Zero-Copy提高发送性能。传统的数据发送需要发送4次上下文切换,采用sendfile系统调用之后,数据直接在内核态交换,系统上下文切换减少为2次。根据测试结果,可以提高60%的数据发送性能。Zero-Copy详细的技术细节可以参考:https://www.ibm.com/developerworks/linux/library/j-zerocopy/

3、数据在磁盘上存取代价为O(1)。

a. kafka以topic来进行消息管理,每个topic包含多个part(ition),每个part对应一个逻辑log,有多个segment组成。

b. 每个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。

c. 每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。

d. 发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。

4、显式分布式,即所有的producer、broker和consumer都会有多个,均为分布式的。Producer和broker之间没有负载均衡机制。broker和consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。

5. 类似的系统

RocketMQ:国内淘宝团队参考开源的实现的消息队列,解决了kafka的一些问题,如优先级问题。

6. 参考资料:

http://blog.chinaunix.net/uid-20196318-id-2420884.html

http://dongxicheng.org/search-engine/kafka/

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2014-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【答疑解惑第九讲】如何在linux下面编译一个简单的c语言程序

存在问题: 习惯了用IDE,习惯了点击执行按钮。在linux就不能这样了,该咋办? 解决方案: 随着android的大热,在linux下搞开发的人也越来越多,好...

391110
来自专栏小狼的世界

Ubuntu下安装IE

做网页开发,IE是不可忽视的用户群体,所以需要在Linux下也有IE才能方便调试,下面是安装步骤:

40830
来自专栏歪先生_自留地

通信协议初选之MQTT

11210
来自专栏应兆康的专栏

Processon 免费在线流程图

54160
来自专栏开源优测

AutoLink开源平台源码组织结构

AutoLink是一个基于Python + Flask + RobotFramework开发的web IDE模式的自动化测试开源平台。

16230
来自专栏张伟博客

windows 内外网都能ping通却无法上网的解决方法

20660
来自专栏web前端教室

【视频5分钟】如何保持不同页面间的统计数据一致性?

温馨提示:视频请点此观看 // 视频原文: 为了更好的掌握用户的需求,我们经常需要统计: 1、统计用户在站点的停留时长 2、收集页面链接的点击数量等 3、统...

217100
来自专栏服务端技术杂谈

进程内缓存使用技术方案

进程内缓存可以采用带锁的Map或者第三方库,或者自己实现进程内缓存管理,如ConcurrentHashMap,ThreadLocal,guava cache等。

29930
来自专栏Laoqi's Linux运维专列

Ansible 多机房自动部署发布

23230
来自专栏翻译社

6个虚拟机备份和恢复的最佳实践

虚拟机的体系结构与传统的本地环境大不相同,需要不同的数据备份技术。本文将介绍一些备份虚拟机的最佳实践。

37160

扫码关注云+社区

领取腾讯云代金券