分布式理论
1.1分布式特征
一个标准的分布式系统在没有任何特定业务逻辑约束的情况下,都会有如下几个特征。
- 分布性
分布式系统中的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随
时变动。 - 对等性
分布式系统中的计算机没有主I从之分,既没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的。副本(Replica) 是分布式系统最常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。在常见的分布式系统中,为了对外提供高可用的服务,我们往往会对数据和服务进行副本处理。数据副本是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题最为有效的手段。另一类副本是服务副本,指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。 - 并发性
在“问题的提出“部分,我们已经提到过与“更新的并发性”相关的内容。在一个
计算机网络中,程序运行过程中的并发性操作是非常常见的行为,例如同一个分布
式系统中的多个节点,可能会并发地操作一些共享的资源,诸如数据库或分布式存
储等,如何准确并高效地协调分布式并发操作也成为了分布式系统架构与设计中最
大的挑战之一。 - 缺乏全局时钟
在上面的讲解中,我们已经了解到, 一个典型的分布式系统是由一系列在空间上随意分布的多个进程组成的,具有明显的分布性,这些进程之间通过交换消息来进行相互通信。因此, 在分布式系统中,很难定义两个事件究竟谁先谁后,原因就是因为分布式系统缺乏一个全局的时钟序列控制。关于分布式系统的时钟和事件顺序,
1.2 分布式环境的各种问题
分布式系统体系结构从其出现之初就伴随着诸多的难题和挑战,本节将向读者简要的介绍分布式环境中一些典型的问题。
- 通信异常
从集中式向分布式演变的过程中,必然引入了网络因素,而由千网络本身的不可靠性,因此也引入了额外的问题。分布式系统需要在各个节点之间进行网络通信,因此每次网络通信都会伴随着网络不可用的风险,网络光纤、路由器或是DNS 等硬件设备或是系统不可用都会导致最终分布式系统无法顺利完成一次网络通信。另外,即使分布式系统各节点之间的网络通信能够正常进行,其延时也会远大千单机操作。通常我们认为在现代计算机体系结构中,单机内存访问的延时在纳秒数量级(通常是! 0ns 左右),而正常的一次网络通信的延迟在0.1 - 1ms 左右(相当千内存访问延时的105- 106 倍),如此巨大的延时差别,也会影响消息的收发的过程,因此消息丢失和消息延迟变得非常普遍。 - 网络分区
当网络由千发生异常情况,导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能——我们将这个现象称为网络分区,就是俗称的“脑裂”。当网络分区出现时,分布式系统会出现局部小集群,在极端情况下,这些局部小集群会独立完成原本需要整个分布式系统才能完成的功能,包括对数据的事务处理,这就对分布式一致性提出了非常大的挑战。 - 三态
从上面的介绍中,我们已经了解到了在分布式环境下,网络可能会出现各式各样的问题,因此分布式系统的每一次请求与响应,存在特有的” 三态”概念,即成功、失败与超时。在传统的单机系统中,应用程序在调用一个泊数之后,能够得到一个非常明确的响应:成功或失败。而在分布式系统中,由千网络是不可靠的,虽然在绝大部分情况下,网络通信也能够接收到成功或失败的响应,但是当网络出现异常的情况下,就可能会出现超时现象,通常有以下两种情况:- 由于网络原因,该请求(消息)并没有被成功地发送到接收方,而是在发送过程就发生了消息丢失现象。
- 该请求(消息)成功的被接收方接收后,井进行了处理,但是在将响应反馈给发送方的过程中,发生了消息丢失现象。当出现这样的超时现象时,网络通信的发起方是无法确定当前请求是否被成功处理的。
- 节点故障
节点故障则是分布式环境下另一个比较常见的问题,指的是组成分布式系统的服务器节点出现的宕机或“僵死”现象。通常根据经验来说,每个节点都有可能会出现故障,井且每天都在发生。
1.3 ACID
事务是一系列的系统中对数据进行访问和更新的一个程序执行逻辑单元(Unit)狭义指的是数据库事务,一方面党多个应用程序并发访问数据库是,事务可以在这些应用程序中做一下隔离方法,另一方面,事务为应用程序失败后恢复正常提供方法,同时提供了异常状态下仍能保持数据一致性的方法,事务具有四个特征,分别是原子性,一致性,隔离性,持久性,简称事务的ACID。
- 原子性
事务的原子性指的是事务只有两种状态,- 全部执行成功
- 全部执行失败
任何一项执行失败都导致整个事务的失败,同时其他已经被执行的操作都被撤销回滚,之后操作全部执行成功,事务才会完全成功
- 一致性
指的是事务的执行不能破坏数据库数据的完整性和一致性,一个事务的执行前和执行后事务的一致性状态不能被破坏,也就是说事务的执行结果只能是从一个一致性状态到另外一个一致性状态。 - 隔离性
事务的隔离性是指在并发环境下,并发的事务是相互隔离的 ,一个事务的执行不让其他事务干扰,标准的SQl规范中定义了4个事务隔离级别,
未授权读取。授权读取,可重复读取,串行化读取。
脏读、不可重复读、幻读:
隔离级别中提及到的 脏读、不可重复读、幻读 的理解:
- 脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。
- 不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了也就是说,当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语义。
- 幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
也就是说,当前事务读第一次取到的数据比后来读取到数据条目少。
- 未授权读取也被称为未提交(Read Uncommitted) 该隔离级别允许脏读取,其脏读取,换句话,如果一个事务正在处理某一数据,并对其更新,但同时尚未完成事务,因此还没有进行事务提交,而与此同时允许另一事务也能够访问改数据,举个例子来说,事务A和事务B,A做了一个累加操作 1-》3–》6–》10 B事务可以看到中间值 3 6 ,而对一系列中间值读取就是未授权读取。
- 授权读取也被称为已提交(Read commited),他和未授权读取很像,还是刚才那个例子 B程序只能读到10
- 可重复读取(Repeatable Read),简单来说,就是保证数据事务处理过程中多次读到同一个数据 是同一个数值,因此事务禁止了不可重复读和赃读,但是可能出现幻读。
- 串行化是最严格的控制,只能串行执行一个一个来
图解
- 持久性
事务的持久性也被称为永久性,是指一个事务一且提交,它对数据库中对应数据的状态变更就应该是永久性的。换句话说,一旦某个事务成功结束,那么它对数据库所做的新就必须被永久保存下来-即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束时的状态。
1.4 CAP
CAP 理论告诉我们, 一个分布式系统不可能同时满足一致性(C : Consistency) 、可用性 (A: Available) 和分区容错性(P :Partition tolerance) 这三个基本需求,最多只能同时满足其中的两项。
- 一致性
在分布式环境中, 一致性是指数据在多个副本之间是否能够保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。 - 可用性
可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果 - 分区容错性
分区容错性约束了一个分布式系统需要具有如下特性: 分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。网络分区是指在分布式系统中,不同的节点分布在不同的子网络( 机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区。
放弃CAP定理 | 说明 |
---|---|
放弃P | 如果希望能够避免系统出现分区容错性问题,一种较为简单的做法是将所有的数据(或者仅仅是那些与事务相关的数据)都放在一个分布式节点上。这样的做法虽然无法100%地保证系统不会出但至少不会碰到由于网络分区带来的负面影响。但同时需要注意的是放弃P的同时就意味治放弃了系统的可扩展性 |
放弃A | 相对于放弃“分区容错性” 来说,放弃可用性则正好相反,其做法是一旦系统遇到网络分区或其他故障时,那么受到影响的服务需要等待一定的时间,因此在等待期间系统无法对外提供正常的服务,即不可用 |
放弃C | 这里所说的放弃一致性,并不是完全不需要数据一致性,如果真是这样的话,那么系统的数据都是没有意义的,整个系统也是没有价值的。事实上.放弁一致性指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时的一致性,但是能够承诺的是,数据最终会达到一个一致的状态。这就引入了一个时间窗口的概念,具体多久能够达到数f据一致取决于系统的设计, 主要包括数据副本在不同节点之间的复制时间长短 |
1.5 BASE 理论
BASE 是Base Available(基本可用),Soft state (软状态)和Eventually consider(最终一致性)三个短语的的简写。
- 基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性一一但请注意,这绝不等价干不可用。以下两个就是“基本可用”的典型例子。- 响应时间上的损失: 正常情况下, 一个在线搜索引擎需要在0 .5 秒之内返回给用户相应的查询结果,但由干出现故陓(比如系统部分机房发生断电或断网故障), 查询结果的响应时间增加到了1 -2 秒。
- 功能上的损失: 正常情况下,在一个电子商务网站上进行购物,消费者儿乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由千消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。
- 弱状态
弱状态也称为软状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。 - 最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。