拜占庭将军问题

拜占庭将军将军问题讨论的核心内容是分布式共识问题

拜占庭将军问题算法和非拜占庭将军问题算法

***非***拜占庭拜占庭将军问题算法:

  • Paxos (强一致性的主备方案)
  • Raft (强一致性的主备方案)
  • ZAB (强一致性的主备方案)
  • Gossip (最终一致性的无主方案)

拜占庭将军问题算法:

  • PBFT (强一致性的主备方案)
  • Pow (最终一致性方案)

常见的共识算法架构

在分布式系统中,常见的共识方案可以分为以下三大类:

主备方案 (Leader-Follower 模式)

这是最常见的一种形式,如 Raft、ZAB 等算法采用此模式

  • Leader 负责处理所有的写请求
  • Follower 节点可以提供读服务,并作为备份节点

集群通过共识算法来保证主节点和备份节点之间的数据一致性

多主方案

Multi-Paxos 变体:支持多个主节点,每个主负责不同的值域范围,就是使用一致性哈希等分片算法组合起来的多个主备方案

典型例子:

  • MySQL 分片集群
  • MongoDB 分片集群
  • Redis 集群

无主方案

CRDT (无主):所有节点都可以处理写入;通过数学特性保证最终一致性;适用于协同编辑等场景。

  • Gossip 协议:

    • 去中心化设计
    • 通过节点间随机通信传播更新
    • 用于服务发现等场景
  • Pow 协议:

    • 支持对等节点设计
    • 可处理恶意节点
    • 常用于区块链系统

方案选择考虑因素:

主备方案优势

  • 架构相对简单清晰,易于理解和实现。主节点负责主要的业务处理,备节点处于待命状态,在主节点出现故障时能快速接替其工作,保障系统的连续性。
  • 数据一致性维护相对容易。通常主节点处理完业务后会将数据同步到备节点,在切换过程中能较好地保证数据状态的一致性
  • 系统稳定性有一定保障。备节点的存在使得即使主节点突发故障,如宕机、网络中断等,也能在较短时间内恢复服务,减少因主节点故障导致的业务中断时间

主备方案劣势

  • 资源利用率可能不高。备节点在大部分时间处于闲置状态,只在主节点故障时才发挥作用,造成了一定的硬件资源浪费。
  • 存在单点故障风险。虽然有备节点,但如果主节点和备节点同时出现故障 (比如遭受相同的网络攻击、硬件故障等),系统仍可能陷入瘫痪。
  • 主备切换过程可能存在短暂的数据不一致或服务中断情况。

多主方案优势

  • 更好的写入性能,多个主节点可以同时处理不同的业务任务,分担了系统的工作量
  • 具备一定的容错能力更高的可用性。即使其中一个主节点出现故障,其他主节点仍能继续处理业务,不至于使整个系统陷入瘫痪,保障了系统的基本运行。
  • 可以灵活配置资源。根据业务需求和负载情况,可以灵活调整各个主节点的功能和任务分配,使系统资源得到更有效的利用。

多主方案劣势

  • 数据一致性维护复杂。多个主节点同时处理业务,要确保它们处理的数据在整个系统中保持一致难度较大,需要复杂的同步机制和冲突处理机制。
  • 实现复杂度高,协调管理困难。多个主节点之间需要进行有效的协调和沟通,以确保业务的正常开展,否则可能出现任务分配不均、业务冲突等问题,增加了系统管理的复杂性。
  • 增加了安全风险。多个主节点意味着更多的攻击入口,更容易遭受恶意攻击,且一旦某个主节点被攻破,可能会影响到整个系统的安全和稳定。

无主方案优势

  • 资源利用更加均衡。所有节点地位平等,都参与到业务处理中,不存在某个节点闲置等待的情况,使得系统资源得到更充分的利用。
  • 具有较好的可扩展性。新节点可以很容易地加入到系统中,不需要考虑与主节点的适配等问题,只需遵循系统的基本规则即可参与业务处理,便于系统的扩展和升级
  • 避免了单点故障问题。由于不存在主节点,也就不存在因主节点故障而导致系统瘫痪的风险,

无主方案劣势

  • 达成共识难度大。由于没有主节点来主导决策过程,所有节点需要通过复杂的共识算法 (如 PBFT、RAFT 等) 来达成一致意见,这需要消耗大量的时间和计算资源,可能导致业务处理速度较慢。
  • 数据一致性维护挑战大。所有节点平等参与业务处理,要确保数据在各个节点间保持一致需要更为复杂的机制,比如分布式事务处理等,否则容易出现数据不一致的情况。
  • 系统管理和监控相对复杂。没有主节点作为核心监控和管理对象,需要对所有节点进行全面的监控和管理,增加了系统管理和监控的难度和工作量。

实际选择时需要根据业务场景在 CAP 三者间做出权衡,选择最适合的方案。

多主和无主的区别

如果所有节点都是对等的,都可以处理写请求,这种是无主 (Leaderless) 架构,而不是多主。典型的就是 Gossip 协议,和

也就是说,多主,并不是所有节点完全平等,有多个主节点,每个主节点下都可能有自己的备份节点,主节点之间是对等的,都可以处理写请求,每个主节点通常负责不同的数据范围

多主就等于多个主从,然后使用一致性哈希等算法,划片儿治理的意思