基于本文回答
0
评论

新版本的Kafka为什么可以去掉Zookeeper(KRaft模式)?

知识点图片

讲解了Zookeeper在Kafka中的元数据管理角色,以及新版Kafka如何通过内置的KRaft模式取代它,从而简化架构、提升性能。

这是一个非常核心且重要的问题,涉及到 Kafka 架构的重大演进。我们分两部分来详细解答。


第一部分:Zookeeper 在 Kafka 中扮演了什么角色?

在引入 KRaft 模式之前(即 Kafka 3.0 之前的经典架构),Zookeeper 是 Kafka 集群不可或缺的“大脑”和“中枢神经系统”。它是一个独立的分布式协调服务,Kafka 严重依赖它来存储和管理集群的关键元数据。

Zookeeper 的主要角色可以总结为以下几点:

1. Broker 注册与发现 (Broker Registry)

  • 注册:每个 Kafka Broker 启动时,都会在 Zookeeper 的一个特定路径下(例如 /brokers/ids)创建一个临时的 Znode(临时节点)。这个 Znode 包含了 Broker 的 ID、主机名、端口等信息。
  • 心跳与健康检查:Znode 是临时的,意味着它与创建它的 Broker 的会话(Session)绑定。如果 Broker 宕机或与 Zookeeper 的连接断开,这个临时 Znode 会被自动删除。
  • 发现:集群中的其他组件(尤其是 Controller)通过监听(Watch)这个路径下的 Znode 变化,可以实时地感知到哪些 Broker 是存活的,以及新加入或下线的 Broker。

2. Controller 选举 (Controller Election)

  • Kafka 集群中只有一个 Broker 会被选举为 Controller,它负责管理整个集群的状态,如分区 Leader 选举、副本分配等。
  • 这个选举过程完全依赖 Zookeeper 的原子性操作。所有 Broker 会尝试在 Zookeeper 的 /controller 路径下创建一个临时 Znode。根据 Zookeeper 的特性,只有一个 Broker 能成功创建,这个 Broker 就成为 Controller。如果 Controller 宕机,其 Znode 消失,其他 Broker 会再次发起抢夺,选举出新的 Controller。

3. Topic 配置与管理 (Topic Configuration)

  • 所有 Topic 的元数据,包括分区数量、副本因子、配置参数(如日志保留策略)等,都存储在 Zookeeper 的 /config/topics 路径下。
  • 当你创建、修改或删除一个 Topic 时,实际上是在 Zookeeper 中创建、修改或删除了对应的 Znode。Controller 会监听这些变化,并执行相应的操作。

4. 分区 Leader 和 ISR(In-Sync Replicas)管理

  • 每个 Topic 的每个分区都有一个 Leader 副本和若干个 Follower 副本。所有读写请求都由 Leader 处理。
  • 分区的 Leader 是谁,以及哪些 Follower 是与 Leader 同步的(即 ISR 列表),这些至关重要的信息都存储在 Zookeeper 中。
  • 当一个分区的 Leader 所在的 Broker 宕机时,Controller 会从 Zookeeper 读取该分区的 ISR 列表,从中选举一个新的 Leader,并将这个变化更新回 Zookeeper。其他 Broker 通过监听 Zookeeper 上的变化来获知新的 Leader。

5. 访问控制列表 (ACLs) 和配额管理 (Quotas)

  • 用户的权限信息(ACLs)和客户端的生产/消费速率限制(Quotas)等安全和管理相关的配置也存储在 Zookeeper 中。

总结来说,Zookeeper 是 Kafka 集群元数据的唯一“事实来源”(Source of Truth),并提供了分布式锁和事件通知机制来保证集群的一致性和协调性。


第二部分:新版本的 Kafka 为什么可以去掉 Zookeeper(KRaft 模式)?

尽管 Zookeeper 功能强大,但依赖一个独立的外部系统也带来了诸多问题:

  • 运维复杂性:需要维护两套独立的分布式系统(Kafka 和 Zookeeper),增加了部署、监控、调优和故障排查的难度。
  • 性能瓶颈:所有元数据读写都经过 Zookeeper,在超大规模集群(例如数十万分区)中,Zookeeper 可能成为性能瓶颈,尤其是在 Controller 故障切换时,新 Controller 需要从 Zookeeper 加载所有元数据,恢复时间较长。
  • 架构不统一:Kafka 本身是一个基于日志的分布式系统,而 Zookeeper 是基于树形数据结构的系统,二者架构理念不同。

为了解决这些问题,Kafka 社区通过 KIP-500 提案引入了 KRaft(Kafka Raft consensus protocol)模式,其核心思想是 让 Kafka 自己管理自己的元数据

KRaft 模式之所以能替代 Zookeeper,是因为它在 Kafka 内部实现了一套完整的分布式共识机制,具体原理如下:

1. 内置的 Raft 共识协议

  • KRaft 模式引入了一个由部分 Broker 组成的 Controller Quorum(控制器节点组)。这些节点(通常是 3 或 5 个)共同运行 Raft 共识协议。
  • Raft 协议是一种比 Zookeeper 的 ZAB 协议更简单、更易于理解和实现的共识算法,它能保证在一个节点组中安全地选举出 Leader 并对操作日志进行复制。

2. 使用内部 Topic 存储元数据

  • KRaft 模式将所有过去存储在 Zookeeper 中的元数据,全部写入到一个 Kafka 内部的、高度复制的特殊 Topic 中,这个 Topic 叫做 __cluster_metadata
  • 这个元数据日志(Metadata Log)就相当于 Raft 协议中的“操作日志”。所有对集群元数据的更改(如创建 Topic、Broker 上线、分区 Leader 变更)都会被转换成一条条的记录(Record)追加到这个日志的末尾。

3. 事件驱动的架构

  • 在 Controller Quorum 中,Raft 协议会选举出一个 Active Controller。只有这个 Active Controller 可以向 __cluster_metadata 日志中写入新的记录。
  • Quorum 中的其他 Controller 节点作为 Follower,不断地从 Leader 复制这个日志,保持数据同步,并随时准备在 Leader 宕机时接替它。
  • 集群中所有 Broker(包括 Controller 节点自身)都会像消费者一样“消费”这个 __cluster_metadata Topic。当它们读取到新的元数据记录时,就会更新自己内存中的集群状态。

KRaft 模式是如何替代 Zookeeper 的具体角色的?

  • Broker 注册/发现:不再需要临时 Znode。Broker 启动时会向 Controller Quorum 发送心跳和注册请求,Controller 将其状态记录到元数据日志中。如果心跳超时,Controller 会写入一条“Broker 离线”的记录。
  • Controller 选举:不再需要抢占 Znode。Controller Quorum 内部通过 Raft 协议自然地选举出 Active Controller。故障切换速度极快,因为元数据状态已经存在于所有 Controller 节点的日志中,新 Leader 无需从外部系统加载。
  • Topic/分区/ACLs 等元数据管理:所有这些信息都作为记录写入 __cluster_metadata 日志中,由 Kafka 自身持久化和复制。

去掉 Zookeeper 带来的核心优势:

  1. 简化架构和运维:只需管理一套系统——Kafka。部署、配置、安全、监控都变得统一和简单。
  2. 提升性能和可扩展性:元数据管理现在利用了 Kafka 自身高效的日志读写能力。KRaft 可以支持更大规模的集群(百万级分区),因为元数据传播是批量的、异步的。
  3. 更快的故障恢复:Controller 故障切换非常快(毫秒级),因为它不需要像以前一样从 Zookeeper 缓慢地加载整个集群的元数据快照。
  4. 单一安全模型:不再需要为 Zookeeper 和 Kafka 配置两套独立的安全机制(认证、授权、加密)。

总而言之,KRaft 模式通过在 Kafka 内部实现一个基于 Raft 协议的共识层,并利用 Kafka 自身强大的日志系统来存储和传播元数据,从而完全取代了对外部 Zookeeper 服务的依赖,使得 Kafka 成为一个真正自洽(self-contained)的分布式系统。 这是 Kafka 诞生以来最重大的架构变革之一。

右滑查看面试常问