说清楚ACID&CAP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说清楚ACID&CAP相关的知识,希望对你有一定的参考价值。

ACID

RDBMS关系型数据库遵循ACID原则:
A(Atomicity)原子性:事物内的操作要么完成,要么失败
C(Consistency)一致性:数据从一个一致性(正确的)状态迁移到另一个一致性(正确的)状态
I(Isolation)隔离性:并发事物之间互不影响
D(Durability)持久性:事物提交之后,它所做的修改将会永久保存在数据库

 

原子性和一致性的区别?

首先原子性并不能保证一致性。而其他三个属性都是为了保证一致性而发生的。
一致性是从一个正确的状态到另一个正确的状态;这个是从业务逻辑出发,希望最终结果是正确的。不是语法上的而是语义上的正取。
例如转账:A给B转钱,A的钱少了,而B的钱没有增加,这个时候是否不一致呢?
原子性是在同一个事物中保证要么失败或者成功,举例

当前事物1:A在存钱,+100;在这进行的同时,来了一个事物2
此时事物2:A在存在,+100;
我们期望的结果是A最终存钱+200;可是事物2却覆盖了事物1的结果,导致最终只存钱+100
但是两个事物都是成功的,所以原子性不能保证一致性;

为了保证并发事物下的一致性,所以有了隔离性:就是每个事物感受不到并发事物的存在,但需要保证每个事物看到的数据是一致的。实现隔离性,就是锁;
所以AID的存在和发生是为了保证最终的C,这个才是目的。

 

CAP

分布式系统CAP理论,最多只能满足其两点:
C(Consistency)强一致性:所有节点返回的数据都是一样的
如:从库和主库返回的数据都必须一致,就需要主库和从库同时更新数据,这样子会牺牲可用性。
A(Availability)可用性:每一个非故障节点,都能够对每一个请求做出相应
如:主库故障了,不能对外提供服务,而从库依然可以提供服务。
P(Partition tolerance)分区容错性:当系统中有节点因网络原因无法通行时,系统依然能正常运行
如:分布式有多个节点组成,其节点通过网络通信,而网络通信总是不可靠的。类似的主库和从库之间无法进行网络通信时,不能影响系统的正常运转


可用性和容错性的区别?

可用性是针对节点出现故障,系统可用;而分区容错性,是网络出现问题,系统可以用;一个是故障,一个是网络问题

 

为什么说CAP只能满足其二点,不能同时满足?

在分布式系统中,网络异常是避免不了的,除非节点间网络不发生故障,这是不可能的,除非是单机系统,所以只要是分布式系统肯定首先需要满足P分区容错性。在满足P的情况下只能在C和A之间进行取舍。

AP保证分区容错性和可用性:
为了保证A可用性,就一定不会有C一致性。

场景:当网络出现延迟,主mysql没有及时同步到从mysql,但是主从mysql依然能对外提供服务。牺牲了C一致性

CP保证分区容错性和一致性:
为了保证数据的一致性,就一定会牺牲A可用性。

场景:当网络出现延迟,主mysql没有及时同步到从mysql,为了保证数据的一致性就一定会等待同步完成才会返回,这个时候进行访问就一定会进行等待,就牺牲了A可用性

所以在开发分布式系统时,需要根据业务进行选择。

 

以上是关于说清楚ACID&CAP的主要内容,如果未能解决你的问题,请参考以下文章

ACID-CAP-2PC-3PC-Paxos​-分布式一致性算法

CAP向左,CAP向右,ACID和BASE理论

谈谈ACID以及CAP/BASE理论

ACID+CAP+BASE+Transaction(事务)

CAP BASE ACID

CAP BASE ACID