分布式开发(一)---CAP理论

传统数据库(关系型数据库)设计遵循ACID规则,分布式系统设计也有对应的CAP理论。

一、ACID

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。

1、原子性(Atomicity)

原子性是指一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

例子

比如,银行转账,从账号A扣钱,给账号B加钱,这两个操作必须同时进行。转账包含两个步骤:

A:1000 - 200 = 800
B:300 + 200 = 500

原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作。否则就会出现账目对不上的情况。


2、一致性(Consistency)

一致性是指一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

通俗点说就是事务执行后必须是从一个一致性状态转到另一个一致性状态。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

例子
还是以银行转账场景为例。
假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元。


3、隔离性(Isolation)

隔离性是指数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

扫描二维码关注公众号,回复: 15556347 查看本文章

隔离性意味着多个并发之间是不可见的,相互隔离不被打扰。如果不考虑隔离性,可能会出现下面的问题:

  • 脏读:事务T1读取了事务T2未提交的数据,结果事务T2回滚了,T1拿到了一个脏数据。
  • 不可重复读:事务T1读取数据后,紧接着事务T2就更新了数据,事务T1再次读取的时候发现数据不一致了。
  • 幻读:这种一般发生在大批量修改的时候,比如事务T1把所有的数据从1修改到了2,结果修改的过程中,事务T2插入了一条新数据1。最后检查数据发现有一条数据没有修改过来。

针对上面的问题,数据库提供了4种事务的隔离级别:由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

                                                 √为会发生,×为不会发生

  脏读 不可重复读 幻读
Read uncommitted (读未提交)
Read committed (读已提交) ×
Repeatable read (可重复读) × ×
Serializable (串行化) × × ×

其中Read uncommitted 最低级别,任何情况都无法保证。


4、持久性(Durability)

持久性是指在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
通俗点说就是事务提交后,保存的结果就不变了。即使数据库发生故障也不应该对其有任何影响。

二、CAP

1、CAP概述

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:Consistency、Availability、Partition tolerance 它们的第一个字母分别是 C、A、P。
Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

一致性(Consistency)

一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。

在分布式中一致性又包括强一致性弱一致性,强一致性就是指在任何时刻任何节点看到的数据都是一样的;弱一致性一般实现是最终一致性,即刚开始可能存在差异,但随着时间的推移,最终数据保持一致。

可用性(Availability)

可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。

分区容错性(Partition tolerance)

分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

通俗点说就是在网络节点之间无法通信的情况下, 节点被隔离,产生了网络分区, 整个系统仍然是可以工作的。

2、CAP的取舍策略

CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。传统的关系型数据库RDBMS:Oracle、MySQL就是CA。

所以,对于一个分布式系统来说。P是一个基本要求,CAP三者中,只能在CA两者之间做权衡

CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。

 AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。

孰优孰略,没有定论,只能根据场景定夺,适合的才是最好的。

三、BASE理论

eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

猜你喜欢

转载自blog.csdn.net/icanlove/article/details/117511483