临渊羡鱼,不如退而结网,比喻空怀壮志,不如实实在在地付诸于行动。
一、基础
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。它是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据,这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。
Kafka最初由Linkedin公司开发,是一个分布式、支持分区的、多副本的、基于zookeeper协调的分布式消息系统。它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎、web/nginx日志、访问日志、消息服务等等。
特性:
- 高吞吐量:每秒可以处理几十万条消息
- 可扩展性:支持热扩展集群
- 高并发:支持数千个客户端同时读写
- 低延迟:最低只有几毫秒
- 持久性:消息被持久化到本地磁盘,防止数据丢失
- 容错性:允许集群中节点失败
应用场景
- 日志收集:可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:记录运营监控数据,包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
一些概念
- 消费者组:各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组。
- 消息状态:在Kafka中消息的状态被保存在consumer中,broker不会关心哪个消息被消费了被谁消费了,只记录一个offset值(指向partition中下一个要被消费的消息位置),这就意味着如果consumer处理不好的话,broker上的一个消息可能会被消费多次。
- 消息持久化:消息持久化到本地文件系统中,并且保持极高的效率。
- 消息有效期:Kafka会长久保留其中的消息,以便consumer可以多次消费,当然其中很多细节是可配置的。
- 批量发送:支持以消息集合为单位进行批量发送,以提高push效率。
- push-and-pull:Kafka中的producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生产和消费是异步的。
- 集群中broker之间的关系:不是主从关系,各个broker在集群中地位一样,可以随意的增加或删除任何一个broker节点。
- 负载均衡:0.8.x提供了一个metadata API来管理broker之间的负载(0.7.x主要靠zookeeper来实现负载均衡)。
- 同步异步:producer采用异步push方式,极大提高Kafka系统的吞吐率(可通过参数控同步/异步方式)。
- 分区机制:Kafka的broker端支持消息分区,producer可以决定把消息发到哪个分区,在一个分区中消息的顺序就是Producer发送消息的顺序,一个主题中可以有多个分区,具体分区的数量是可配置的。
- 离线数据装载:Kafka由于对可拓展的数据持久化的支持,非常适合向Hadoop或者数据仓库中进行数据装载。
- 插件支持:如Storm、Hadoop、flume。
实现原理
- producer:即生产者,消息的产生者,是消息的入口。
- broker:Kafka的实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器,每个kafka集群内的broker都有一个不重复的编号。
- topic:消息的主题,可理解为消息的分类,Kafka的数据就保存在topic,每个broker上都可以创建多个topic。
- partition:topic的分区,每个topic可以有多个分区,分区的作用是做负载从而提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹。
- replication:每一个分区都有多个副本,
- 当主分区(Leader)故障的时候会选择一个副本(Follower)上位成为新的Leader
- 默认副本的最大数量是10个,且副本的数量不能大于broker的数量
- follower和leader绝对是在不同的机器
- 同一机器对同一个分区也只可能存放一个副本(包括自己)
- message:每一条发送的消息主体。
- consumer:消费者,即消息的消费方,是消息的出口。
- consumer group:将多个消费组组成一个消费者组,同一个分区的数据只能被消费者组中的某一个消费者消费,同一个消费者组的消费者可以消费同一个topic的不同分区的数据。
- Zookeeper:Kafka集群依赖Zookeeper来保存集群的的元信息,来保证系统的可用性。
二、实战
- 安装Kafka
- 安装扩展
- 使用