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协议动态处理了维护组成员身份的过程。如果新实例加入该组,它们将接管该组其他成员的某些分区;如果实例死亡,则其分区将分配给其余实例。

七.保证

在较高级别上,Kafka提供一下保证:

  • 生产者发送到特定主题分区的消息将按其发送顺序写入。也就是说,如果记录M1是由与记录M2相同的生产者发送的,并且首先发送M1,则M1的偏移量将小于M2,并且在日志中更早出现。
  • 消费者实例按记录在日志中的存储顺序查看记录。
  • 对于复制因子为N的主题,我们最多可以容忍N-1个服务器故障,而不会丢失提交给日志的任何记录。

八.Kafka作为消息传递系统

Kafka的流概念与传统的企业消息传递系统相比如何?
传统上,消息传递具有两种模型:排队和发布-订阅。在队列中,一组消费者可以从服务器读取数据,并且每条记录都只能被一个消费者消费;在发布-订阅模式中,记录广播给所有消费者;这两个模型都有自己的优点和缺点。排队的优势在于,它允许将数据处理划分到多个消费者实例上,从而扩展处理量。不幸的是,队列不是多用户的,不允许不同用户消费同一条数据。发布-订阅允许将数据广播到多个进程,但是由于每条消息都传递给每个消费者,因此无法扩展处理。

Kafka的消费群体概念概况了这两个概念。与队列一样,消费者组允许将处理划分为一组进程。与发布-订阅一样,Kakfa允许将消息广播到多个消费者组。
Kafka模型的优势在于,每个主题都具有这些属性,可以扩展处理范围,并且是多订阅者,无需选择其中之一。与传统的消息传递系统相比,Kafka还具有更强的顺序保证。
传统队列将记录按顺序保留在服务器上,如果多个消费者从队列中消费,则服务器将按记录的存储顺序分发记录。但是,尽管服务器顺序分发记录,但是这些记录是异步传递给消费者的,因此它们可能会在不同的使用者上无序到达。这实际上意味着在并行使用的情况下会丢失记录的顺序。消息传递系统通常通过具有专门使用者的概念来解决此问题,该概念仅允许一个进程从队列中使用,但是,这当然意味着在处理中没有并行性。

Kafka做的更好。通过在主题内具有并行性【即分区】的概念,Kafka能够在用户进程池中提供排序保证和负载均衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区都由组中的一个消费者完全消费。通过这样做,我们确保消费者是该分区的唯一读取器,并按顺序使用数据。由于存在多分区,因此仍然可以平衡多消费者实例上的负载。但是请注意,消费者组中的消费者实例不能超过分区。

九.Kafka作为存储系统

任何允许发布与消费无关消息的消息队列都有效地充当了运行中消息的存储系统。Kafka的不同之处在于它是一个非常好的存储系统。写入Kafka的数据将写入磁盘并进行复制以实现容错功能。Kafka允许生产者等待确认,以便直到完全复制并确保即使写入失败的服务器也可以保留写入,此时写入才被认为是完整的。
Kafka的磁盘结构可以很好地扩展使用,无论服务器上有50KB还是50TB的持久数据,Kafka都将执行相同的操作。
认真对待存储并允许客户端控制其读取位置的结果是,可以将Kafka视为一种专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统。

十.Kafka用于流处理

仅读取、写入和存储数据流是不够的,目的是实现对流的实时处理。
在Kafka中,流处理器是从输入主题中获取连续数据流,对该输入进行一些处理并生成连续数据流以输出主题。
可以直接使用生产者和消费者API进行简单处理。但是,对于更复杂的转换,Kafka提供了完全集成的Streams API。这允许构建执行复杂处理的应用程序,这些应用程序计算流的聚合或将流连接在一起。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值