***这是我参与「第五届青训营 」笔记创作活动的第9天 ***
事务到分布式理论
理解第一个问题就是"事务"
事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。
简单地说,事务提供一种“ 要么什么都不做,要么做全套(All or Nothing) ”机制。
二、ACID理论
事务是基于数据进行操作,需要保证事务的数据通常存储在数据库中,所以介绍到事务,就不得不介绍数据库事务的ACID特性,指数据库事务正确执行的四个基本特性的缩写。包含:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
(1)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
例如:银行转账,从A账户转100元至B账户:
A、从A账户取100元
B、存入100元至B账户。 这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
(2)
在事务开始之前和事务结束以后,数据库数据的一致性约束没有被破坏。
例如:现有完整性约束A+B=100,如果一个事务改变了A,那么必须得改变B,使得事务结束后依然满足A+B=100,否则事务失败。
(3)
数据库允许多个并发事务同时对数据进行读写和修改的能力,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
例如:现有有个交易是从A账户转100元至B账户,在这个交易事务还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
(4)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
本地事务ACID实际上可用”统一提交,失败回滚“几个字总结,严格保证了同一事务内数据的一致性!
而分布式事务不能实现这种。因为有CAP理论约束。接下来我们来了解一下,分布式中是如何保证以上特性的,那么就有了一个著名的CAP理论。
三、CAP理论
在设计一个大规模可扩放的网络服务时候会遇到三个特性:一致性(consistency)、可用性(Availability)、分区容错(partition-tolerance)都需要的情景.
CAP定律说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时得到满足,最多满足两个。
如上图,CAP的三种特性只能同时满足两个。而且在不同的两两组合,也有一些成熟的分布式产品。
接下来,我们来介绍一下CAP的三种特性,我们采用一个应用场景来分析CAP中的每个特点的含义。
该场景整体分为5个流程:
流程一、客户端发送请求(如:添加订单、修改订单、删除订单)
流程二、Web业务层处理业务,并修改存储成数据信息
流程三、存储层内部Master与Backup的数据同步
流程四、Web业务层从存储层取出数据
流程五、Web业务层返回数据给客户端
(1) 一致性Consistency
“all nodes see the same data at the same time”
一旦数据更新完成并成功返回客户端后,那么分布式系统中所有节点在同一时间的数据完全一致。
在CAP的一致性中还包括强一致性、弱一致性、最终一致性等级别,稍后我们在后续章节介绍。
一致性是指写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点上,从任意结点读取到的数据都是最新的状态。
一致性实现目标:
- Web业务层向主Master写数据库成功,从Backup读数据也成功。
- Web业务层向主Master读数据库失败,从Backup读数据也失败。
必要实现流程:
写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁,以免在新数据写入成功后,向从数据库查询到旧的数据。
分布式一致性特点:
- 由于存在数据同步的过程,写操作的响应会有一定的延迟。
- 为了保证数据一致性会对资源暂时锁定,待数据同步完成释放锁定资源。
- 如果请求数据同步失败的结点则会返回错误信息,一定不会返回旧数据。
(2) 可用性(Availability)
“Reads and writes always succeed”
服务一直可用,而且是正常响应时间。
对于可用性的衡量标准如下:
可用性实现目标:
- 当Master正在被更新,Backup数据库接收到数据查询的请求则立即能够响应数据查询结果。
- backup数据库不允许出现响应超时或响应错误。
必要实现流程:
- 写入Master主数据库后要将数据同步到从数据库。
- 由于要保证Backup从数据库的可用性,不可将Backup从数据库中的资源进行锁定。
- 即时数据还没有同步过来,从数据库也要返回要查询的数据,哪怕是旧数据/或者默认数据,但不能返回错误或响应超时。
分布式可用性特点:
所有请求都有响应,且不会出现响应超时或响应错误。
(3) 分区容错性(Partition tolerance)
“the system continues to operate despite arbitrary message loss or failure of part of the system”
分布式系统中,尽管部分节点出现任何消息丢失或者故障,系统应继续运行。
通常分布式系统的各各结点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致结点之间通信失败,此时仍可对外提供服务。
分区容错性实现目标:
- 主数据库向从数据库同步数据失败不影响读写操作。
- 其一个结点挂掉不影响另一个结点对外提供服务。
必要实现流程:
- 尽量使用异步取代同步操作,例如使用异步方式将数据从主数据库同步到从数据,这样结点之间能有效的实现松耦合。
- 添加Backup从数据库结点,其中一个Backup从结点挂掉其它Backup从结点提供服务。
分区容错性特点:
分区容忍性分是布式系统具备的基本能力。
四、CAP的”3选2“证明
(1) 基本场景
在小结中,我们主要介绍CAP的理论为什么不能够3个特性同时满足。
如上图,是我们证明CAP的基本场景,分布式网络中有两个节点Host1和Host2,他们之间网络可以连通,Host1中运行Process1程序和对应的数据库Data,Host2中运行Process2程序和对应数据库Data。
(2) CAP特性
如果满足一致性(C):那么Data(0) = Data(0).
如果满足可用性(A): 用户不管请求Host1或Host2,都会立刻响应结果。
如果满足分区容错性(P): Host1或Host2有一方脱离系统(故障), 都不会影响Host1和Host2彼此之间正常运作。
(3) 分布式系统正常运行流程
如上图,是分布式系统正常运转的流程。
A、用户向Host1主机请求数据更新,程序Process1更新数据库Data(0)为Data(1)
B、分布式系统将数据进行同步操作,将中的同步的Host2中`Data(0),使中的数据也变为
C、当用户请求主机时,则Process2则响应最新的数据
根据CAP的特性:
- 和的数据库
Data之间的数据是否一样为一致性(C) - 用户对和的请求响应为可用性(A)
- 和之间的各自网络环境为分区容错性(P)
当前是一个正常运作的流程,目前CAP三个特性可以同时满足,也是一个理想状态,但是实际应用场景中,发生错误在所难免,那么如果发生错误CAP是否能同时满足,或者该如何取舍?
(4) 分布式系统异常运行流程
假设和之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性(P),能不能同时满足一致性(C)和可用响应性(A)呢?
假设在N1和N2之间网络断开的时候,
A、用户向发送数据更新请求,那中的数据将被更新为
B、弱此时和网络是断开的,所以分布式系统同步操作将失败,中的数据依旧是
C、有用户向发送数据读取请求,由于数据还没有进行同步,没办法立即给用户返回最新的数据V1,那么将面临两个选择。
第一,牺牲数据一致性(c),响应旧的数据给用户;
第二,牺牲可用性(A),阻塞等待,直到网络连接恢复,数据同步完成之后,再给用户响应最新的数据。
这个过程,证明了要满足分区容错性(p)的分布式系统,只能在和两者中,选择其中一个。
(5) "3选2"的必然性
通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?
CA 放弃 P:
一个分布式系统中,不可能存在不满足P,放弃,即不进行分区,不考虑由于网络不通或结点挂掉的问题,则可以实现一致性和可用性。那么系统将不是一个标准的分布式系统。我们最常用的关系型数据就满足了CA,如下:
主数据库和从数据库中间不再进行数据同步,数据库可以响应每次的查询请求,通过事务(原子性操作)隔离级别实现每个查询请求都可以返回最新的数据。
注意:
对于一个分布式系统来说。P是一个基本要求,CAP三者中,只能在CA两者之间做权衡,并且要想尽办法提升P。
CP 放弃 A
如果一个分布式系统不要求强的可用性,即容许系统停机或者长时间无响应的话,就可以在CAP三者中保障CP而舍弃A。
放弃可用性,追求一致性和分区容错性,如Redis、HBase等,还有分布式系统中常用的Zookeeper也是在CAP三者之中选择优先保证CP的。
场景:
跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。
AP 放弃 C
放弃一致性,追求分区容忍性和可用性。这是很多分布式系统设计时的选择。实现AP,前提是只要用户可以接受所查询的到数据在一定时间内不是最新的即可。
通常实现AP都会保证最终一致性,后面讲的BASE理论就是根据AP来扩展的。