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