分布式定义、主要目标、优缺点、与集中式区别;分布式 CAP 定理、PACELC 理论、BASE 理论的核心观点、应用场景等;分布式算法如 Paxos 算法、Raft 算法、Gossip 算法、两阶段提交(2PC)、三阶段提交(3PC)、一致性哈希算法、Bully 算法、Chord 算法等算法的核心思想、角色、算法过程、特性、应用场景和变种等。
—— 2025 年 2 月 3 日 甲辰年正月初六 立春
分布式是计算机科学中的一个研究方向,它研究如何把一个需要巨大计算能力或资源才能解决的问题分成若干个小部分,然后把这些部分分配给多个计算机进行处理,最后把这些结果综合起来得到最终结果。即分散压力。换言之,当程序和数据需要通过网络分布在多个计算机上时,我们就称它是分布式的。如分布式计算、分布式存储、分布式数据、分布式缓存、分布式文件系统等。
分布式系统的主要目标(优点)和缺点如下:
与分布式对应的是集中式,二者区别如下:
CAP 定理 是分布式系统中的一个核心理论,由加州大学计算机科学家 Eric Brewer 提出。它描述了分布式系统在设计时面临的三个关键属性之间的权衡关系。CAP 定理指出,在分布式系统中,一致性(Consistency)、**可用性(Availability)**和 分区容错性(Partition Tolerance) 三种属性无法同时满足,最多只能满足其中两个。
如上图所示,CAP 定理指出,在分布式系统中,最多只能同时满足 CAP 中的两个属性。但是,在分布式系统中网络分区(即节点间通信中断,如网络延迟、丢包、节点故障等)时不可避免的(因为网络是不稳定的、是波动的),因此 分区容错性(P)必须选择。具体如下:
部分分布式系统不是绝对的 cp、ap 或 ca,其支持通过配置或其它方式在三者间进行切换,如 nacos、redis 等。
PACELC 理论是基于 CAP 理论扩展出来的。它考虑了这样一个问题,即:系统在大部分情况下都是稳定运行的,不会出现网络分区。所以在这种情况下,系统在设计上要均衡的其实是延迟与数据一致性的问题,要保证数据一致性,则写入和读取的延迟会增高。所以,其本质上进一步细化了分布式系统的设计选择:
故,PACELC 理论不仅包含了系统出现网络分区的极端情况,又扩展出系统正常运行时的情况,是设计分布式系统的指导理论的最佳选择。
BASE 定理由 eBay 架构师提出,是对 CAP 的一种补充和扩展,或是对 CAP 的一种具体实践或指导。其强调通过牺牲强一致性来换取系统的可用性和高性能,特别适用于需要高可用性和分区容错性的场景,即 AP 系统。
BASE 的核心观点是通过牺牲强制一致性来保证系统的高可用和高性能。其优点为:
在实际实现中,BASE 通常通过以下机制实现:
BASE 适用于对可用性和性能要求高,但对一致性要求不高的场景,如:
分布式算法是分布式系统中的核心组成部分,用来解决数据一致性、分区容错、负载均衡、分布式寻址等问题,常用的分布式算法及其优缺点如下:
Paxos 算法是一种用于在分布式系统中达成一致性的共识算法,由 Leslie Lamport 在 1990 年提出。它能够在存在网络分区、延迟或节点故障的情况下,确保系统中多个节点就某个值达成一致。Paxos 是许多分布式系统的基础。
Paxos 的核心思想
Paxos 通过多轮投票的方式,让系统中的多个节点就某个值达成一致。其核心思想是将一致性问题分解为多个阶段,每个阶段由不同的角色参与,并通过多数派(Quorum)原则确保一致性。
Paxos 的角色
Paxos 共有三个角色,且每个节点可以同时扮演多个角色,角色如下:
Paxos 的过程
Paxos 算法过程分为 Prepare 和 Accept 两个阶段:
Paxos 的特性
Paxos 的变种
由于 Paxos 算法较为复杂,故在实践中常用其变种:
Raft 算法是一种用于在分布式系统中达成一致性的共识算法,由 Diego Ongaro 和 John Ousterhout 在 2014 基于 Paxos 算法的思想提出。Raft 比 Paxos 更易理解和实现,同时又具有高容错性和高性能。Raft 通过将共识问题分解为更小的子问题(如领导选举、日志复制和安全性等),使得算法更加直观和易于实现。
Raft 的核心思想
Raft 的核心思想是通过在所有节点中选举一个领导者(Leader)来管理日志复制,从而简化共识过程。领导者负责接收客户端的请求,并将这些请求命令复制到其它节点(Follower),当多数节点成功复制日志后,领导者会提交日志条目,并通知其它节点。
Raft 的角色
Raft 共有三个角色,每个节点同时只能扮演一个角色,角色如下:
Raft 的过程
Raft 算法的过程可分为 领导选举(Leader Election)和 日志复制(Log Replication)两个阶段:
Raft 的关键机制
Raft 的特性
Raft 的优化
Gossip 算法或协议,也称流行病协议(Epidemic Protocol),是一种用于在分布式系统中进行信息传播和状态同步的算法。它的名称来源于单词 gossip(意为 八卦 或 流言蜚语),它的工作方式类似于村口情报中心的八卦信息的传播:即每个节点随机选择其它节点并与之交换信息,最终所有节点都会获得相同的信息。Gossip 算法具有高度容错性、可扩展性、去中心化和易实现特性,因此被广泛应用于分布式数据库、区块链和网络协议等领域。
Gossip 的核心思想
Gossip 算法的核心思想是通过 随机通信 和 局部信息交换,逐步将信息同步到所有节点。每个节点定期随机选择其它节点并与之交换信息,经过多次迭代后,信息会以指数级的速度传播到所有节点。由于通信时随机且局部的,所以 Gossip 算法对网络分区和节点故障具有天然的容错能力。
Gossip 的工作过程
Gossip 的信息传播模式
Gossip 的特性
Gossip 的应用场景
Gossip 的变种
两阶段提交(Two-Phase commit,2PC)是一种经典的分布式事务协议,用于在分布式系统中确保多个节点上的操作具有原子性。2PC 是分布式事务的基础协议之一,广泛应用于分布式数据库、分布式存储等领域。
2PC 的核心思想
2PC 的核心思想时通过一个协调者(Coordinator)来管理多个参与者(Participants),将事务的提交过程分为 准备 和 提交 两个阶段。
2PC 的角色
2PC 的工作过程
2PC 的特性
2PC 的应用场景
2PC 的变种
三阶段提交(Three-Phase Commit,3PC)是基于两阶段提交(2PC)的改进版本,旨在解决 2PC 的单点故障和阻塞问题。3PC 通过引入第三个阶段 预提交阶段 来减少事务阻塞的可能性,并提高系统的容错性。尽管 3PC 在理论上比 2PC 更健壮,但由于其复杂性和额外的网络通信开销,故其实际应用相对较少。
3PC 的核心思想
3PC 的核心思想是通过引入第三个阶段:预提交阶段 来减少事务阻塞的可能性。
3PC 的角色
3PC 的工作过程
3PC 的特性
3PC 应用场景
一致性哈希(Consistent Hashing)算法是一种特殊的哈希技术,广泛用于分布式系统中数据分布和负载均衡的场景。其核心目标是解决传统哈希方法在节点增减时导致的全局数据重新映射问题,从而减少数据迁移的开销,以提高系统的可扩展性和稳定性。一致性哈希由 David Karger 等人于 1997 年提出,主要用于分布式缓存系统(如 Memcached、redis 等)和分布式存储系统(如 Amazon Dynamo、Cassandra 等)。
一致性哈希的核心思想
一致性哈希的核心思想是将数据和节点映射到一个固定的哈希环上,通过环上的位置关系确定数据的归属节点。当节点增减时,只会影响环上相邻节点的数据,而不会导致全局数据的重新映射。
一致性哈希的工作原理
一致性哈希的示例
如图所示,将 4 个节点按照 “ip + 名称” 哈希取模,即 location = hash(ip + 名称) % n,然后,4 个节点落在了 hash 环上如图所示的四个位置。当一个请求到达时,对 key 也进行哈希取模,假设其落在了如图所示的位置,然后顺时针进行查找,找到 节点 2,即请求 key 命中了节点 2。这便是一个简单的寻址过程。
虚拟节点如物理节点 A 对应虚拟节点 A1、A2、A3,物理节点 B 对应虚拟节点 B1、B2、B3 等。
一致性哈希的特性
一致性哈希的应用场景
Bully 算法是一种用于分布式系统中选举领导者的算法,由 Garcia-Molina 在 1982 年提出。其核心思想是通过节点之间的比较(通常比较节点 ID 的大小)来确定领导者,适用于节点故障后需要重新选举领导者的场景。bully 意为 ”霸凌“,ID 大的节点通过霸凌 ID 小的节点胜出而成为领导者。
Bully 的核心思想
Bully 的核心思想是每个节点都有一个唯一的 ID,ID 越大的优先级越高;当节点检测到领导者故障时,会发起选举过程;选举过程中,ID 较大的节点会霸凌 ID 较小的节点,成为领导者。
Bully 的角色
Bully 的工作过程
Bully 的特性
Bully 的应用场景
Chord 算法是一种用于分布式哈希表(Distributed Hash Table,DHT)的协议,由 Ion Stoica 等人于 2001 年提出。其核心目标是在大型分布式系统中高效地定位数据或节点。
Chord 的核心思想
Chord 的核心思想是将节点和数据映射到一个逻辑环(通常是一个 2^m 大小的哈希空间,m 是哈希值的位数)上,并通过指针表(Finger Table)来加速查找过程,从而实现高效的节点发现和数据路由。
Chord 的角色
Chord 的工作机制
Chord 的特性
Chord 的应用场景