问题背景
高可用的通用设计方法是冗余设计,通过多个节点形成集群来提供服务。然而一旦使用集群,必然要涉及到集群的一致性、可用性、分区容错性等问题,也就是CAP理论。
CAP理论
分布式集群的CAP理论通常包含以下三个元素:
C:一致性
指一个服务集群中的所有节点的数据同一时刻必须具有同样的值。例如一个存储集群有a,b,c三个节点组成,如果从a节点写入一个数据,而从a, b,c节点能够同时读到该数据的值,并且一致,我们就认为这个集群是数据一致的。 相反如果a节点能读到该数据,而b,c节点暂时读不到,我们就认为集群数据不一致(可能是网络或其他原因导致a的数据没有同步到b,c节点)
A:可用性
处于工作状态的集群节点能在合理的时间内返回合理的响应。例如节点总是能够在超时时间内返回一个预期的结果,不会长时间的等待或阻塞
P:分区容错性
分区是指集群中的节点之间因为网络故障无法通信,导致集群被划分成了多个网络分区(分区内的节点可以正常通信,但是分区之间网络不通)。 针对这种常见情况,需要确保此时的集群不出现混乱,依然能够对外提供服务,即分区容错性
CAP三个关键属性通常不能在设计系统时完全满足,有时候需要做一下取舍,牺牲一部分某属性来换取或提升其他两个属性:
例如下面的一些使用场景:
BASE理论
在大部分场景中,可用性的重要程度比一致性更高,因此出现了BASE理论。
BA: 基本可用,常见方法有流量削峰,延迟响应,降级
S: 软状态,指一种过渡状态,即不同节点间,数据副本可能存在短暂的不一致
E:最终一致性,在时间窗口内,这些软状态会消失,达到一致性
BASE理论时对CAP的一致性和可用性进行权衡的结果。核心思想是:虽然无法做到强一致,但服务可以根据自身的业务特点,采取适当的方式保证最终的一致性。
因为如果要保证强一致性,必然涉及到节点之间的状态和数据同步,服务之间的调用和事务执行。耗时也会随着节点和数据的增加而变长,资源因此而阻塞,无法应对高并发和大流量。所以我们退而求其次,不追求强一致,而确保最终一致(例如在某个时间范围内,集群中的节点状态能够达到一致性)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。