![](http://kafka.apache.org/images/logo.png)
0、名字-kafka
看到这本书《KAFKA The Metamorphosis》(译名:变形记),作者:Franz Kafka。豆瓣评分8.4分,3万多评价,与Apache kafka重名并不是巧合。
Apache kafka开发者Jay Kreps提供了他的见解:由于Kafka是一个针对写作优化的系统,使用作者的名字是有道理的。 我在大学里学过很多课程,并且喜欢弗兰兹·卡夫卡。 此外,对于一个开源项目来说这个名字听起来很酷。
这就是其 名字的渊缘。
1、kafka成长故事
LinkedIn的开发团队主要由软件工程师/架构师Jay Kreps领导,他之前负责分布式键值存储系统Voldemort的开发和开源发布。最初的团队还包括Neha Narkhede和后来的Jun Rao。他们共同创建了一个消息系统,可以满足监控和跟踪系统的需求,并可以扩展到未来。主要目标是:
- 使用推拉模型将生产者和消费者分离
- 为消息传递系统中的消息数据提供持久性,以允许多个消费者
- 优化消息的高吞吐量
- 允许系统的水平扩展随着数据流的增长而增长
最终一个发布/订阅消息传递系统诞生了,它具有典型的消息传递系统接口,但存储层更像是一个日志聚合系统。结合使用Apache Avro进行消息序列化,Kafka可以有效地处理每天数十亿条消息的指标和用户活动跟踪。 Kafka的可扩展性帮助LinkedIn的使用量增长了超过1万亿条消息(截至2015年8月),每天消耗的数据超过1 PB。
- 2010年底,Kafka在GitHub上作为开源项目发布,初始版本是0.7.0。
- 随着它开始在开源社区引起关注,2011年7月被提议并被接受为Apache Software Foundation孵化器项目。
- 2012年10月,Apache Kafka从孵化器项目毕业。
从那时起,它一直在努力,并在LinkedIn之外找到了一个强大的贡献者和提交者社区。 Kafka现在用于世界上一些最大的数据管道。
- 2014年秋天,Jay Kreps、Neha Narkhede、Jun Rao离开LinkedIn,成立Confluent,一家以给Apache Kafka提供开发、企业支持和培训为中心的公司。
- 2017年11月1日,发布1.0.0版本
- 2018年7月30日,发布2.0.0版本
- 2019年3月22日,发布2.2.0版本。这是迄今(20190527)最新版本。
kafka源码是scala编写的,支持scala、python、java、php、c++等语言。
LinkedIn、Confluent、开源社区等持续贡献、开发、维护Kafka,使其成为大数据流水线的首选。
2、在Hadoop生态中的Kafka
Kafka属于Apache的一个开源流处理平台,是一种高性能的跨语言的分布式发布/订阅消息系统(这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因。也可以认为是消息中间件)。有如下特点(特性):
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作;
- 可扩展性:kafka集群支持热扩展;
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);
- 高并发:支持数千个客户端同时读写;
- 支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;
Kafka使用场景:
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如Hadoop、Hbase、Solr等;
- 消息系统:解耦和生产者和消费者、缓存消息等;
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘;
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;
- 流式处理:比如spark streaming和storm;
- 等等;
3、Kafka架构图
一个典型的Kafka集群中包含:
- 若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等)。Producer,是日志消息生产者,用来写数据。这里的【日志】不要误读了,不是日常编程中的log(如报错、警告、提示性错误等标记信息,追踪问题的标签/记录),在此它应该是message(kafka的基本数据单位)
- 若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高)。每一台机器叫一个Broker(Kafka Server)。
- 若干Consumer Group,以及一个Zookeeper集群。Consumer,是消息的消费者,用来读数据。
还有几个常见名词:
- Topic,不同消费者去指定的Topic中读,不同的生产者往不同的Topic中写。它是一个逻辑概念。
- Partition,在Topic基础上做了进一步区分分层(也就是说:一个Topic是由一个或多个Partition实现的)。Topic的物理实现(以文件夹的形式存在)。Partition内部还有segment。
Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance(这是负载均衡的思想,如出现个别节点不稳定,就体现了rebalance机制)。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息