一、简介

Kafka是一个消息系统,原本用作Linkedln的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。

  • 活动流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性地对这些文件进行统计分析。
  • 运营数据指的是服务器的性能数据(CPU、IO 使用率、请求时间、服务日志等等数据)。

Kafka 是一个分布式的流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。其功能体现:

  • 消息系统。kafka与传统的消息中间件都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,kafka还提供了大多数消息系统难以实现的消息顺序性保障及回溯性消费的功能。
  • 存储系统。kafka把消息持久化到磁盘,相比于其他基于内存存储的系统而言,有效的降低了消息丢失的风险。这得益于其消息持久化和多副本机制。也可以将kafka作为长期的存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题日志压缩功能。
  • 流式处理平台。kafka为流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理框架,比如窗口、连接、变换和聚合等各类操作。

Kafka的设计目标如下:

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

Kafka的特征

  • 高吞吐量、低延迟
  • 可扩展性
  • 持久性、可靠性
  • 容错性
  • 高并发

应用场景

  • 日志收集。可以通过Kafka收集各种服务的log,通过kafka开放给各种消费者,比如hadoop、Hbase等
  • 消息系统。
  • 用户活动跟踪。用来记录web或app用户各种活动,如浏览网页、搜索、点击等活动。提供给订阅者来做监控分析或做数据分析和挖掘
  • 运营指标。
  • 流式处理。spark stream
  • 事件源。

重要设计思想

  • 消费者分组
  • 消息状态。kafka中,消息的状态被保留在consumer中,broker不会关心哪个消息被消费了被谁消费了,只记录一个offset值(指向partition中下一个要被消费的消息位置)
  • 消息持久化
  • 消息有效期
  • 批量推送。支持以消息集合为单位进行批量推送,提高推送效率
  • 发布、订阅模型
  • 负载均衡
  • 同步或异步推送
  • 分区机制
  • 离线数据装载
  • 插件支持

二、基础概念

1、生产者和消费者

客户端有两种基本类型:生产者(Producer)和消费者(Consumer)。

除此之外,还有用来做数据集成的Kafka Connect API和流式处理的Kafka Stream等高阶客户端,但高阶客户端底层仍然是生产者和消费者API。

生产者创建消息,而消费者负责消费消息。

3、Broker和Cluster

Broker可以看作一个独立的Kakfa服务节点或Kafka服务实例。如果一台机器上只部署了一个Kafka实例,那么可以将Broker看作一台Kafka服务器。

它接收生产者推送的消息并存入磁盘。同时,处理消费者拉取分区消息的请求,返回给消费者已经提交的消息。

若干个Broker组成一个集群,其中集群中的某个Broker会成为集群控制器(Cluster Controller),负责管理集群,包括分配分区到Broker、监控Broker故障等。

  • 在集群内部,每一个分区都会有一个Broker来负责,这个Broker也就是这个分区的Leader
  • 生产者和消费者只与Leader交互
  • 一个分区可以被复制到多个Broker上来实现冗余, 这些副本Broker称为follower,follower会实时从Leader中获取数据,保持和Leader数据的同步。这样当发生Broker故障时可以将分区重新分配到其他Broker来负责(选举出新的Leader)
  • leader和follower绝对是在不同的机器

2、主题(Topic)

在Kafka中,消息以主题来进行分类,每一个主题对应一个“消息队列”。

每个broker上都可以创建多个topic。

3、分区(Partition)

如果将所有的同类消息都放到一个队列中,会缺少可伸缩性,随着生产者消费者的增加,都可能会耗尽系统性能和存储空间。

为了实现扩展性,一个topic可以分为多个partition,不同的partition可以分配到不同的Broker上,同一个topic在不同的分区内的数据是不重复的。

每个partition是一个有序的队列。

4、消费者组(Consumer Group)

我们可以将多个消费者组成一个消费者组,消费者组内的每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者之间互不影响。这也是为了提高kafka的吞吐量!

相关链接

OB tags

#Kafka