Swarm 模式中的 Raft 共识
当 Docker Engine 以 Swarm 模式运行时,管理器节点会实现 Raft 共识算法 来管理全局集群状态。
Swarm 模式使用共识算法的原因是为了确保负责集群中任务管理和调度的所有管理节点都存储相同的一致性状态。
集群中保持状态一致意味着在发生故障时, 任何 Manager 节点都可以接管任务并将服务恢复到稳定状态。 例如,如果负责调度集群任务的 Leader Manager 意外宕机, 任何其他 Manager 都可以接管调度任务并重新平衡任务以匹配期望状态。
使用共识算法在分布式系统中复制日志的系统需要特别小心。它们通过要求大多数节点就值达成一致,确保集群状态在发生故障时保持一致。
Raft 最多可容忍 (N-1)/2 次故障,并且需要大多数节点或法定人数(quorum)中的 (N/2)+1 个成员就集群中提议的值达成一致。这意味着在运行 Raft 的 5 个管理节点组成的集群中,如果有 3 个节点不可用,系统将无法处理任何新的任务调度请求。现有的任务会继续运行,但如果管理节点组不健康,调度器将无法重新平衡任务以应对故障。
Swarm 模式下共识算法的实现在其设计中体现了分布式系统的固有特性:
- 容错系统中的值达成一致。(参考 FLP 不可能定理 和 Raft 共识算法论文)
- 通过领导者选举过程实现互斥
- 集群成员管理
- 全局一致的对象排序与CAS(比较并交换)原语