从分布式环境的特点、问题到CAP、BASE理论详解

分布式的特点:

定义:

分布式系统是一个硬件或者软件组件分布在不同的网络计算机上,彼此之间仅仅通过网络进行通信和协调的系统。

特点:

同一个分布式系统中的计算机在空间部署上可以是任意分布的,这些计算机可能被放在不同的机柜上、也可能在不同的机房中,甚至可能在不同的城市,无论如何,一个标准的分布式系统没有特定业务逻辑约束的情况下,都会有如下几个特征:

分布性:分布性系统的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随时变动。

对等性:分布式系统中的计算机没有主/从之分,既没有控制整个系统的主机,也没有被控制的从机。组成分布式系统的所有计算机节点都是对等的。副本是分布式系统最常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。在常见的分布式系统中,为了对外提高高可用的服务,我们往往会对数据和服务进行副本处理。数据副本指的是在不同节点上持久化同一份数据,当某个节点上存储的数据丢失时。可以从副本上获取到该数据。这是分布式系统解决数据丢失问题最为有效的手段。服务副本是指多个节点提供同样的服务,每个节点都有能力接收外部的请求并进行处理。

并发性:同一分布式系统的多个节点,可能会并发的操作一些共享资源,比如数据库,分布式存储等等,如何准确高效解决分布性并发操作也成为了分分布式系统架构设计的最大挑战之一。

无序性:一个典型的分布式系统是由一系列的在空间上任意分布的多个进程组成,具有明显的分布性。这些进程之间通过交换消息来进行相互通信,协调。因此,在分布式系统中,很难定义两个事件谁先谁后,原因是缺乏一个全局时钟序列控制。

故障总是发生,组成分布式系统的任何节点,都有可能发生任何形式的故障,比如硬件损坏,火灾,网络故障等等。

分布式环境的问题
通信异常

从集中式到分布式的演变过程中,必然引入了网络的因素。但是网络本身是不可靠的。可能会发生网络故障,网络延时太大等等问题。

网络分区

当网络由于发生异常,导致分布式系统中的部分节点之间网络延时不断增大,最终导致组成分布式系统的所有节点中,只有部分节点能够正常通信。而另外一部分节点不能正常通信。这种现象称为网络分区,也叫脑裂。当网络分区出现时,分布式系统会出现局部小集群。

在这里插入图片描述
这是一个分布式系统中某个服务的集群,由于网络原因,slave节点5、6、7与其他节点的通信超时,此时他们会认为其他节点不可用,而重新选举出一个新的master。如图下:
在这里插入图片描述
slave节点5成为了master节点,并且有slave节点6、7作为从节点,此时原本的一个集群变成了两个集群,集群间无法通信,分别对外服务,数据、事务的同步只会在各自的集群节点中进行,因此这样会导致分布式系统数据一致性造成很大影响。

三态

三态是:成功、失败、超时。
在传统的单机系统中,应用程序调用了一个函数后,都能得到一个非常明确的响应,成功或者失败。而在分布式系统中,网络是不可靠的,在网络出现异常的情况下,就可能会出现超时现象。通常有以下两种情况:

  • 由于网络原因,请求没有被成功地发送到接收方,而是在发送过程中请求消息就发生了丢失的现象。
  • 该请求成功发送到接收方,并且进行了处理,并且向请求方进行了响应,但是在响应发送回给请求方的过程中消息发生了丢失的现象。

当出现这样的情况时,请求方无法判断是成功还是失败。

节点故障

指的是分布性系统中的服务器节点出现宕机或者僵死的现象。

分布式事务

单机环境下,我们很容易能够实现一套满足ACID特性的事务处理系统,比如java的话使用spring的声明式事务就可以解决单机系统的事务处理。但是在分布式数据库中,数据分散在不同的机器,如何对这些数据进行事务处理具有非常大的挑战。

分布式事务是指事务参与者、支持事务的服务器,资源服务器,事务管理器分别位于分布式系统的不同节点上。通常一个分布式事务中会涉及涉及对多个数据源或者业务系统的操作。

经典场景:一个跨银行转账场景,在A银行进行取款存到B银行中,两个银行的服务系统没有关联,相互独立。共同构成了一个分布式事务,如果A银行取款成功,但是B银行存款失败的话,那就必须回滚到取款前的状态。否则用户的钱就莫得了。

一个分布式事务可以看作是多个分布式操作组成。例如存款和取款像个操作。通常可以把一系列分布式操作称为子事务。

CAP理论

CAP理论是加州大学伯克利分校的Eric Brewer教授2000年提出来的猜想,后来被证实可行性。从此,CAP理论正式在学术上成为分布式计算领域的公认定理,并深深影响分布式计算发展。

C(Consistency)一致性:在分布式环境下,一致性指的是数据在多个副本之间是否能够保持一致的特性。当一个系统的数据处于一致的状态下执行更新操作之后,应该保证系统的数据仍然处于一致的状态。
一个系统具有多个数据副本节点,对其中一个节点进行数据的更新操作,没有同步到其他节点上,于是读取其他节点时,获取的是老数据(脏数据)。这就是典型的分布式数据不一致状情况。
在分布式系统中,如果能够对一个数据项进行了更新操作后,所有的用户都能读取到最小的数据,那么该系统就是具有强一致性的系统。

A(Availability)可用性:可用性是指系统提供的服务必须一直处于可用状态,对于用户的每一个请求总是在有限时间内返回结果

有限的时间是指对于一个用户请求操作,系统必须在指定的时间内返回对应的处理结果。如果超出了这个范围,那么系统会被认为不可用。 比如淘宝商品搜索需要在5秒内响应结果,超过5秒就认为系统不可用。又或者调用redis服务请求时设置超时时间为3秒,3秒没有响应结果就抛出异常,这里的有限时间是3秒。

返回结果是可用性的另外一个重要指标,它要求系统在完成对用户请求处理后,返回一个正确的响应结果。正常的响应应该是能够正确地反应出处理的结果,成功或者失败,而不是一个让用户感到困惑的结果。比如OutOfMemory,NullPointException等结果。

P(Partition tolerance)分区容错性:约束了一个分布式系统在遇到任何网络分区故障的请求下,仍然能够提供对外满足一致性和可用性的服务,除非整个网络环境都发生了故障。

取舍:
放弃P:如果我们不接受分区容错性(放弃分区容错性),也就是不允许出现网络分区的现象,那就只能把数据放在同一个节点上存储,不使用副本。但是这样就意味着放弃系统的扩展性,这已经不是所谓的分布式系统了,因为分布式系统的组件必然是部署在不同的节点上。所以分区是分布式系统必然会存在的问题,放弃了就不是所谓的分布式系统了,所以分区容错性是一个分布式系统必然要解决的一个问题,所以不能放弃P。

放弃C:这里所说的放弃一致性,并不是完全不需要数据一致性,如果完全放弃数据一致性的话,那么系统就没有意义了。这里放弃C指的是放弃数据的强一致性。保留数据的最终一致性。这样的系统无法保证数据实时的一致性。但是能够承诺保证数据的最终一致性。就是系统中的数据会在一定时间内最终达到一致性状态。

放弃A:指的是允许系统在一定的时间内不可用。

C和A的冲突性:
C强一致性和A可用性是冲突的,因为如果系统具有强一致性的话,当请求对节点进行数据更新的话,就必须把其他副本和该节点的读操作和写操作进行锁定,等待数据更新再其他副本中进行同步之后才能再次对外服务。在数据同步过程中系统处于不可用状态。所以选择C就意味着放弃了A。

所以一个分布式系统只能保证CP或者AP。根据实际业务情况在CP跟AP中进行取舍。

BASE理论

BASE(basically Available)\(Soft State)、(Eventually Consistency)。

basically Available:基本可用,指的是分布式系统在出现不可预知故障时,允许损失部分可用性,这绝不等价与系统不可用。
例子:
响应时间上的损失:比如淘宝商品搜索需要在5秒内响应用户,但是由于出现故障,比如部分机房断电断网等,查询结果延时了几秒。结果在8秒里响应用户。

功能上的损失:淘宝双十一,在一定时间点下单量暴增,为了保证系统稳定性。部分消费者的下单请求会被引导到一个降级页面。

Soft State:软状态,允许系统拥有中间状态,并认为该状态不会影响系统的整体可用性,即允许系统不同节点之间数据副本数据同步过程中存在延时。

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

最终一致性的五个变种:

因果一致性:进程A对某数据更新之后通知了进程B,那么进程B之后对该数据的访问都应该能够获取到进程A更新后的最新值。并且如果进程B要更新该数据的话,务必基于进程A更新后的最新值的基础上进行更新。与此同时,与进程A无因果关系的进程C没有此限制。

读己之所写:进程A更新了一个数据后,它自己总能访问该数据被它更新后的最新值,而不会看到旧值。

会话一致性:会话一致性将系统数据的访问过程框定在一个会话内,系统保证在同一个会话中实现“读己之所写一致性”,也就是说,在同一会话内,对某数据进行更新,该会话能够读取到更新后的最新值。上面的己是同一进程A,这里的己是同一会话。

单调读一致性:指的是一个进程从系统中读取一个数据项后,那么该系统对于该进程之后的该数据访问都不应该返回更旧的值。

单调写一致性:一个系统需要保证来自同一个进程的写操作被顺序执行。

总结:BASE理论是面向分布式系统,和传统的事务的ACID是相反的,他完全不同于ACID的强一致性模型。而是提出牺牲强一致性来获取可用性。并且允许数据在一段时间内不一致,但最终会达到一致性。在实际的分布式场景中,不同业务单元组件对一致性的要求不一样,有些必须强一致,有些允许最终一致性。所以ACID与BASE理论往往又会结合在一起使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章