分布式与并发【一】浅谈分布式ACID与CAP/BASE理论

前言

由于工作中比较忙,好久没有梳理一下自身的知识体系,正好在公司OKR时规划了一下个人能力和影响力的提升,所以准备系统性回顾一下分布式相关的知识,整理成文档分享给大家。

一、分布式的特点

分布性: 一个分布式的系统中,所有的计算机可以任意分布在不同的地方,可能会在不同的城市和机房。

对等性:分布式中的所有机器没有主从之分,并没有一个中心节点主机来控制,每个机器都是主机,都可以处理来自外部的请求,相当于一个副本的概念,当某台机器因为网络或物理原因宕机后不会对对外提供的整个服务造成影响。

并发性:由于分布式系统中所有主机都可以处理请求,那么就会出现并发请求(这里指数据更新操作)的情况,多个客户端同时处理一个共享的资源比如数据库,可能会导致各个机器节点数据的不一致情况产生。

缺乏全局时钟:一系列在空间上任意分布的计算机组成分布式系统,因此在很难定义两个事件的前后顺序,原因就在于缺少一个全局时钟序列控制。

故障总是会发生:由于分布式系统由多台机器构成,每台机器都可能会各种类型发生故障。

二、事务ACID理论

1.什么是事务:

通常由一系列对系统数据进行获取和更新的操作组成,一般来说事务指的是数据库事务,事务可以通过一种隔离机制,来区分各个操作进行互相干扰,并提供一种恢复策略,保证数据库在异常情况下仍然保持数据一致性。
在工作中,通常使用一个本地事务来保证本地数据库的多次操作,要么都执行成功要么都执行失败。

2.ACID理论

  • A(Atomicity)原子性:

事务的原子性是指一个事务必须是一个原子的的操作,事务中所包含的所有操作在一次事务执行过程中,要么全部成功,要么全部失败。不允许出现部分成功或部分失败的状态。

简单说,原子性提供了一个rollback回滚的功能,在Mysql Innodb中,主要通过undo log和redo log来实现,每一条对数据库进行更新的操作,都会记录一条相反操作的日志记录在undoLog中,当事务发生回滚时,从undoLog读取日志进行恢复。同时还会记录一条在redoLog中,一但事务被提交则持久化到磁盘上。

  • C(Consistency)一致性:

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前和执行后,数据库必须处于一致性状态,因此只有当数据库只包含成功事务提交的结果时,就能说明数据库处于一致性状态。

数据库的一致性是最重要的,总体讲AID都是为了最终保证C而出现的,比如说一个事务中只有部分成功,则数据库是不一致状态(违背原子性),多个并发数据操作互相干扰(违背隔离性),数据库宕机丢失数据(违背持久性)。

  • D(Durability)持久性

事务的持久性是指一个事务一但被提交,该事务对数据库数据的状态变更就是永久的,即使数据库发生崩溃或者宕机,只要数据库能够被重新启动那么一定能够恢复到事务成功结束时的状态。

  • I(Isolation)隔离性

事务的隔离性是比较重要的一点,也是实际中最常考虑的一点。
事务的隔离性是指在并发数据库事务操作中,将并发事务隔离起来互不影响,每个事务都有各自的数据空间。

在标准的SQL规范中,定义了四个隔离级别,不同的隔离级别对事务的并发影响不同,在实际工作中根据业务的容忍度来选择隔离级别,从低到高分别为:读未提交,读已提交,可重复读,串行化。

  1. 读未提交 (read-uncommitted):
    读未提交是隔离级别中最弱的一种,并发事务进行时,一个事务执行时可以看到其他未执行完成的事务数据。例如,事务A将一个字段X数字从1累加到10,另一个事务B执行时读取该数据能够看到所有变更值(1.2.3.4…),这时事务B的读取操作称之为读未提交。

  2. 读已提交 (read-committed):
    读已提交和读未提交比较接近,读已提交只能够读取已经提交事务的数据,以上一个例子为例,事务B在读取数据时,只能够读取事务A提交事务后的值10,无法获取到中间值。但是如果有另一个事务C正在执行从10累加到20的数据,此时事务B也可以读取到值为20。

  3. 可重复读(repeatable-read):
    可重复读是数据库默认的隔离级别,可以保证事务在处理过程中,多次读取数据返回的值一致,因此该隔离级别杜绝了脏读与不可重复读,但是无法避免幻读,幻读是指在同样的事务操作时(不是一个事务请求,只是同样的事务操作),前后对同一个数据的读取值不一致。
    以上面的例子来说,可重复度当事务B开始时读取数据为1,那么整个事务过程中重复读取数据还是为1,而另一个事务B采用同样的查询方式,可能读到10或20。

  4. 串行化(serializable):
    串行化为最严格的隔离级别,要求所有的事务排队串行执行,不可并发执行。

在这里插入图片描述

三、分布式CAP理论

1.分布式事务

通过上面讲解的ACID,对数据库事务相关知识应该有了比较好的理解,下面简单说下分布式事务。
可以发现当使用一个单机的数据库时,可以很好的通过ACID来控制事务的执行,但是当前绝大多数的服务和数据库都是通过分布式来进行工作与部署的,那么如何保证不同节点的事务操作呢。

例如:一个商城平台购买一件商品时,需要扣件库存并生成订单,如果扣库存失败,但是订单生成成功,则会出现超卖情况。
假设库存数据表与订单数据表存在两个数据库中,是一个分布式的服务。那么如何保证二者的事务操作,此时需要分布式事务来进行处理。为了解决分布式事务出现了CAP理论。

2.CAP理论

CAP理论深刻影响了分布式的发展,CAP理论告诉我们,一个分布式系统不可能同事满足一致性、可用性、分区容错性这三个基本需求,最多只能满足两项,需要使用者进行取舍。
此时的CAP与CAID不是一个概念。

  • C(Consistency)一致性:

在分布式环境中,保证数据在多个副本中的一致性,当一个系统在数据一致性状态下更新操作后,仍然保持一致性。

对于分布在不同节点上的数据副本来说,如果对第一个节点数据更新后,其他节点数据未同步更新,则会造成在后续获取数据时为脏数据,这时就无法满足一致性,如果对对一个节点数据更新后,后续的任何操作在任何节点都能读取到最新数据,则系统被认为具有强一致性。

  • A(Availability)可用性:

可用性是只,针对客户端的请求,系统所提供的服务在有限时间内一定能够返回一个结果。

有限的时间内就是服务处理请求不能超过一个指定的时间(不能出现timeout),如果请求超时则认为系统是不可用的,返回结果则是明确返回一个成功或失败的结果。
例如,如果要保证强一致性,那么势必要等待所有副本同步数据完成,那么在同步的阶段系统则处于不可用状态。

  • P(Partition tolerance)分区容错性:

分区容错性是指,当遇到网络分区状况时,任然能够对外提供满足一致性和可用性的服务,除非整个网络发生故障。

分区容错性是分布式体系中的基本,因为网络分区是实际中无法避免的。
网络分区是指分布式系统节点分布在不同地区或者机房,当子网络(部分子节点构成的网络)发生网络异常无法进行互相通信时,整个分布式网络被划分为多个独立区域。

PS:其实就我个人而言,很难将分区容错性和可用性区分开来,好像理解了又好像差一点,个人感觉一个分布式系统天然就是保证分区容错性的,比如当节点A挂掉后,可以通过节点B来进行服务的持续提供,而如果只有一个节点A,则就可保证CA同时满足,那么A挂了整个服务也就挂掉了

在这里插入图片描述

四、分布式BASE理论

BASE理论其实是对CAP理论的一个权衡的结果,代表 Basically Available(基本可用),Soft state (软状态)和 Eventually consistent(最终一致性)三个特点。

  • ** Basically Available(基本可用)**

是指系统在遇到某些不可预知故障时,损失某些功能,但是仍然是可用状态的。
比如,客户端请求访问结果返回时间延长,但是确定可以返回结果。在双十一这种热门活动时刻,对部分用户进行限流降级等来缓解系统压力。

  • ** Soft state (软状态)**

软状态是指,允许系统存在一个中间状态的数据,并且该中间状态不影响系统的可用性,即允许系统在不同节点的数据副本同步时延长同步时间。

  • Eventually consistent(最终一致性):

最终一致性是指,不需要保证系统的强一致性,而允许部分节点在经过一段时间的同步后最终达到一致性的结果状态。

强一致性:是指所有系统全部同步完成后保证数据一致,不允许其中节点同步延后。
最终一致性:最终一致性又分为多种

  1. 因果一致性(Causal consistency)
    因果一致性指的是:如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。于此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。

  2. 读己之所写(Read your writes)
    读己之所写指的是:节点A更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。算是特殊的一种因果一致性。

  3. 会话一致性(Session consistency)
    会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现 “读己之所写” 的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。

  4. 单调读一致性(Monotonic read consistency)
    单调读一致性指的是:如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值。

  5. 单调写一致性(Monotonic write consistency)
    单调写一致性指的是:一个系统要能够保证来自同一个节点的写操作被顺序的执行。

五、总结

文章中全面的介绍了事务、事务ACID特性,以及分布式事务和CAP、BASE理论。
其中BASE理论面向的是大型高可用可扩展的分布式系统,和传统的ACID相反,不保证强一致性,而是通过最终一致性来提供高可用服务。

参考文献:
【1】从Paxos到Zookeeper 分布式一致性原理与实践
本文绝大部分参考该书,有兴趣的读者,可以读下此书,强烈推荐。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读