分布式事务解决方案框架(LCN)

948 阅读12分钟

前言 

也不知道新的一年该跟大家分享哪些技术好呢,由于最近有不少同事问起我关于分布式事务如何解决的方案,在这里我将使用迭代更新的方式把我所理解的分布式事务和解决方案分享给大家吧,但愿能够帮助到大家. 

事务

事务的定义

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务。

事务的作用及特性

  • 当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作相互干扰。

  • 事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持数据一致性的方法

       事务具有四个特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性        (Isolation)和持久性(Durability),简称为事务的ACID特性。

 ACID

原子性

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,要么全部执行,要么全部不执行

任何一项操作失败都将导致整个事务失败,同时其他已经被执行的操作都将被撤销并回滚。只有所有的操作全部成功,整个事务才算是成功完成。

一致性

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库都必须处于一致性状态。换句话说,事务的执行结果必须是使数据库从一个一致性状态转变到另一个一致性状态。

举个例子

支付宝转账操作就是一个事务。假设小明和小红原来支付宝金额都有100元。此时小明转账给小红50元,转账结束后,应该是小明支付宝金额减去50元变成50元,小红支付宝金额增加50元变成150元。小明和小红的支付宝金额总和还是200元。转账前后,数据库就是从一个一致性状态(小明100元,小红100元,小明、小红共200元)转变到另一个一致性状态(小明50元,小红150元,小明、小红共200元)。假设转账结束后只扣了小明的支付宝金额,没有增加小红支付宝金额,这时数据库就处于不一致的状态。

隔离性

事务的隔离性是指在并发环境中,并发的事务是相互隔离的,事务之间互不干扰

在标准的SQL规范中,定义的4个事务隔离级别,不同隔离级别对事务的处理不同。4个隔离级别分别是:未授权读取、授权读取、可重复读取和串行化。

下表展示了不同隔离级别下事务访问数据的差异

隔离级别脏读可重复读幻读
未授权读取存在不可以存在
授权读取不存在不可以存在
可重复读取不存在可以存在
串行化不存在可以不存在

以上4个级别的隔离性依次增强,分别解决不同的问题。事务隔离级别越高,就越能保证数据的完整性和一致性,但同时对并发性能的影响也越大

通常,对于绝大多数的应用来说,可以优先考虑将数据库系统的隔离级别设置为授权读取,这能够在避免脏读的同时保证较好的并发性能。尽管这种事务隔离级别会导致不可重复读、幻读和第二类丢失更新等并发问题,但较为科学的做法是在可能出现这类问题的个别场合中,由应用程序主动采用悲观锁或乐观锁来进行事务控制。

持久性

事务的持久性又称为永久性,是指一个事务一旦提交,对数据库中对应数据的状态变更就应该是永久性的。即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束时的状态。

综上所述,就是所谓的ACID.

CAP定理

CAP定理

一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能满足其中的两项

一致性

在分布式环境中,一致性是指数据在多个子系统之间是否能够保持一致的特性(这点跟ACID中的C含义不同)。

对于一个将同一个数据分布在不同节点上的分布式系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是更新前的数据(称为脏数据),这就是典型的分布式数据不一致情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都能读取到最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性)。

举一个12306上面的例子,记得在几年前我在12306上面注册了一个账号,但是用户名和身份证号并不匹配.然后去寻求相关的工作人员将账号成功注销了.然后我又在12306上注册一个符合规则要求的账号,手机号依旧没变,但是提示手机号被之前的用户名占用,但是当我换一个手机号的时候,却发现注册成功了.在没注销账号之前提示的身份证号被占用.现在我们假设,如果注册模块与注销模块为两个子系统的话,在注销过程中未能实现事务回滚(这个会在2PC章节介绍分布式事务的回滚讲到),那么是不是意味着在注册的时候出现了所谓的脏数据呢.未能实现期望中的强一致性呢.

可用性

可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间返回结果,如果超过了这个时间范围,那么系统就被认为是不可用的。

『有限的时间内』是一个在系统设计之初就设定好的运行指标,不同的系统会有很大的差别。比如对于一个在线搜索引擎来说,通常在0.5秒内需要给出用户搜索关键词对应的检索结果。

『返回结果』是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出对请求的处理结果,及成功或失败,而不是一个让用户一直等待下去(这个会再之后的服务治理中介绍到)。

分区容错性

分区容错性要求一个分布式系统需要具备如下特性:分布式系统在遇到任何网络分区故障的时候,仍然能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了宕机。

网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域

以上就是对CAP定理中一致性、可用性和分区容错性的讲解。

既然一个分布式系统无法同时满足上述三个要求,而只能满足其中的两项,因此在对CAP定理应用时,我们就需要抛弃其中的一项,下表是抛弃CAP中任意一项特性的场景说明。

CAP说明
放弃P如果希望能够避免系统出现分区容错性问题,一种较为简单的做法是将所有的数据(或者仅仅是哪些与事务相关的数据)都放在一个分布式节点上。这样做虽然无法100%保证系统不会出错,但至少不会碰到由于网络分区带来的负面影响。但同时需要注意的是,放弃P的同时也就意味着放弃了系统的可扩展性
放弃A一旦系统遇到网络分区或其他故障或为了保证一致性时,放弃可用性,那么受到影响的服务需要等待一定的时间,因此在等待期间系统无法对外提供正常的服务,即不可用
放弃C这里所说的放弃一致性,实际上指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时的一致性,但是能够承诺的是,数据最终会达到一个一致的状态

需要明确的一点是:对于一个分布式系统而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓的分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要面对和解决的问题。因此系统架构师往往需要把精力花在如何根据业务特点在C(一致性)和A(可用性)之间寻求平衡

BASE理论

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

基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用。一下就是两个"基本可用"的例子。

响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒。

功能上的损失:正常情况下,在一个电子商务网站(比如淘宝)上购物,消费者几乎能够顺利地完成每一笔订单。但在一些节日大促购物高峰的时候(比如双十一、双十二),由于消费者的购物行为激增,为了保护系统的稳定性(或者保证一致性),部分消费者可能会被引导到一个降级(这个会在之后的服务治理中讲到)页面

软状态

软状态是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同的数据副本之间进行数据同步的过程存在延时。这个跟RocketMQ异步刷盘概念很像.

最终一致性

最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

2PC

待更新中.....

3PC

待更新中.....

分布式事务解决框架LCK分布式解决方案的方法相关代码

待更新中.....



参考资料 

《从Paxos到ZooKeeper——分布式一致性原理与实践》