CAP 概念
CAP 即 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)
- **一致性:**所有节点访问同一份最新的数据副本
- 可用性: 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。
- 分区容错性: 分布式系统出现网络分区的时候,仍然能够对外提供服务。
CP&AP
分布式系统中,多个节点之间的网络本来是连通的,但是因为某些故障某些节点之间不连通了,整个网络就分成了几块区域,这就是网络分区。
当发生网络分区的时候,如果要继续服务,那么 C 和 A 只能 2 选 1。也就是说当网络分区之后 P 是前提,分区容错性是必须要实现的。
因此,分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。 比如 ZooKeeper、HBase 就是 CP 架构,Cassandra、Eureka 就是 AP 架构,Nacos 不仅支持 CP 架构也支持 AP 架构。
为啥没有 CA 架构
举个例子:若系统出现“分区”,系统中的某个节点在进行写操作。为了保证 C, 必须要禁止其他节点的读写操作,这就和 A 发生冲突了。如果为了保证 A,其他节点的读写操作正常的话,那就和 C 发生冲突了。
当然如果系统大部分状态是网络分区正常,也就说不需要保证 P 的时候,C 和 A 能够同时保证。
BASE 概念
BASE 即 Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性)
**基本可用:**分布式系统出现故障时允许损失部分可用性。如响应时间拉长、部分系统功能不能访问。
**软状态:**允许系统中的数据存在中间状态,但不会影响系统的整体可用性
**最终一致性:**系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态,不需要保证实时的数据一致性。
核心思想
即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
在上面的 CAP 中说过,如果出现网络分区,那么通常要在 CP 和 AP 中权衡,而如果没有网络分区,那么就要考虑如何保证 CA 了,所以说 BASE 算是 AP 方案的延申补充。
因此,AP 方案只是在系统发生分区的时候放弃一致性,而不是永远放弃一致性。**在分区故障恢复后,系统应该达到最终一致性。**这一点其实就是 BASE 理论延伸的地方,由网络分区的 AP 变成网络不分区的 CA。
Paxos 算法
Paxos 算法是第一个被证明完备的分布式系统共识算法。共识算法的作用是**让分布式系统中的多个节点之间对某个提案达成一致的看法。**提案的含义在分布式系统中十分丰富,比如 Leader 节点选举、多个事件发生的顺序。
Paxos 算法 前提条件之一是没有恶意节点,即不存在拜占庭将军问题。
Paxos 核心
- Basic Paxos 算法:描述的是多节点之间如何就某个值达成共识。
- Multi-Paxos 思想:描述的是执行多个 Basic Paxos 实例,就一系列值达成共识。 说白了就是执行多次 Basic Paxos ,核心还是 Basic Paxos 。
Basic Paxos 算法 中存在 3 个重要的角色:
- 提议者(Proposer):也可以叫做协调者(coordinator),提议者负责接受客户端的请求并发起提案。提案信息通常包括提案编号 (Proposal ID) 和提议的值 (Value)。
- 接受者(Acceptor):也可以叫做投票员(voter),负责对提议者的提案进行投票,同时需要记住自己的投票历史;
- 学习者(Learner):如果有超过半数接受者就某个提议达成了共识,那么学习者就需要接受这个提议,并就该提议作出运算,然后将运算结果返回给客户端。
为了减少实现该算法所需的节点数,一个节点可以身兼多个角色。并且,一个提案被选定需要被半数以上的 Acceptor 接受。
Raft 算法
paxos 算法的简化,更易实现。