Kafka基础知识及核心概念入门
一.简介
流平台具有三个关键功能:
- 发布和订阅记录流,类似于消息队列或企业消息传递系统。
- 以容错的持久方式存储记录流。
- 处理记录流。
Kafka通常用于两大类应用程序:
- 建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
- 构建实时流应用程序以转换或响应数据流。
首先几个概念:
- Kafka在一个或多个跨越多个数据中心的服务器上作为集群运行。
- Kafka集群将记录流存储在称为topic的类别中。
- 每个记录由一个键,一个值和一个时间戳组成。
Kafka具有五个核心API:
- 生产者API允许应用程序发布的记录流至一个或多个Kafka的topic。
- 消费者API允许应用程序订阅一个或多个topic,并处理所产生的对他们记录的数据流。
- 流API允许应用程序充当流处理器,从一个或多个topic消费输入流,并产生一个输出流至一个或多个输出topic,高效转化输入流为输出流。
- 连接器API允许构建和运行可重复使用的生产者或消费者连接,用以现有的应用程序或数据系统。例如,关系数据库的连接器可能会捕获对表的所有更改。
- 管理API允许管理和检查topic,broker和其他kafka对象。
如图:
在Kafka中,客户端和服务器之间的通信是通过简单,高性能,与语言无关的TCP协议完成的。该协议已版本化,并与旧版本保持向后兼容性。我们为Kafka提供了Java客户端,但是客户端支持多种语言。
二.主题和日志
首先,让我们深入探讨Kafka提供的记录主题的核心抽象。
主题是将记录发布到的类别或订阅源名称。Kafka中的主题始终是多用户的;也就是说,一个主题可以有零个,一个或多个消费者来订阅和消费该主题的数据。
对于每个主题,Kafka集群都会维护一个分区日志,如下所示:
每个分区都是有序的,不变的记录序列,这些记录连续地附加到结构化的提交日志中。每个分区中的记录都分配有一个称为偏移的顺序ID号,该ID 唯一地标识分区中的每个记录。
Kafka群集使用可配置的保留期限持久地保留所有已发布的记录(无论是否已使用它们)。例如,如果将保留策略设置为两天,则在发布记录后的两天内,该记录可供使用,之后将被丢弃以释放空间。Kafka的性能相对于数据大小实际上是恒定的,因此长时间存储数据不是问题。
实际上,基于每个消费者保留的唯一元数据是该消费者在日志中的偏移量或位置。此偏移量由使用者控制:通常,使用者在读取记录时会线性地推进其偏移量,但是实际上,由于位置是由使用者控制的,因此它可以按喜欢的任何顺序使用记录。例如,使用者可以重置到较旧的偏移量以重新处理过去的数据,或者跳到最近的记录并从“现在”开始使用。
这些功能的组合意味着Kafka的消费者非常独立-他们的消费行为对集群或其他消费者没有太大影响。例如,您可以使用我们的命令行工具来“尾部”任何主题的内容,而无需更改任何现有使用者所消耗的内容。
日志中的分区有多种用途。首先,它们允许日志扩展到超出单个服务器所能容纳的大小。每个单独的分区都必须托管在适合它的服务器上,但是一个主题可能有很多分区,因此它可以处理任意数量的数据。其次,它们充当并行性的单元。
三.分配
日志的分区分布在Kafka群集中的服务器上,每个服务器处理数据并要求共享分区。每个分区都在可配置数量的服务器之间复制,以实现容错功能。
每个分区都有一个充当“领导者”的服务器和零个或多个充当“跟随者”的服务器。领导者处理对分区的所有读写请求,而跟随者则被动地复制领导者。如果领导者失败,则跟随者之一将自动成为新领导者。每个服务器充当其某些分区的领导者,而充当其他分区的跟随者,因此群集中的负载得到了很好的平衡。
四.地理复制
Kafka MirrorMaker为您的集群提供地理复制支持。使用MirrorMaker,可以在多个数据中心或云区域之间复制消息。您可以在主动/被动方案中使用它进行备份和恢复。或在主动/被动方案中将数据放置在离您的用户更近的位置,或支持数据位置要求。
五.生产者
生产者将数据发布到他们选择的主题。生产者负责选择将哪个记录分配给主题中的哪个分区。可以以循环方式完成此操作,仅是为了平衡负载,也可以根据某些语义分区功能(例如基于记录中的某些键)进行此操作。
六.消费者
消费者使用消费者组名称标记自己,并且发布到主题的每条记录都会传递到每个订阅消费者组中的一个消费者实例。使用者实例可以在单独的进程中或在单独的机器上。
如果所有使用者实例都具有相同的使用者组,那么将在这些使用者实例上有效地平衡记录。如果所有使用者实例具有不同的使用者组,则每条记录将广播到所有使用者进程。
每个组均由许多使用者实例组成,以实现可伸缩性和容错能力。这无非就是发布-订阅语义,其中订阅者是消费者的集群而不是单个进程。
在Kafka中实现消耗的方式是通过在消费者实例上划分日志中的分区,以便每个实例在任何时间点都是分区“公平份额”的排他消费者。Kafka协议动态处理了维护组成员身份的过程。如果新实例加入该组,它们将接管该组其他成员的某些分区;如果实例死亡,则其分区将分配给其余实例。