ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
***** #### **1.1 CAP理论和BASE理论** * **分布式事物:** 指事物参与者、支持事物的服务器、资源服务器以及事物管理器分别于分布式系统的不同节点之上。通常一个分布式事物中会涉及对多个数据源或者业务系统的操作。 * **本地事物:** 可以采用ACID模型保证数据的严格一致性。但在分布式系统中,实现事物的严格一致性会和服务的可用性产生冲突,这是有分布式系统的特征决定的。因此,在可用性和一致性之间永远无法存在一个两全其美的方案,于是如何构建一个兼顾可用性和一致性的分布式系统成为一个难题,因此出现了诸如CAP和BASE这样的分布式经典理论。 ***** 1. **CAP理论** CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer's theorem),是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想。2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。对于设计分布式系统的架构师来说,CAP 是必须掌握的理论。 >[] 在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。 ![](https://img.kancloud.cn/f5/bd/f5bd764172813bb8c1529a5d22ee51f4_700x417.png) 1.1 **一致性** >[] 一致性指数据在多个副本之间是否能够保持一致性的特性。在一致性的需求下,当一个系统在数据一致的状态下执行了更新操作后,应该保证系统的数据任然处于一致的状态。**布鲁尔提到对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。** * 在分布式系统中如果能够针对一个数据项的更新操作执行成功后,所有用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性。 1.2 **可用性** >[] 可用性指系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是能够在 **有限的时间内(指用户的一个操作,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间,系统就认为不可用)返回结果(返回结果是可用性的另一个重要指标,要求系统在完成对用户请求处理后,返回一个正常的响应结果,失败或者成功,而不是一个困惑的结果)**。 1.3 **分区容错性** >[] 分区容错性约束了一个分布式系统需要具有如下特征:分布式系统在遇到任何网络分区故障的时候,仍热能够保证对外提供满足一致性或可用性的服务,除非整合网络环境发生了故障。 * **网络分区** 指在分布式系统中,不同节点分布在不同的子网络(机房或者异地网络等)中,由于一些特殊的原因导致这些网络之间出现网络不连通的状态,但是各个子网络的内部网络是正常的,从而导致整个系统的网络呼喊经被切分为若干个孤立的区域。 1.4 **总结** * 在分布式环境中,我们会发现必须选择 P(分区容忍)要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。**也就是说分区容错性是分布式系统的一个最基本要求。** * 在CAP理论中,不能同时满足一致性、分区容忍性、可用性,而分区容忍性优势分布式系统的基本要求,因此在架构设计的时候只能在**CA或者CP中**取舍,也就是只能在一致性或者可用性之间取舍。 1.5 **CAP理论中几个重要的细节** * **CAP 关注的粒度是数据,而不是整个系统** C 与 A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。但在实际设计过程中,每个系统不可能只处理一种数据,而是包含多种类型的数据,有的数据必须选择 CP,有的数据必须选择 AP。而如果我们做设计时,从整个系统的角度去选择 CP 还是 AP,就会发现顾此失彼,无论怎么做都是有问题的。 * (以一个最简单的用户管理系统为例,用户管理系统包含用户账号数据(用户 ID、密码)、用户信息数据(昵称、兴趣、爱好、性别、自我介绍等)。通常情况下,用户账号数据会选择 CP,而用户信息数据会选择 AP,如果限定整个系统为 CP,则不符合用户信息数据的应用场景;如果限定整个系统为 AP,则又不符合用户账号数据的应用场景。) * **CAP 是忽略网络延迟的。**意味着,CAP 理论中的 C 在实践中是不可能完美实现的,在数据复制的过程中,节点 A 和节点 B 的数据并不一致。 * **正常运行情况下,不存在 CP 和 AP 的选择,可以同时满足 CA。**CAP 理论告诉我们分布式系统只能选择 CP 或者 AP,但其实这里的前提是系统发生了“分区”现象。如果系统没有发生分区现象,也就是说 P 不存在的时候(节点间的网络连接一切正常),我们没有必要放弃 C 或者 A,应该 C 和 A 都可以保证,这就要求架构设计的时候既要考虑分区发生时选择 CP 还是 AP,也要考虑分区没有发生时如何保证 CA。(同样以用户管理系统为例,即使是实现 CA,不同的数据实现方式也可能不一样:用户账号数据可以采用“消息队列”的方式来实现 CA,因为消息队列可以比较好地控制实时性,但实现起来就复杂一些;而用户信息数据可以采用“数据库同步”的方式来实现 CA,因为数据库的方式虽然在某些场景下可能延迟较高,但使用起来简单。) * **放弃并不等于什么都不做,需要为分区恢复后做准备。**