CAP理论


CAP原则.

CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼,最多只能满足两个,要么AP,要么CP,要么AC,但是不存在CAP。

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)

  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)

  • 分区容错性(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

NoSQL数据库按CAP分类(AP、CP、AC).
  • CA :单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。(传统Oracle数据库)
  • CP:满足一致性、分区容错性的系统,通常性能不是特别高。(大多数网站架构的选择)
  • AP:满足可用性、分区容错性的系统,通常可能对一致性要求低一些。(redis、mongodb)

一般分布式系统,必须保证某台服务器宕机或某个服务挂掉,不影响整个系统的正常运行与服务提供,因此必须P(分区容错性),那么也就是说还有一个元素必须从C、A中选择,最终分布式系统方案就只有两种情况:

  • AP

    • 示例
      • 银行转账(多少时间后到账)
      • 网上购物(预售、库存量不是真实商品量)
  • CP

    • 示例

      • 火车站购票(每时每刻,余票需准确无误)
CAP权衡.

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证AP,舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到造成用户流程的严重程度。

对于涉及到钱财这样不能有一丝让步的场景,C必须保证。网络发生故障宁可停止服务,这是保证CA,舍弃P。貌似这几年国内银行业发生了不下10起事故,但影响面不大,报到也不多,广大群众知道的少。还有一种是保证CP,舍弃A。例如网络故障事只读不写。

BASE理论 – 牺牲强一致性获取高可用性.

BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)

基本可用.

基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用

电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

软状态.

软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

最终一致性.

最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

分布式系统.

由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在不同的平台上。如:PC、工作站、局域网和广域网上等。

1)分布式:不同的多台服务器上面部署不同的服务模块(工程),他们之间通过 RPC 或 RMI之间通信和调用,对外提供服务和组内协作。

2)集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。

扩展:传统数据库 ACID – 追求一致性.

原子性(Atomicity).

事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功。

一致性(Consistency).

数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

隔离性(Isolation).

指并发的事务之间不会相互影响,一个事务要访问的数据正在被另一个事务修改,那么在另一个事务提交之前,看到的数据是未改变的。

持久性(Durability).

持久性是指事务提交后,他所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

参考:https://www.cnblogs.com/it-taosir/p/9892801.html、https://my.oschina.net/foodon/blog/372703


文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
RestTemplate的getForObject和getForEntity RestTemplate的getForObject和getForEntity
getForObject 和 getForEntity区别 getForObject 返回一个对象,这个对象更具具体传入类型决定(不含响应头,体信息) getForEntity 返回对象为ResponseEntity对象,包含了
2021-01-24
下一篇 
向consul中注册服务,无法通过健康检查:server checks failing 向consul中注册服务,无法通过健康检查:server checks failing
问题如下图所示. 服务配置的都没有出错,以下是配置文件信息. consul服务不在本机上,consul所需依赖是导入成功的. 查看检查信息,发现是 localhost:8006拒绝连接.http://192.168.111.88:8500
2021-01-24
  目录