首页 > 代码库 > 1、Kafka学习分享-V1.0

1、Kafka学习分享-V1.0

Kafka学习分享

.1       什么是Kafka

Apache Kafka是一个开源的流处理平台,由 Apache Software Foundation使用Scala and Java编写发展而来。Kafka?用于构建实时数据管道和流媒体应用。 它具有水平可扩展性,容错性,快速性,并在数千家公司生产中运行。

它的主要功能:数据流的发布和订阅、数据流的处理、数据流的存储。像一个消息系统一样发布和订阅数据流,有效且实时地处理数据流,在一个分布式备份的集群中安全地处理存储数据流。

技术分享

 

 

.2       Kafka详细介绍

.2.1             流处理平台的三个关键功能

l  它允许发布和订阅可记录的流。在这个方面,它类似于一个消息队列或者一个企业消息系统。

l  它允许以一种容错的方式存储可记录的流。

l  它允许当可记录的流发生的时候来处理它们。

.2.2             Kafka的好处是什么?

它被用于两类广泛的应用程序:

l  构建能够可靠地在系统和应用程序之间获取数据的实时流数据管道。

l  构建对流数据转换和响应的实时流应用程序。

.2.3             Kafka是如何运行的?

为了理解Kafka是怎样做这些事情的,让我们自下而上深入探索Kafka的能力。

 

一些概念

l  Kafka作为一个集群在一个或多个服务器上运行;

l  Kafka集群存储可记录的流的类别,称为topics;

l  每条记录包含一个key,一个value和一个timestamp;

Kafka有四个核心的APIs

l  Producer API 允许一个应用程序将一条可记录的流发布到一个或多个Kafka topics.

l  Consumer API 允许一个应用程序订阅一个或多个Kafka topics,并且处理生成给它们的可记录流。

l  Streams API允许一个应用程序扮演一个流处理器,消费来自一个或多个topics的输入流并且生产输出流给一个或多个topics,有效地将输入流转换成输出流。

l  Connector API允许构建和运行可复用的,将Kafka topics和现有应用程序或数据系统连接起来的生产者或消费者。如,一个相关数据的连机器可能捕获一张表的每一个变化。

 技术分享

 

在Kafka中,客户端和服务端之间的通信是由一个简单的、高性能的、跨语言的TCP协议完成的。这种协议是版本控制的,并且与旧版本保持后向兼容。我们提供了一个Java客户端给Kafka,但是客户端支持多种语言。

Topics and Logs

一个Topic 就是记录被发布的一个类别或者提要名称。Kafka 的topics总是多订阅用户的,换句话说,一个topic可以有0个、一个、或多个订阅了它的数据的消费者。

对于每一个topic,Kafka集群保持一个分区的log,如下图:

技术分享

 

 

每一个分区都是一个有序的,不变的可记录的序列,这些序列不断地添加到一个结构化的提交日志中。分区的记录各自都被分配一个连续的ID号,被称为偏移量,偏移量在分区中唯一标识每条记录。

Kafka集群保留所有发布的记录无论他们是否被消费,使用一个可配置的保留期。例如:如果保留策略设置为两天,然后在一个记录被发布后的两天之内,它可以用于消费,之后它将被丢弃以释放空间。Kafka可以存储很长时间的数据且性能不受数据量大小的影响。

 技术分享

 

事实上,在每一个消费者基础上保留的唯一的元数据是日志中消费者的偏移量或者位置。这个偏移量是由消费者控制的:通常,消费者会线性地提高它的偏移量来读取记录,但是,事实上,由于位置是由消费者控制的,消费者可以按照它想要的任何顺序来消费记录。例如,一个消费者可以重新设置为旧的偏移量,以重新处理过去的数据,或者跳到最近的记录,并从“now”开始消费。

这种组合的特性意味着Kafka消费者是非常便宜的,他们的来去不会对集群或者其他的消费者产生一些影响。例如:你能够使用我们的命令行工具来“tail”任何topic的内容,而不需要改变任何被现有消费者消费的内容。

日志中的分区有几个目的。首先,他们允许日志扩展到超出一个适合单个服务器的大小。每个独立的分区必须适合承载它的服务器,但是一个topic应该有许多的分区,,因此它能够处理任意数量的数据。其次,他们作为一个并行的单元,在这方面做的更多。

分布式

日志的分区分布在Kafka集群中不同的服务器上,每个服务器处理数据并请求共享分区。每个分区在一个可配置数量的服务器上进行复用,用于容错。

每个分区有一个作为“leader”的服务器和0个或多个作为“followers”的服务器。主服务器处理该分区的所有读写请求,而从服务器被动地复制主服务器。如果主服务器出现故障,那么其他从服务器中的一个将自动成为新的主服务器。每个服务器充当某些分区的领导者,并为其他一些分区提供一个追随者,因此在集群中负载均衡。

生产者

生产者发布它们选择的数据给每个topics。生产者负责在topic中选择哪条记录分配到哪个分区上。这可以以循环的方式简单实现负载均衡或者它可以根据一些语义分区函数(据说是根据记录上的一些关键字)来完成。

消费者

消费者给自己贴上一个消费者团体的标签,每个被发布到一个topic的记录都被交付到每个订阅消费者团体中的一个消费者实例。消费者实例可以在单独的进程中,也可以在单独的机器上。

如果所有的消费者实例有相同的消费者团体,然后这些记录将在这些消费者实例中有效地实现负载均衡。

如果所有的消费者实例有不同的消费者团体,然后每个记录将被广播到所有的消费者进程中。

 技术分享

 

一个两个服务器的Kafka集群承载4个分区(P0-P3),其中有两个消费者团体。消费者团体A有两个消费者实例,并且消费者团体B有四个消费者实例。

然而,更常见的是,我们发现有少量消费者群体的topics,每个消费者都是“logical subscriber”。每个团体有许多用于可伸缩性和容错的消费者实例组成。这只不过是,订阅-发布语法,订阅用户是一组消费者而不是单个的进程。

在Kafka中实现消费的方式是将日志中的分区划分成多个消费者实例,因此,每个实例都是在任何时间点上“公平分享”分区的唯一的消费者。

团体中维护资格的进程由Kafka协议自由控制的。如果一个新的实例加入这个团体,他们将从其他团体成员中接管一些分区;如果一个实例死了,它的分区将被分配给其他剩余的实例。

Kafka只在一个分区内提供记录的一个完整顺序,而不是在一个topic内的不同分区之间。对于大多数应用程序来说,每个分区排序和按主键分区数据的能力都是足够的。但是,如果你需要所有的记录的一个完整的顺序,这可以通过一个只有一个分区的topic实现,尽管这个将意味着每个消费者团体只有一个消费进程。

保障

一个高级别的Kafka将提供一下保障:

l  消息从一个生产者发送给一个特定的主题分区时将会附加上他们被发送的顺序。也就是说,如果一条记录M1和M2是有同一个生产者发送出去的,并且M1是先发送出去的,则M1的偏移量将会比M2的低,并且出现在log里更早。

l  一个消费者实例将按他们在log中存储的顺序来理解这些记录。

l  对于一个具有备份元素N的topic,我们将容忍N-1服务器故障,而不会丢失任何记录到日志中的记录。

More details on these guarantees are given in the design section of the documentation.

.2.4             Kafka作为一个消息系统

Kafka消息系统与传统企业消息系统的对比。

传统消息有两种模型:队列和发布-订阅( queuing and publish-subscribe.)。

在对列中,一池的消费者将从一个服务上选读,并且每条记录都会被其中的一个消费者读到;在发布-订阅中,记录将被广播到所有的消费者。这两种模型都有其优势和劣势。序列的优势是它允许将数据处理进程分配给多个消费者实例,这样可以让你扩展你的进程。不幸的是,序列不是多用户的,一旦一个进程读取数据,数据就会消失。发布-订阅,允许你广播数据到多个进程,但是由于每条消失数据去了每个订阅者,因此没有办法扩展进程。

Kafka中消费者团体的概念概括了这两个概念。与队列一样,消费者组允许您通过一系列进程(消费者组的成员)来划分处理。与发布订阅一样,Kafka允许您将消息广播到多个消费者组。

Kafka模型的优点是,每个主题都具有这两个属性 - 它可以扩展处理,也是多用户 - 不需要选择一个或另一个。

Kafka也比传统的消息系统有更强的顺序保证。

传统队列在服务器上保存顺序的记录,如果多个消费者从队列中消费,则服务器按照存储顺序输出记录。然而,虽然服务器按顺序输出记录,但是记录被异步传递给消费者,所以它们可能会在不同的消费者处按顺序到达。这意味着在并行消耗的情况下,记录的排序丢失。消息传递系统通常通过使“唯一消费者”的概念只能让一个进程从队列中消费,但这当然意味着处理中没有并行性。

 

卡夫卡做得更好 通过在主题中有一个并行概念(分区),Kafka能够在消费者流程池中提供排序保证和负载平衡。这通过将主题中的分区分配给消费者组中的消费者来实现,使得每个分区被组中的一个消费者消耗。通过这样做,我们确保消费者是该分区的唯一读者,并按顺序消耗数据。由于有许多分区,这仍然平衡了许多消费者实例的负载。但请注意,消费者组中的消费者实例不能超过分区。

 

.2.5             卡夫卡作为存储系统

 

允许发布消息消除消息的消息队列有效地充当飞行中消息的存储系统。卡夫卡的不同之处在于它是一个很好的存储系统。

 

写入Kafka的数据写入磁盘并进行复制以进行容错。Kafka允许生产者等待确认,以便在完全复制之前写入不被认为是完整的,并且即使写入服务器失败,也保证持久写入。

 

Kafka的磁盘结构使用缩放,Kafka将执行相同的操作,无论您在服务器上是否有50 KB或50 TB的持久数据。

 

作为严重存储并允许客户端控制其读取位置的结果,您可以将Kafka视为专用于高性能,低延迟的提交日志存储,复制和传播的专用分布式文件系统。

 

.2.6             Kafka流处理

 

仅读取,写入和存储数据流是不够的,目的是实现流的实时处理。

 

在卡夫卡,流处理器是从输入主题接收数据流的任何东西,对此输入执行一些处理,并生成持续的数据流以输出主题。

 

例如,零售应用程序可能会收到销售和出货的输入流,并输出根据该数据计算的重新排序和价格调整。

 

可以直接使用生产者和消费者API进行简单处理。然而对于更复杂的转换,Kafka提供了一个完全集成的Streams API。这允许构建应用程序进行非平凡处理,以计算流中的聚合或将流连接在一起。

 

该设施有助于解决这种类型的应用程序面临的困难问题:处理无序数据,重新处理输入作为代码更改,执行有状态计算等。

 

流API基于Kafka提供的核心原语构建:它使用生产者和消费者API进行输入,使用Kafka进行有状态存储,并在流处理器实例之间使用相同的组机制来实现容错。

 

.2.7             放在一起

 

消息,存储和流处理的这种组合似乎是不寻常的,但是卡夫卡作为流媒体平台的角色至关重要。

 

像HDFS这样的分布式文件系统允许存储用于批处理的静态文件。有效像这样的系统允许存储和处理历史从过去的数据。

 

传统的企业邮件系统允许处理将在您订阅之后到达的未来邮件。以这种方式构建的应用程序在未来数据到达时处理。

 

Kafka结合了这两种功能,组合对于Kafka作为流应用程序和流数据管道平台来说至关重要。通过组合存储和低延迟订阅,流式应用程序可以以相同的方式处理过去和未来的数据。这是一个单一的应用程序可以处理历史记录数据,而不是在到达最后一个记录时结束,它可以随着将来的数据到达而继续处理。这是一个广泛的流处理概念,其中包含批处理以及消息驱动应用程序。

 

同样,对于流数据流水线,订阅到实时事件的组合使得可以使用Kafka进行非常低延迟的管道; 但是可靠性地存储数据的能力使得可以将其用于必须保证数据传送的关键数据,或者与仅负载数据的离线系统集成,或者可能会长时间停机以进行维护。流处理设备可以在数据到达时转换数据。有关Kafka提供的保证,apis和功能的更多信息,请参阅其余的文档。”

 

PS:本文完全参考“https://kafka.apache.org/”,即kafka官方主页。

1、Kafka学习分享-V1.0