CAP只能三选二,可以选CA吗?

本文探讨了CAP理论在分布式系统设计中的应用,强调了在一致性(C)、可用性(A)和分区容错性(P)之间的权衡,并介绍了ACID原则和BASE原则在不同场景的选择。重点讲述了如何在实际项目中通过分区容忍性和服务降级策略实现灵活的架构设计。

CAP理论在分布式系统领域非常重要,在我们做分布式系统的架构设计时会通过CAP原理验证方案的合理性。

CAP说的是在分布式系统下,存在三个要素:一致性、可用性、分区容错性。

  • 一致性:在分布式系统中,一份数据一般会存在多个副本,要求多个副本对数据的更新可以体现在所有副本上,也就是”强一致性“,不返回最新数据,就返回错误;

  • 可用性:在分布式系统中,任一时刻,分布式系统都需要保证在限定延时内可以正常响应客户端读写,获取非错误的响应,但不能保证获得的是最新数据;

  • 分区容错性:在分布式系统中,节点之间可能因为网络异常导致网络分区(丢包、延迟、中断等),需要保障在网络分区出现时,分布式系统不受影响;

CAP原理说在分布式系统下,只能满足其中两个特性,不能三者同时满足。

根据Cap定理的CA分布式系统是否存在?

答案:没有

关于分区容忍性。

第一版解释:出现消息丢失或分区错误时,系统能够继续运行;

第二版解释:当出现网络分区后,系统能够继续工作;

两版的区别是对分区的定义,不仅仅限定于消息丢失情况,可能是丢包、中断、拥塞等情况。

那有没有满足CA的系统呢?

有人说CA选型的系统是Oracle和MySQL,他们拥有强一致性和可用性,虽然Oracle RAC看似是分布式,但依然是通过共享存储实现的。MySQL主从则可以理解成多个单点的MySQL,通过Binlog实现数据同步到所有单点上。虽然看似实现了CA,但他们两者归根结底还是单点系统。

如果选择了CA放弃了P,那么当出现网络分区时,为了保障C那么就需要禁止写入,也就不能实现A了。

这里扩展下,我们所了解的一致性算法,包括2PC/3PC、Paxos、M/S,M/M 整个系统总是可以达到一致状态的,具体怎么达成一致,可能受时效性影响,也就是最终一致性还是强一致性。

由于分布式系统下,网络问题是不可避免的现象,不保证P很难叫分布式系统,P必然被实现,所以分布式系统一般都会在CP和AP上权衡。

选择CP的系统是什么逻辑?

CP系统意味着放弃了整体可用性,在分布式系统下,每个数据都是有副本的。

CP系统可以简单理解为副本数为1,客户端可以访问不同的副本进行数据读写,由于只有一个副本,不需要做副本之间数据同步,所以数据是强一致性的,也就满足了CP,一旦发生了网络分区问题,数据就会出现丢失或难以更新,会要求停止写,此时对客户端来说就不满足A了(读不到值、也写不进去了)。

选择AP的系统是什么逻辑?

AP的系统一般要求数据具有多个副本,即使出现网络分区,也不会因为丢失数据或数据不一致导致不可用,但多个副本划分在不同网络分区,会出现副本之间数据不一致情况。

比如D1有三个副本,D1-1、D1-2、D1-3分布在不同节点上,正常情况下客户端写数据可以三个副本都复制成功,客户端读取任一副本可以得到最新更新的值;但当出现网络分区时,副本之间出现数据不可达,导致副本D1-3数据和另外两个副本不一致,这样不同客户端可以读取不同副本数据(或做故障转移),但不可以保障副本的一致性,就出现了一致性问题。

如何以CPA原理实现架构设计呢?

总的来说,在分布式系统下P是基础,需要在CA中找平衡,且这两者也不是百分百的。

比如虽然很多人认为单机系统是满足CA的,但是P不是简单的分布式网络上的节点,也有可能是多个协作的任务,任务之间是异步的,如果要求强一致性,那必然是同步的,但在数据未达成一致性时是不能对外提供服务的,也就不满足A了。

那么有没有100%的A呢?

要求任何情况下不出现问题其实是很难实现的,基本不存在,我们说的可用性是相对于容错性来说,容错率低、故障恢复时间快在某个领域下的一个可承受的阈值。

所以对于CAP理论的使用,不是简单的字面之间的权衡,非此即彼,而是要当做一种分布式系统设计的指导思想,需要更动态的看待自己的系统。

比如一个分布式系统是多服务、多模块的,涉及到计算服务与存储服务,在面对网络分区时,可以通过降级、预案等手段实现细粒度的A、C的取舍,而不是简单、整体的对外反映系统整体的服务、数据维度的响应结果。

以中间件处理脑裂情况为例:

  • T1时刻,一切正常,两个节点都是S状态;

  • T2时刻,出现网络分区,导致两个节点状态出现S1、S2的分歧;

  • T3时刻,网络分区恢复,依据脑裂处理算法,两个节点达成最终状态S`;

正是因为CAP原理不能简单的适用于所有分布式系统场景,所以在分布式系统领域,还有其他一些理论做细化处理。

ACID

  • A:原子性,一个事务要么成功要么失败;

  • C:一致性,在事务开始前和事务结束后,数据满足一致性约束(这里是逻辑上的一致性,不是CAP里面的数据维度的一致性);

  • I:隔离性:如果多个事务同时发生,不应该互相影响;

  • D:持久性:当事务提交之后,对于整个系统来说,这次更新将是持久的;

ACID一般用在关系数据库的事务原则上。

BASE

  • BA:基本可用,分布式系统大部分时间是可用的,而不是百分百可用,允许偶尔的失败,相比于CAP的A来说,BA更符合真实场景;

  • S:软状态,分布式系统中的数据副本之间存在一个中间状态,也就是允许一部分数据副本是新的,一部分是老的,其实大部分中间件的副本都属于这种情况,副本之间存在延迟;

  • E:最终一致性,副本之间存在一致性延迟,但最终会变成数据一致的,这个往往是对外承诺的时间;

BASE和ACID可以认为是对于CAP的细化,让技术选型多了参考:

  • CA的选型一般对应ACID原则,针对于关系型数据库等;

  • AP的选型对应BASE原则,一般适用于存储型中间件,因为多副本是必须的,但副本同步是有延迟的,但最终会是数据一致的的;

  • CP的选型在分布式系统下暂时还没发现,正如上面说的,不会有人在分布式系统下只做一个副本吧,有人说Spanner是CP,可能仅仅是因为他的可用性太高,TiDB貌似也是CP系统,但感觉是一种障眼法,不让你读到错误的数据不就行了;

### 级标题:CAP定理的取舍及其在分布式系统中的应用 CAP定理指出,在一个分布式系统中,Consistency(一致性)、Availability(可用性)和Partition tolerance(分区容错性)者最多只能满足其中的两个,无法同时全部实现。一致性要求所有节点在同一时间看到相同的数据视图,可用性意味着每个请求都能在合理时间内收到响应,而分区容错性则保证系统在部分节点或网络分区失效时仍能继续运行[^1]。 在实际系统中,由于网络故障是不可避免的,因此大多数现代分布式系统都必须优先考虑分区容错性[^5]。这就意味着系统必须在一致性和可用性之间做出择。例如,对于高并发、大规模部署的互联网服务,通常会择牺牲强一致性,以保证系统的高可用性,这类系统倾向于采用最终一致性模型。相反,在对数据一致性要求极高的金融系统中,即使牺牲可用性,也必须保证数据的一致性[^5]。 为了在设计分布式系统时做出合理取舍,可以参考以下策略: - **CP 系统(一致性 + 分区容错性)**:这类系统在面对网络分区时,优先保证数据的一致性,可能会拒绝部分请求以避免数据不一致。例如,ZooKeeper 和 HBase 是典型的 CP 系统。 - **AP 系统(可用性 + 分区容错性)**:这类系统在面对网络分区时,优先保证服务的可用性,可能会返回旧数据或不一致的数据。例如,Cassandra 和 DynamoDB 是 AP 系统的代表。 - **CA 系统(一致性 + 可用性)**:这类系统在没有网络分区的前提下可以同时保证一致性和可用性,但一旦出现网络分区,就无法正常运行。这类系统通常用于单机或局域网环境,如传统的关系型数据库 MySQL[^4]。 例如,一个电商系统的商品库存服务,在高并发场景下,可能更倾向于采用 AP 模型,以确保用户始终可以下单,即使库存数据在短时间内存在不一致;而在支付系统中,必须采用 CP 模型,以确保交易数据的强一致性。 ```java // 示例:模拟一个简单的 CP 系统行为 public class DistributedSystem { private boolean isPartitioned = false; private int data = 0; public synchronized void writeData(int value) { if (isPartitioned) { throw new RuntimeException("System is partitioned, write operation denied."); } data = value; } public synchronized int readData() { return data; } public void simulatePartition(boolean isPartitioned) { this.isPartitioned = isPartitioned; } } ``` 在上述代码中,当系统检测到网络分区时,写操作将被拒绝,以保证数据一致性,体现了 CP 系统的设计理念。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值