在没有 zookeeper 的情况下运行 Kafka


Kafka在其 Kafka Raft Metadata 模式中使用 Raft 共识算法进行领导者选举,从而消除了对 ZooKeeper 管理集群元数据的依赖。Raft算法是一种共识协议,旨在确保分布式系统中状态机的容错复制。

在 Kafka 对 Raft 算法的实现中,每个 broker 都被认为是 Raft 集群中的一个节点,leader 负责管理集群元数据的状态。当一个 broker 启动时,它会向当前的 le​​ader 发送加入请求以加入 Raft 集群。如果没有当前领导者,broker 将发起选举并成为候选人。

选举过程从一个称为选举超时的随机计时器开始,该计时器在候选人激活时启动。如果候选人在选举超时内没有从其他broker 那里获得多数选票,则会发起新的选举,超时时间更长。这个过程一直持续到候选人获得多数选票并成为领导者为止。

一旦选出领导者,它就会将元数据复制到集群中的其他代理。如果 broker 检测到 leader 发生故障或变得无响应,它会发起新的选举以选出新的 leader。然后新的领导者将接管管理集群元数据状态的责任。

Raft 算法为集群元数据提供了强一致性保证,确保在任何给定时间只有一个领导者处于活动状态,并且所有代理都具有一致的元数据视图。这确保了Kafka 集群的可靠性和容错性,并允许它在没有单独的 ZooKeeper 集群进行元数据管理的情况下运行。


Kafka Leader选举的Raft算法
Kafka 传统上依赖 Apache ZooKeeper 来管理和协调分布式系统,包括构成 Kafka 集群的Kafka 代理。然而,从 0.10.0 版本开始,Kafka 提供了一个选项,可以在没有 ZooKeeper 的情况下运行,使用称为 Kafka Raft 元数据模式的功能。

在 Kafka Raft 元数据模式中,代理使用称为 Raft 的共识协议相互协调,这使他们能够在不依赖外部系统(如 ZooKeeper)的情况下选出领导者并跨集群复制元数据。这种模式为Kafka 集群提供了更简单、更精简的部署,因为它消除了对单独的 ZooKeeper 集群的需求并简化了配置。

要以 Raft Metadata 模式运行Kafka,您需要在代理属性文件中设置一些配置参数:

  1. 将broker.id参数设置为集群中每个代理的唯一数字 ID。
  2. 将参数设置metadata.replication.factor为应复制元数据的代理数。对于生产环境,这应该设置为至少三个。
  3. 将参数设置listeners为代理应侦听的网络接口和端口。

配置代理后,您可以像往常一样使用kafka-server-start脚本启动它们。代理将使用 Raft 共识协议自动选出一个领导者并在集群中复制元数据。

需要注意的是,Kafka Raft Metadata 模式仍然是一个实验特性,不推荐用于生产环境。在将其部署到生产环境之前,彻底测试和评估此功能非常重要。