Swarm 模式下的 Raft 共识

当Docker Engine以Swarm模式运行时,管理节点实现 Raft共识算法来管理全局集群状态。

Swarm 模式使用共识算法的原因是为了确保集群中负责管理和调度任务的所有管理节点都存储相同的一致状态。

在整个集群中拥有相同的一致状态意味着在发生故障时,任何 Manager 节点都可以接管任务并将服务恢复到稳定状态。例如,如果集群中负责调度任务的 Leader Manager 意外死亡,任何其他 Manager 都可以接手调度任务并重新平衡任务以匹配所需的状态。

使用共识算法在分布式系统中复制日志的系统确实需要特别小心。它们通过要求大多数节点就值达成一致来确保集群状态在出现故障时保持一致。

Raft 可以容忍(N-1)/2失败,并要求大多数或法定人数的 (N/2)+1成员就向集群提出的值达成一致。这意味着在运行 Raft 的 5 个 Manager 的集群中,如果有 3 个节点不可用,系统将无法处理更多请求来安排其他任务。现有任务继续运行,但如果管理器集不健康,调度程序无法重新平衡任务以应对故障。

Swarm模式下共识算法的实现意味着它具有分布式系统固有的属性:

  • 容错系统中的值一致。 (参考 FLP不可能性定理Raft共识算法论文
  • 通过领导者选举过程实现相互排斥
  • 集群成员管理
  • 全局一致的对象排序和 CAS(比较和交换)原语