CAP原理
任何一个分布式系统,只能满足CAP三个中的两个
CAP分别是什么
Consistency 一致性
一致性
"all nodes see the same data at the same time"两个视角
客户端:多并发访问时更新过的数据如何获取;
服务端:如何复制分布到整个系统,保证数据最终一致性三种一致性策略
强一致性:对于关系型数据库,更新过的数据能立即被后续访问看到
弱一致性:能容忍后续部分或全部访问不到
最终一致性:如果经过一段时间后要求能访问到更新后的数据
CAP理论说不能同时满足的一致性指的是强一致性
Availability 可用性
"Reads and writes always succeed",服务一直可用
每一个可用性的分布式系统,每一个非故障节点必须对每一个请求作出响应。
一般衡量一个系统的可用性通过停机时间来计算。
5个9:可用水平99.999%
Partition Tolerance 分区容错性
"the system continues to operate despite arbitrary message loss or failure of part of the system",分布式系统在遇到某节点或者网络分区故障时,仍然能够对外提供满足一致性和可用性服务。
简单来说,就是在网络中断,消息丢失的情况下,系统依然能够正常工作。
CAP权衡
CA without P
- 不存在,网络分区是必然的,舍弃P意味着舍弃分布式系统
CP without A
一个分布式系统容许系统停机或者长时间无响应,舍弃A保C
一旦发生网络故障或者消息丢失,牺牲用户体验,等待所有数据全部一致后才可以访问
最典型的,分布式数据库。一致性是最基本最重要的条件
分布式存储系统Redis,HBase,分布式协调组件Zookeeper
AP without C
为了保证高可用,需要在用户访问时可以马上得到返回,每个节点只能用本地数据库提供服务,这样会导致全局数据的不一致性
大多数大型互联网应用,由于主机众多,部署分散,集群规模大,因此节点故障、网络故障是常态,需要保证可用性,牺牲一点强一致性,不会造成严重的用户流失
比如:淘宝的购物,12306的买票。这里牺牲的是强一致性
怎么取舍
没有定论,根据场景定夺,适合的才是最好的。
一般,涉及到钱的必须保证C,网络故障宁可停止服务,保证CA,舍弃P
其他场景普遍做法是选择AP,舍弃强一致性,退而求其次保证最终一致性