一.什么是kafka
kafka的目标是实现一个为处理实时数据提供一个统1、高吞吐、低延迟的平台。是分布式发布-订阅消息系统,是一个分布式的,可划分的,冗余备份的持久性的日志服务。
Kafka使用场景:
1 日志收集:一个公司能够用Kafka能够收集各类服务的log,经过kafka以统一接口服务的方式开放给各类consumer,例如hadoop、Hbase、Solr等。
2 消息系统:解耦和生产者和消费者、缓存消息等。
3 用户活动跟踪:Kafka常常被用来记录web用户或者app用户的各类活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,而后订阅者经过订阅这些topic来作实时的监控分析,或者装载到hadoop、数据仓库中作离线分析和挖掘。
4 运营指标:Kafka也常常用来记录运营监控数据。包括收集各类分布式应用的数据,生产各类操做的集中反馈,好比报警和报告。
5 流式处理:好比spark streaming和storm
Kafka拓扑与流程:web
二.Kafka组件
1.主题(topic)
Kafka将一组消息概括为一个主题(topic),一个主题就是对消息的一个分类。生产者将消息发送到特定的主题,消费者订阅主题或主题的某些分区进行消费。缓存
2.消息
Kafka通讯基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。服务器
3.分区与副本
Kafka能够将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪一个分区中,只要若是分区规则设置的合理,那么全部的消息将会被均匀的分布到不一样的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者能够从一个或者多个分区中同时消费数据,以支撑海量数据处理能力
Kafka的设计也是源自生活,比如是为公路运输,不一样的起始点和目的地须要修不一样高速公路(主题),高速公路上能够提供多条车道(分区),流量大的公路多修几条车道保证畅通,流量小的公路少修几条车道避免浪费。收费站比如消费者,车多的时候多开几个一块儿收费避免堵在路上,车少的时候开几个让汽车并道就行了
分区数能够大于节点数,可是副本数不能大于节点数量。建立主题是分区数量最好为代理数量的整数倍。
每分区有一个或多个副本(replica),从存储角度上分析,每一个副本在逻辑上抽象为一个日志(log)对象,即分区的副本与日志对象是一一对应的,Kafka会给每一个分区找一个节点当带头大哥(Leader),以及若干个节点当随从(Follower)。消息写入分区时,带头大哥除了本身复制一份外还会复制到多个随从。若是随从挂了,Kafka会再找一个随从从带头大哥那里同步历史消息。
Kafka保证一个分区内消息是有序的,不能保证跨分区消息有序性,每条消息被追加到相应的分区,是顺序写磁盘,所以效率很高。
segment对应一个文件(实现上对应2个文件,一个数据文件,一个索引文件),一个partition对应一个文件夹,一个partition里理论上能够包含任意多个segment。app
4.偏移量(offset)
kafka做为一个消息队列,每次读取消息时,须要指定从哪里读取,不然就会从默认位置读取。
那么为何不将位置偏移量储存在kafka中呢?缘由是,若是在位置偏移量记录在kafka, 当kafka组件故障重启时,就没法获取位置偏移量。zookeeper做为经常使用组件管理工具,成为记录kafka位置偏移量推荐负载均衡
从上图能够看出,每条消息存在磁盘的偏移量是其距离文件开头的绝对偏移量。好比上面第一条消息的偏移量是0;第二条消息的偏移量是第一条消息的总长度;第三条消息是其前两条消息总长度;以此类推。这种方式存储消息的偏移量很好理解,处理起来也很方便。
须要注意,消息存储到磁盘的偏移量是由 Broker 处理完成的,缘由很简单,由于只有 Broker 端才知道如今 Log 的最新偏移量; Producer 端是没法获取的异步
5.代理(broker)
Kafka节点,一个Kafka节点就是一个broker,多个broker能够组成一个Kafka集群。
1 Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
2 Broker不保存订阅者的状态,由订阅者本身保存。
3 无状态致使消息的删除成为难题(可能删除的消息正在被订阅),Kafka采用基于时间的SLA(服务保证),消息保存必定时间(一般7天)后会删除。
4消费订阅者能够rewind back(回卷)到任意位置从新进行消费,当订阅者故障时,能够选择最小的offset(id)进行从新读取消费消息分布式
6.生产者(producer)
生产者负责将消息发送给代理,也就是向kafka代理发送消息的客户端。工具
7.消费者(comsumer)和消费组
假设咱们有一个应用程序须要从-个 Kafka主题读取消息并验证这些消息,而后再把它们 保存起来。应用程序须要建立一个消费者对象,订阅主题并开始接收消息,而后验证消息 井保存结果。过了 一阵子,生产者往主题写入消息的速度超过了应用程序验证数据的速度,这个时候该怎么办?若是只使用单个消费者处理消息,应用程序会远跟不上消息生成的速度。显然,此时颇有必要对消费者进行横向伸缩。就像多个生产者能够向相同的 主题 写入消息同样,咱们也可使用多个消费者从同一个主题读取消息,对消息进行分流。
Kafka 消费者从属于消费者群组。一个群组里的消费者订阅的是同一个主题,每一个消费者 接收主题一部分分区的消息。oop
8.ISR
kafka同步机制
同步复制:只有全部的follower把数据拿过去后才commit,一致性好,可用性不高。
异步复制:只要leader拿到数据当即commit,等follower慢慢去复制,可用性高,当即返回,一致性差一些。
不是彻底同步:是一种ISR机制:
1. leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每一个Partition都会有一个ISR,并且是由leader动态维护
2. 若是一个flower比一个leader落后太多,或者超过必定时间未发起数据复制请求,则leader将其重ISR中移除
3. 当ISR中全部Replica都向Leader发送ACK时,leader才commit
把滞后的follower移除ISR主要是避免写消息延迟。设置ISR主要是为了broker宕掉以后,从新选举partition的leader从ISR列表中选择。spa