Kafka 分布式协议的应用

310 阅读9分钟

分布式协议

分布式协议是规则、约定。用以确保分布式系统中多个节点间通信、数据同步、备份一致性的方案。

这些协议的设计目标是确保系统在多个节点之间能够正确地协作,即使在存在网络延迟、节点故障或其他不确定因素的情况下,也能保持系统的一致性、可用性和容错性

由于分布式场景的复杂性,不同场景都会有不同的取舍,继而衍生出适用于不同场景的分布式协议。

分布式协议通常解决以下几个关键问题:

  1. 一致性(Consistency) :确保所有节点在同一时间点上看到的数据是一致的。常见的一致性协议包括两阶段提交(2PC)和三阶段提交(3PC)。
  2. 共识(Consensus) :在多个节点之间就某个值或操作达成一致。常见的共识算法包括 Paxos、Raft 和 Zab(ZooKeeper 使用的协议)。
  3. 故障检测和恢复:识别系统中的故障节点,并在故障发生时进行恢复。心跳机制和故障检测协议(如 SWIM)是常用的方法。
  4. 领导者选举(Leader Election) :在分布式系统中选出一个节点作为领导者,以协调其他节点的操作。ZooKeeper 提供了领导者选举的功能。
  5. 复制(Replication) :在多个节点之间复制数据,以提高系统的可用性和容错性。复制协议确保数据在多个副本之间的一致性。
  6. 分区(Partitioning) :将数据分布在多个节点上,以提高系统的可扩展性和性能。分区协议决定如何将数据分配到不同的节点。

分布式协议的设计需要在一致性、可用性和分区容忍性(CAP 定理)之间进行权衡。不同的应用场景可能需要不同的协议来满足特定的需求。

kafka中的分布式协议

kafka 是一个典型的分布式系统,涉及多个 broker,每个 broker 又涉及多个分片副本。

  • 如何确保副本之间数据一致性?
  • 当主 broker 挂掉后,谁来保障服务快速恢复?

以上就是 kafka 分布式协议要解决的核心问题。

目前 kafka 主要版本中通过 zk 来管理集群的元数据和协调服务。Zab 协议是 zk 内部使用的协议,用于实现分布式一致性和高可用性。

依赖 zk

具体来说,ZooKeeper 在 Kafka 中的应用包括:

  1. 集群元数据管理

    • ZooKeeper 存储 Kafka 集群的配置信息,如主题、分区、副本分配等。
    • 它还维护集群中所有 broker 的状态信息。
  2. 领导者选举

    • ZooKeeper 负责管理 Kafka 分区的领导者选举。当一个分区的领导者 broker 失效时,ZooKeeper 协助选举出一个新的领导者。
    • Kafka 控制器节点的选举也是通过 ZooKeeper 实现的。控制器负责管理分区的领导者选举和分区的状态变更。
  3. 故障检测和恢复

    • ZooKeeper 监控 Kafka broker 的健康状态,并在检测到故障时触发相应的恢复机制。

Zab 协议在这个过程中起到的作用是确保 ZooKeeper 本身的高可用性和一致性。

ZooKeeper 使用 Zab 协议来保证其内部数据的一致性,即使在节点故障或网络分区的情况下,也能提供可靠的服务。

zab 协议

zab 协议主要用于维护 ZooKeeper 集群的一致性和高可用性。具体来说,zab 协议关注以下几个方面:

  1. 一致性

    • 线性一致性:zab 协议确保所有事务在所有节点上以相同的顺序被应用。这意味着任何时刻,所有节点看到的状态是一致的。
    • 持久性:一旦事务被提交,它将被永久保存,即使系统崩溃也不会丢失。
  2. 高可用性

    • zab 协议通过领导者选举和故障恢复机制,确保即使在节点故障或网络分区的情况下,zooKeeper 集群仍然能够继续提供服务。
    • 在领导者失效时,zab 协议能够快速选举出一个新的领导者,以最小化服务中断。

通过这些机制,zab 协议使得 ZooKeeper 能够在分布式环境中提供可靠的协调服务,支持高可用性和一致性。

CAP

Zab 协议

Zab 协议属于 CAP 理论中的 CP 类别。CAP 理论描述了分布式系统在一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)之间的权衡。具体来说:

  1. 一致性(Consistency)

    • Zab 协议确保所有节点在任何时间点上看到的数据是一致的。所有的写操作都被严格排序,并且在所有节点上以相同的顺序应用。
  2. 可用性(Availability)

    • 在 CAP 理论中,选择 CP 意味着在网络分区的情况下,系统可能会牺牲可用性以保证一致性。对于 ZooKeeper 来说,如果无法保证一致性(例如,无法在大多数节点上达成共识),它可能会拒绝服务请求。
  3. 分区容忍性(Partition Tolerance)

    • Zab 协议能够处理网络分区的情况,即使在部分节点失效或网络分区的情况下,仍然能够继续运作。

因此,Zab 协议优先保证一致性和分区容忍性(CP),即使这意味着在某些情况下可能会牺牲可用性。这种设计选择对于需要严格一致性保证的系统(如 ZooKeeper)是非常重要的。

为啥不是 AP?

zk 选择了 CAP 理论中的 CP 而不是 AP,主要是因为它的设计目标是提供强一致性保证,而不是在网络分区时保持高可用性。以下是具体原因:

  1. 一致性优先

    • ZooKeeper 的核心功能是提供一个强一致性的协调服务,确保所有客户端在任何时间点看到的数据都是一致的。这对于分布式系统中的配置管理、领导者选举和分布式锁等场景至关重要。
  2. 多数派机制

    • ZooKeeper 使用多数派(quorum)机制来保证一致性。只有在大多数节点达成共识的情况下,ZooKeeper 才会提交事务。这种机制确保了即使在网络分区或节点故障的情况下,数据的一致性仍然得到保证。
  3. 牺牲可用性

    • 在网络分区或节点故障导致无法形成多数派时,ZooKeeper 会选择拒绝服务请求以保持一致性。这意味着在某些情况下,ZooKeeper 会牺牲可用性来确保数据一致性。
  4. 应用场景

    • ZooKeeper 被设计用于需要强一致性的场景,例如分布式锁、配置管理和领导者选举。在这些场景中,数据的一致性比可用性更为重要。

因此,ZooKeeper 的设计选择了在网络分区的情况下优先保证一致性,即使这意味着在某些情况下会牺牲可用性。

这使得它更适合需要强一致性保证的应用场景,而不是那些在网络分区时仍然需要保持高可用性的场景。

kafka 倾向于 AP?

Kafka 的设计更倾向于 CAP 理论中的 AP,而不是 CP

因为 Kafka 的设计目标是提供高吞吐量和高可用性的消息传递服务,即使在网络分区的情况下也能继续提供服务。原因如下:

  1. 可用性优先

    • Kafka 的设计允许在网络分区或部分节点故障的情况下继续处理消息。这意味着即使在某些节点不可用的情况下,Kafka 仍然能够继续提供服务。
  2. 分区容忍性

    • Kafka 能够处理网络分区的情况,确保即使在部分节点失效或网络分区的情况下,系统仍然能够继续运作。
  3. 一致性选择

    • Kafka 提供了不同的一致性级别配置。例如,生产者可以选择在消息被写入所有副本后才确认(更强的一致性),或者在消息被写入至少一个副本后就确认(更高的可用性)。这种灵活性允许用户根据需求在一致性和可用性之间进行权衡。
  4. 副本机制

    • Kafka 使用副本机制来提高可用性。每个主题分区都有多个副本,分布在不同的节点上。即使一个节点宕机,其他副本仍然可以提供服务。
  5. 领导者选举

    • Kafka 使用领导者选举机制来管理分区的写入操作。只有领导者副本可以接受写入请求,其他副本作为追随者进行同步。这种机制在某种程度上提供了一致性,但主要目的是为了在节点故障时快速恢复可用性。

综上所述,Kafka 的设计更倾向于在网络分区的情况下保持高可用性(AP),而不是在所有情况下都保证强一致性(CP)。这使得 Kafka 非常适合需要高吞吐量和高可用性的消息传递场景。

zk 偏CP,kafka偏AP?

Kafka 依赖于 zk 来进行集群管理和元数据存储,而 zk 使用的 Zab 协议是一个 CP 系统。

然而,Kafka 本身的设计和操作模式更倾向于 AP。

原因如下:

  1. ZooKeeper 的角色

    • 在 Kafka 中,ZooKeeper 主要用于管理集群的元数据,例如主题、分区、以及消费者组的偏移量等。ZooKeeper 确保这些元数据的一致性和可靠性。
  2. Kafka 的数据流

    • Kafka 的数据流和消息传递机制是独立于 zk 的。Kafka 通过其自身的机制来管理消息的生产和消费,包括副本同步和故障恢复。
  3. 一致性与可用性权衡

    • Kafka 提供了多种配置选项,允许用户在一致性和可用性之间进行权衡。例如,生产者可以配置 acks 参数来决定在多少副本确认写入后才认为消息成功。这种灵活性使得 Kafka 可以在不同的场景下表现出不同的 CAP 特性。
  4. 分区和副本机制

    • Kafka 的分区和副本机制使得它在节点故障或网络分区时仍能继续提供服务,这体现了其对可用性的重视。
  5. 领导者选举和故障恢复

    • 虽然 Kafka 使用 zk 来进行领导者选举,但一旦选举完成,Kafka 的数据传递和处理并不依赖于 zk 的一致性特性。

综上所述,虽然 Kafka 使用了 zk 这个 CP 系统来管理元数据,但 Kafka 本身的消息传递和处理机制更倾向于在网络分区的情况下保持高可用性(AP)。

这使得 Kafka 能够在不同的使用场景中提供灵活的可用性和一致性选择。