【分布式基础】7.cap原则与base理论_左耳听风的博客
文章目录
1.CAP原则
C：一致性（Consistency）: 所有节点上的数据，时刻保持一致 A：可用性（Availability）：每个请求都能够收到一个响应，无论响应成功或者失败 P：分区容错 （Partition-tolerance）：表示系统出现脑裂以后，可能导致某些server与集群中的其他机器失去联系 CP / AP CAP理论仅适用于原子读写的Nosql场景，不适用于数据库系统（因为容错在数据库系统是不可能的！）
熟悉CAP的人都知道，三者不能共有，如果感兴趣可以搜索CAP的证明，在分布式系统中，网络无法100%可靠，分区其实是一个必然现象，如果我们选择了CA而放弃了P，那么当发生分区现象时，为了保证一致性，这个时候必须拒绝请求，但是A又不允许，所以分布式系统理论上不可能选择CA架构，只能选择CP或者AP架构。
对于CP来说，放弃可用性，追求一致性和分区容错性，我们的zookeeper其实就是追求的强一致。
对于AP来说，放弃一致性(这里说的一致性是强一致性)，追求分区容错性和可用性，这是很多分布式系统设计时的选择，后面的BASE也是根据AP来扩展。
2.BASE理论
基于CAP理论，CAP理论并不适用于数据库事务（因为更新一些错误的数据而导致数据出现紊乱，无论什么样的数据库高可用方案都是徒劳） ，虽然XA事务可以保证数据库在分布式系统下的ACID特性，但是会带来性能方面的影响；
eBay尝试了一种完全不同的套路，放宽了对事务ACID的要求。提出了BASE理论 （1）Basically available ： 数据库采用分片模式， 把100W的用户数据分布在5个实例上。如果破坏了其中一个实例，仍然可以保证80%的用户可用 （2）soft-state： 在基于client-server模式的系统中，server端是否有状态，决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。（比如支付，有个下单待支付的状态，这个就是软状态，直到异步回调更新支付状态） Server端承诺会维护client端状态数据，这个状态仅仅维持一小段时间, 这段时间以后，server端就会丢弃这个状态，恢复正常状态 （3）Eventually consistent：数据的最终一致性
BASE解决了CAP中理论没有网络延迟，在BASE中用软状态和最终一致，保证了延迟后的一致性。BASE和 ACID 是相反的，它完全不同于ACID的强一致性模型，而是通过牺牲强一致性来获得可用性，并允许数据在一段时间内是不一致的，但最终达到一致状态。
3.为什么不能同时满足CAP原则
3.1cap定义
Consistency (一致性)： “all nodes see the same data at the same time”,即更新操作成功并返回客户端后，所有节点在同一时间的数据完全一致，这就是分布式的一致性。一致性的问题在并发系统中不可避免，对于客户端来说，一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看，则是更新如何复制分布到整个系统，以保证数据最终一致。
Availability (可用性): 可用性指“Reads and writes always succeed”，即服务一直可用，而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务，不出现用户操作失败或者访问超时等用户体验不好的情况。
Partition Tolerance (分区容错性): 即分布式系统在遇到某节点或网络分区故障的时候，仍然能够对外提供满足一致性和可用性的服务。
分区容错性要求能够使应用虽然是一个分布式系统，而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了，其他剩下的机器还能够正常运转满足系统需求，对于用户而言并没有什么体验上的影响。
3.2证明例子
只能满足CA不能满足P的理解 用异地DB来举例。假如分别在A和B两地部署了DB。两个DB均能提供数据读写服务。对DB的要求是如果进行一个数据写入操作，必须是两地DB同时更新才能算成功。那么此时这个部署是满足C以及A，因为写入一个数据后，在两个结点是同时可以看到，而且在进行一个操作后，也是有成功的结果，所以同时满足CA。如果此时出现网络故障，那么CA是不能保证的，也就是说P的条件达不到。因此在这种情况只能满足CA不能满足P。 只能满足AP不能满足C的理解 还用异地DB来举例。此时对DB的要求改为操作其中一个DB成功就算成功，另一个DB会根据binlog之类的进行同步。那么此时这个部署是满足A以及P的，因为写入一个数据后，可以返回一个结果，同时当A地或者B地出现故障，不影响仍然能提供服务，所以同时满足AP，但是在进行一个操作后，因为同步的原因两边会出现短暂的数据不一致，这是无法满足C的，当AB两地出现网络故障时，数据的差异会增大，更加无法满足C。 只能满足CP不能满足A的理解 继续用异地DB来举例。此时对DB的要求是写数据时，必须同时写入到两个DB才能算成功，同时如果有一个写入失败，将停止写入操作的权限只提供读的操作。那么此时这个部署是满足C以及P的，因为写入一个数据后，在两个结点同时能看到，当出现网络故障时，将会停止写入操作权限只提供读取操作。那么CP是可以满足的而A是无法满足的。 当然在目前海量数据面前，往往会舍弃C，而保证AP，对与数据的一致性，只要求最终一致即可，在过程中是会出现差异的状况，比如在不同地方的人对某个新闻或者商品进行评论，在一定时刻内是不需要实时显示出来的，只要保证最终会出现即可。