1 Kafka的能力

作为一个流平台有三个关键的能力:

  • 发布和订阅数据流,类似于一个消息队列或完整的消息系统
  • 适用一种具有容错的持久性的方法来存储数据流
  • 全程处理数据流

2 Kafka的应用场景

  • 构建一个实时数据流水线在系统和应用之间获取数据
  • 构建一个实时流应用改变或返回数据流

3 主题和日志

一些概念:

  • Kafka 作为一个集群运行在一个或多个服务器上并且可以跨数据中心
  • Kafka在目录中存储数据流并且称此为topic
  • 每条记录包括一个key, value 和时间

先让我们来了解下Kafka提供的记录流,topic:

一个topic就是一个目录或者说是一个记录的属性名。在kafka中的Topic通常有多个订阅者。一个topic可以有0到多个消费者去订阅写入的数据。

对于每个主题,维护像这样维护一个分区的数据:

每个分区是一个有序不可变的记录队列,它可以持续的加入到提交的日志中。在分区中每条记录有个唯一的序列号offset作为每天记录的唯一标识。

Kafka会可靠地持久或所有发布的数据,无论他们是否被消费,可以配置一个保留时间。例如可以设置为2天,那么数据将保留至发布后的两天都可被消费,在此之后将会被释放。Kafka的性能对于数据大小恒定不变,因此长时间存储也不是问题。

事实上,每个消费者保留的基础数据的基础就是这个消费者在日志中的读取位置或偏移。这个偏移是消费者控制的:通常消费者是线性的读取偏移,但实际上消费者可以以任何顺序读取任何位置的数据。例如一个消费者可以重置为一个就的偏移位置来重新处理数据,接着再跳到最新的数据处理。

这些特点意味着Kafka消费者是非常简便,他们运行时对其它消费者的印象很小。例如你可以 tail 命令来查看topic的消息,并不需要改变存在的消费者。

分区在日志中有很多用处。首先,它们允许日志规划到单台服务器上。每个独立的分区又可以分布在不同的服务器上。但一个topic可以有多个分区来处理大量的数据。第二它可能更像一个并行单元。

4 分布式

日志分区可以分布在Kafka的服务器集群中,每个服务器(blocker)可以处理数据和对共享的分区的请求。每个分区可以在几台服务器中互相拷贝来保证容错性。每个分区有一个服务器作为leader,0到N台服务器作为跟随者,leader处理数据时,follower拷贝数据。如果一个leader挂了,那将会有一个follower成为leader。每个服务器可能是多个分区的leader,也可能是其它分区的follower,这样集群就能负载均衡了。

5 生产者

生产者选择性的发布数据。生产者有责任选择哪条记录发到哪个分区。生产者可以根据轮询或是根据特定的函数来发送,这样就会有更多的选择。

6 消费者

下图展现了一个Kafka集群有P0-P3四个分区,消费组A有C1、C2 两个消费者,消费组B有C3-C6四个消费者。

消费者都会给自己打上标签,这个标签就是组名称。 topic中的每条记录只会发到一个消费组中的一个消费者。

如果所有的消费者都在一个组中,那样记录就会负载均衡的发给每个消费者。

如果所有的消费者都不在同一组中,那么记录就会广播给各个消费者。