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