1.1 概念和基本架构

1.1.1 Kafka介绍

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,

主要应用场景:日志收集消息系统
**
设计目标:

  • 持久化能力:以时间复杂度O(1)的方式提供消息持久化能力,即使对TB级别以上的数据也能保证常数时间的访问性能
  • 高吞吐率:在非常廉价的商用机器上也能做到单机支持每秒10W条消息的传输
  • 支持Kafka Server间的消息分区,分布式消费,同时保证每个partition内的消息顺序传输
  • 同时支持离线数据处理和实时数据处理
  • 支持在线水平扩展

image.pngKafka是一种 发布-订阅模式
对于消息中间件,消息分推拉两种模式,Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。

  1. Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行
  2. Kafka集群中按照主题分类管理,一个主题可以有多个分区,一个分区可以有多个副本分区
  3. 每个记录由一个键,一个值和一个时间戳组成

Kafka的四个核心API:

  1. Producer API:允许应用程序将记录流发布到一个或多个Kafka主题
  2. Consumer API:允许应用程序订阅一个或多个主题并处理为其生成的记录流。
  3. Streams API:允许应用程序充当流处理器,使用一个或多个主题的输入流,并生成一个或多个输出主题的输出流,从而有效的将输入流转换为输出流
  4. Connector API:允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用生产者和使用者。例如,关系型数据库的连接器可能会捕获对表的所有更改。

    1.1.2 Kafka优势

  5. 高吞吐量:单机每秒处理几十上百万的消息量,即使存储了许多TB的消息,也能保持稳定的性能.

  6. 高性能:单节点支持上千个客户端,并保证零停机和零数据丢失
  7. 持久化数据存储:将消息持久化到磁盘,通过将数据持久化到硬盘一集replication防止数据丢失
    1. 零拷贝
    2. 顺序读,顺序写
    3. 利用Linux的页缓存
  8. 分布式系统,易于向外扩展,所有的Producer、Broker和Consumer都会有多个,均为分布式的,无需停机即可扩展机器,多个Producer、Consumer可能是不同的应用
  9. 可靠性:Kafka是分布式、分区、复制和容错的。
  10. 客户端状态维护:消息被处理的状态是在Consumer端维护,而不是由server端维护,当失败时能自动平衡(主题与消费者的数量)
  11. 支持online和offline的场景
  12. 支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。

    1.1.3 Kafka应用场景

    日志收集**一个公司可以用Kafka收集各种服务的Log,通过Kafka以统一接口服务的方式开放给各种Consumer
    消息系统**:解耦生产者和消费者、缓存消息等
    用户活动跟踪**Kafka经常被用来记录WEB用户或APP用户的各种活动,如浏览网页、搜索、点击等,这些活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做实时的监控分析,可保存到数据库
    运营指标**:Kafka也经常用来记录运营监控数据,包括收集各种分布式应用的数据,生产各种操作的集中反馈,eg:报警和警告
    流式处理**:**Spark Streaming和Storm

1.1.4 基本架构

消息和批次

  • Kafka的数据单元称为消息,可以把消息看成是数据库里的一个”数据行”或一条”记录”。消息由字节数组构成。
  • 消息有键,键也是一个字节数组,当消息以一种可控的方式写入不同的分区时,会用到键。
  • 为了提高效率,消息会被分批写入Kafka,批次就是一组消息(采用轮询或对Hash取模的方式分批),这些消息属于同一个主题和分区
  • 把消息分成批次可以减少网络开销,批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升数据的传输和存储能力,但是需要更多的计算处理。

模式(通过什么模式进行序列化和反序列化)
消息模式有很多种可用的选项,如JSON或XML,他们缺乏强类型处理能力,Apache Avro:提供了一种紧凑的序列化格式,模式和消息体分开,当模式发生变化时,不需要重新生成代码,支持强类型和模式进化,版本向前后都兼容。数据格式的一致性对Kafka很重要,它消除了消息读写和操作之间的耦合性

主题和分区
Kafka的消息通过主题进行分类,主题就像是数据库的表或者文件系统里的文件夹,主题可以被分为若干分区,一个主题通过分区分布于Kafka集群中,提供了横向扩展能力
image.png

生产者和消费者**
生产者创建消息,消费者消费消息。一个消息被发布在一个特定的主题上。
生产者在默认情况下把消息均衡的分布到主题的所有分区上:

  1. 1. 根据指定消息的分区
  2. 1. 根据消息的key散列取模得出分区
  3. 1. 轮询指定分区

消费者通过偏移量来区分已经读过的消息,从而消费消息。
消费者是消费组的一部分,消费组保证每个分区只能被一个消费者使用,避免重复消费

image.png
broker和集群
一个独立的Kafka服务器称为broker,broker接受来自生产者的消息, 为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘的消息。单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
image.png
每一个集群都有一个broker是集群控制器(自动从集群的活跃成员中选举出来)
控制器负责管理工作:

  1. - 将分区分配给broker
  2. - 监控broker

集群中一个分区属于一个broker,该broker称为分区首领。
一个分区可以分配给多个broker,此时会发生分区复制。
分区的复制提供了消息冗余、高可用,副本分区不负责处理消息的读写。










**