kafka介绍

介绍

Kafka是一个分布式流平台。这究竟代表什么。
我们认为的流平台有这三个关键的功能:

  1. 它使得你可以发布和订阅记录流。这方面类似一个消息队列或者企业消息系统。
  2. 它使得你可以在灾难发生时存储留记录。
  3. 它使得你可以处理发生的记录流。

Kafka适合干什么?

它被用于两大类应用程序:

  1. 构建实时流数据管道,从系统或应用程序可靠的获得数据。
  2. 构建实时流数据应用程序,传输或者响应流数据。

为了理解Kafka如何做这些事,让我们从上到下深入探索Kafka的功能。

首先有一些概念:

  • Kafka是运行在一台或多台服务器的集群上的。
  • Kafka集群存储把记录流存储在称为topics的目录中。
  • 每个记录包含一个键,值和一个时间戳。

Kafka有4个核心API:

  • Producer API 允许一个应用程序发布一条流记录到一个或多个Kafka topics中。
  • Consumer API 允许一个应用程序订阅一个或多个topics并且处理他们产生的流记录。
  • Streams API允许一个应用程序作为流处理器,消耗一条来自一个或多个topics中的输入流并且产生一条输出流给一个或多个输出流送到一个或多个topics中,有效的传输输入流到输出流。
  • Connector API允许构建和运行可重用的producers或consumers,把Kafka topics连接到已存在的应用程序和数据系统。例如,一个关系数据库的connector可能捕获所有的修改。

在Kafka中,客户机和服务器之间的通信是通过简单的、高效的、语言无关的 TCP protocol来完成的。这个版本维护了旧版本之间的兼容性。我们提供了一个Kafka Java客户端,也可以使用其他的语言

Topics 和 Logs

让我们首先深入Kafka的核心抽象——topic(提供流记录)。
一个topic是一个发布的记录目录或者名称。Kafka的Topics通常有多个订阅者:一个topic可以有零个一个或多个消费者订阅写入的数据。

对于每个topic,Kafka集群维护一个分区日志看起来如下所示:

每个分区都是有序不变的记录序列,可以持续添加结构化的提交日志。分区中的每条记录都有一个序列化的ID称为offset,唯一标识一条记录。

Kafka集群保存所有的发布记录,不管他们有没有被消费,使用配置的保存时间。例如,如果保存的策略设置为两天,对于两天内发布的记录,都是可以被消费的,超过了将会被丢弃释放空间。Kafka的性能是关于数据大小的有效常数,所以存储很长时间的数据不是问题。


实际上,每个消费者存储的元数据只有offset(偏移)或者说消费者在日志中的位置。偏移可以被消费者控制:通常消费者读一条记录前进一位,但是实际上,由于消费者可以控制位置,它可以读取它想要的任意位置的记录。例如一个消费者可以重置到以前的围着重新处理过去的数据或者跳到最近的记录开始消费。

这种组合特性意味着Kafka的消费者很廉价——他们可以随意改变不会映像集群或者其他的消费者。例如你可以使用命令行工具检索任意topic的底部内容而不影响其他的消费者的消费。

日志分区有多个目的。首先,他们允许日志超过单个服务器的大小,每个独立的分区必须不超过他们所在的服务器。但是一个topic可以有多个分区,所以它可以处理热议大小的数据量。其次,他们充当并行单元——关于这点还有很多。

分布式

日志分区分布在Kafka集群的服务器上,每个服务器操作数据和请求分区,每个分区复制在可配置的一些服务器上为了容灾。

每个分区都有一个服务器充当领导者,0个或多个服务器作为跟随着。领导者处理这块分区的所有读写请求。跟随着被动复制。如果领导者挂了,跟随着之一自动称为新的领导者。每个服务器作为一些分区的领导者,其他跟随着负载均衡。

生产者

生产者发布数据到topics中。生产者负责选择哪条记录分配给哪个分区的topic。可以使用简单的循环方式减轻负载,或者根据语义分配行数(record中的某些词)。更多的分区用法稍后。

消费者

消费者使用消费者组名标注,每条发布到topic的记录被发送到一个消费者实例在每个订阅组中。消费者实例可以再不同的进程或者不同的服务器中。

如果所有的消费者实例都有着相同的组,那么这些实例中的记录可以有效的负载均衡。
如果所有的消费者都在不同的组,那么每条记录都会发送到所有的消费者进程中。

一个两台服务器的Kafka集群有4个分区(P0-P3),有两个消费者组。组A有两个消费者实例,组B有4个。

更常见的,然而,我们发现主题有一个少量的组,每个都是逻辑订阅者。为了扩展性和容灾每组由多个消费者组成。这种模式的订阅者是一个消费者集群而不是一个单独的进程。

posted @ 2017-02-21 13:26  ximengchj  阅读(233)  评论(0编辑  收藏  举报