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

Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录、浏览、点击、分享、喜欢)以及系统运行日志(CPU、内存、磁盘、网络、系统及进程状态)。

当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线)。高可靠交付对linkedin的日志不是必须的,故可通过降低可靠性来提高性能,同时通过构建分布式的集群,允许消息在系统中累积,使得kafka同时支持离线和在线日志处理。

注:本文中发布者(publisher)与生产者(producer)可以互换,订阅者(subscriber)与消费者(consumer)可以互换。

Kafka的架构如下图所示:

Kafka存储策略

  1. kafka以topic来进行消息管理,每个topic包含多个part(ition),每个part对应一个逻辑log,有多个segment组成。
  2. 每个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射。
  3. 每个part在内存中对应一个index,记录每个segment中的第一条消息偏移。
  4. 发布者发到某个topic的消息会被均匀的分布到多个part上(随机或根据用户指定的回调函数进行分布),broker收到发布消息往对应part的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。

发布与订阅接口

 

发布消息时,kafka client先构造一条消息,将消息加入到消息集set中(kafka支持批量发布,可以往消息集合中添加多条消息,一次行发布),send消息时,client需指定消息所属的topic。

订阅消息时,kafka client需指定topic以及partition num(每个partition对应一个逻辑日志流,如topic代表某个产品线,partition代表产品线的日志按天切分的结果),client订阅后,就可迭代读取消息,如果没有消息,client会阻塞直到有新的消息发布。consumer可以累积确认接收到的消息,当其确认了某个offset的消息,意味着之前的消息也都已成功接收到,此时broker会更新zookeeper上地offset registry(后面会讲到)。

高效的数据传输

  1. 发布者每次可发布多条消息(将消息加到一个消息集合中发布), sub每次迭代一条消息。
  2. 不创建单独的cache,使用系统的page cache。发布者顺序发布,订阅者通常比发布者滞后一点点,直接使用linux的page cache效果也比较后,同时减少了cache管理及垃圾收集的开销。
  3. 使用sendfile优化网络传输,减少一次内存拷贝。

无状态broker

  1. Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
  2. Broker不保存订阅者的状态,由订阅者自己保存。
  3. 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
  4. 消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset进行重新读取消费消息。

Consumer group

  1. 允许consumer group(包含多个consumer,如一个集群同时消费)对一个topic进行消费,不同的consumer group之间独立订阅。
  2. 为了对减小一个consumer group中不同consumer之间的分布式协调开销,指定partition为最小的并行消费单位,即一个group内的consumer只能消费不同的partition。

Zookeeper 协调控制

1. 管理broker与consumer的动态加入与离开。

2. 触发负载均衡,当broker或consumer加入或离开时会触发负载均衡算法,使得一

个consumer group内的多个consumer的订阅负载平衡。

3.  维护消费关系及每个partion的消费信息。

Zookeeper上的细节:

  1. 每个broker启动后会在zookeeper上注册一个临时的broker registry,包含broker的ip地址和端口号,所存储的topics和partitions信息。
  2. 每个consumer启动后会在zookeeper上注册一个临时的consumer registry:包含consumer所属的consumer group以及订阅的topics。
  3. 每个consumer group关联一个临时的owner registry和一个持久的offset registry。对于被订阅的每个partition包含一个owner registry,内容为订阅这个partition的consumer id;同时包含一个offset registry,内容为上一次订阅的offset。

消息交付保证

  1. kafka对消息的重复、丢失、错误以及顺序型没有严格的要求。
  2. kafka提供at-least-once delivery,即当consumer宕机后,有些消息可能会被重复delivery。
  3. 因每个partition只会被consumer group内的一个consumer消费,故kafka保证每个partition内的消息会被顺序的订阅。
  4. Kafka为每条消息为每条消息计算CRC校验,用于错误检测,crc校验不通过的消息会直接被丢弃掉。

Linkedin的应用环境

如下图,左边的应用于日志数据的在线实时处理,右边的应用于日志数据的离线分析(现将日志pull至hadoop或DWH中)。

 

Kafka的性能

 

测试环境: 2 Linux machines, each with 8 2GHz cores,  16GB  of  memory,  6  disks  with  RAID  10.  The  two machines are  connected  with  a  1Gb  network  link.  One  of  the machines was used as the broker and the other machine was used as the producer or the consumer.

测试评价(by me):(1)环境过于简单,不足以说明问题。(2)对于producer持续的波动没有进行分析。(3)只有两台机器zookeeper都省了??

测试结果:如下图,完胜其他的message queue,单条消息发送(每条200bytes),能到50000messages/sec,50条batch方式发送,平均为400000messages/sec.

Kafka未来研究方向

1. 数据压缩(节省网络带宽及存储空间)

2. Broker多副本

3. 流式处理应用

参考资料

【1】  http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf

【2】  https://cwiki.apache.org/KAFKA/kafka-papers-and-presentations.data/Kafka-netdb-06-2011.pdf

转载于:https://www.cnblogs.com/scott19820130/p/4736089.html

[转载] KAFKA分布式消息系统相关推荐

  1. KAFKA分布式消息系统

    Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录.浏览.点击.分享.喜欢)以及系统运行日志(CPU ...

  2. Centos_7.2 下构建 Kafka_2.13 分布式消息系统的单机版

    如何在 Centos_7.2 下构建 Kafka_2.13 分布式消息系统的单例模式 一.前言 本文对于 kafka 分布式消息系统,是一个不错的入口点,首先从安装开始,这样就可以对 kafka 有一 ...

  3. java kafka分布式_Kafka分布式消息系统

    1.简介 Kafka是一个分布式消息系统,使用Scala语言进行编写,具有高水平扩展以及高吞吐量特性. 目前流行的消息队列主要有三种:ActiveMQ.RabbitMQ.Kafka ActiveMQ. ...

  4. 分布式消息系统Kafka初步

    http://my.oschina.net/ielts0909/blog/92972 终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开 ...

  5. Kafka:用于日志处理的分布式消息系统

    文章目录 摘要 常用术语 关键词 1. 简介 2. 相关工作 3. Kafka架构和设计原则 3.1 单分区的效率 3.1.1 简单的存储 3.1.2 高效的传输 3.1.3 无状态代理 3.2 分布 ...

  6. 分布式消息系统 Kafka 简介

    分布式消息系统 Kafka 简介 阅读目录 5.1 吞吐量 5.2 负载均衡 5.3 拉取系统 5.4 可扩展性 5.5 消息删除策略 6.1 消息队列 6.2 行为跟踪 6.3 元信息监控 6.4 ...

  7. 一文读懂:Kafka(分布式消息队列)的基础概念,教程

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  8. Kafka 分布式消息队列介绍

    Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...

  9. 大数据开发hadoop核心的分布式消息系统:Apache Kafka 你知道吗

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(七):插件管理类简介
  2. RequestResponse(laravel)
  3. 【Leetcode | easy】回文数
  4. NLP深度学习:基于TensorFlow实现Skip-Gram模型
  5. Spring-学习笔记07【银行转账案例】
  6. 交换机短路_融商通达变频器功率模块短路维修故障案例
  7. 常使用的webserver地址
  8. 整合Flask中的目录结构
  9. 011235813用java写出来_【JAVA】关于在运行后控制台显示的一些功能问题,请吧友帮我解答...
  10. Mac备份工具:Carbon Copy Cloner Mac支持m1
  11. Eclipse导入Android项目 Eclipse常见错误 中文乱码问题
  12. 【bzoj2118】 墨墨的等式
  13. mui中双webView的刷新
  14. Python语法基础实验闯关
  15. xgboost时间序列预测matlab,LightGBM和XGBoost实现时间序列预测(2019-04-02)
  16. 一睹风采,见证郁锦香酒店遍布全球核心城市的百变姿态
  17. 3.2 数值分析: Jacobi与Gauss-Seidel迭代法
  18. Shell攻关之条件判断与流程控制
  19. 评论发表之屏蔽关键字
  20. 软件相关的小问题记录

热门文章

  1. linux 修改Db2主机名,对DB2服务器主机名的修改的正确操作流程
  2. Anaconda配置的环境里面增加第三方库的方法
  3. adminer.php下载,Adminer.php
  4. pagehelper插件oracle,带你学习最简单的分页插件PageHelper
  5. php连接mysql开发环境_PHP开发环境搭建及常用的数据库操作
  6. 9008刷机模式写入超时刷机帮_刷机时没有成功,然后变成黑砖,usb接口直接变成未知设备~希望大神救助!...
  7. VLAN端口转发原则
  8. java将异常输出到日志_【ThinkingInJava】25、将异常输出记录到日志
  9. 楚留香手游服务器维护,【楚留香手游】4.27日游戏维护公告
  10. java服务器要二次编译,ecology项目二次开发环境搭建