Kafka Topic架构-复制、故障转移和并行处理

本节将介绍Kafka主题架构的一些较低层次的细节。我们将介绍Kafka Topic的体系结构,并讨论如何使用分区进行故障转移和并行处理。

Kafka Topic主题、日志和分区

回忆一下,Kafka主题(topic)是一个命名的记录流。Kafka在日志中存储主题。一个主题日志被划分为多个分区。Kafka在多个服务器或磁盘上扩展日志分区。把一个主题想象成一个类别、流名称或提要。

主题本质上是发布和订阅样式的消息传递。一个Topic可以有0个或多个称为消费者组的订阅者。主题根据速度、可伸缩性和大小划分为多个分区。

Kafka Topic主题分区

Kafka将主题日志分成多个分区。如果有记录键,记录通常按记录键存储在分区上,如果没有记录键,则按轮询(默认行为)。默认情况下,记录键决定生产者将记录发送到哪个分区。

Kafka使用分区来跨多个服务器扩展一个主题,用于生产者写入。此外,Kafka还使用分区来方便并行消费者。消费者以并行的方式消费记录,直到达到分区的数量。

每个分区保证的顺序。

如果按键分区,那么所有记录的键将在相同的分区上,这在重播日志时是非常有用的。Kafka可以将分区复制到多个broker进行故障转移。

Kafka主题日志分区的排序和基数

Kafka只在单个分区中维护记录顺序。分区是一个有序的、不可变的记录序列。Kafka不断地使用分区作为结构化提交日志添加到分区。分区中的记录被分配连续的id号,称为偏移量(offset)。偏移量标识分区中的每个记录位置。主题分区允许Kafka日志扩展到单个服务器上无法容纳的大小。主题分区必须适合承载它的服务器,但是主题可以跨越多个服务器上的多个分区。另外,主题分区是并行性的一个单元——一个分区一次只能由一个消费者组中的一个消费者处理。消费者可以在自己的进程或线程中运行。如果一个消费者停止了,Kafka会在同一消费组的剩余消费者之间展开分区。

Kafka主题分区复制

Kafka可以在可配置数量的Kafka服务器上复制分区,用于容错。每个分区有一个leader服务器和零个或多个follower服务器。leader处理一个分区的所有读和写请求。

follower复制leader,如果leader死掉,他们就接管。Kafka也使用分区来处理组内的并行消费者。Kafka在Kafka集群的服务器上分布主题日志分区。每个服务器通过共享分区leader来处理数据和请求的共享。

Kafka使用ZooKeeper选择一个broker的分区副本作为leader。

拥有分区leader的broker处理该分区记录的所有读写操作。Kafka将对leader分区的写操作复制到follower(节点/分区对)。同步的follower被称为ISR(in-sync replica,同步副本)。如果一个分区领导失败,Kafka选择一个新的ISR作为新的领导。

当分区的所有ISR写入其日志时,该记录被认为是“committed”(已提交)。只有提交的记录才可从用户读取。另一个分区可以被另一个Kafka Broker上的另一个leader所拥有。

下图显示了一条记录复制到Partition 0的过程。

下图显示了另一条记录复制到Partition 1的过程。

Kafka Topic架构常见问题

问:什么是ISR?

答:ISR是同步副本(in-sync replica)。如果一个领导者失败了,一个ISR将被选为新的领导者。

问:Kafka如何扩展费者?

答:Kafka通过分区扩展消费者,这样每个消费者都可以获得其分区份额。一个消费者可以有多个分区,但一个分区一次只能由一个消费者组中的一个消费者使用。如果只有一个分区,那么只能有一个消费者。

问:什么是Leaders? 什么是Followers?

答:Leaders执行对特定主题分区的所有读和写操作。Followers复制Leaders。

问:Kafka如何为消费者执行故障转移?

答:如果消费者组中的一个消费者死掉了,分配给该消费者的分区将在该组中剩余的消费者之间进行划分。

问:Kafka如何为Broker执行故障转移?

答:如果一个Broker死掉了,那么Kafka将其主题分区的Leader划分给集群中剩余的Broker。


《Flink原理深入与编程实战》