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