分布式系统的概念
在《分布式系统概念与设计》一书中,对分布式系统做了如下定义:分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
一个标准的分布式系统在没有任何特定业务逻辑约束的情况下,都会有如下几个特征:
- 分布性:分布式系统中的多台计算机都会在空间上随意分布,同时,机器的分布情况也会随时变动
- 对等性:分布式系统中的计算机没有主/从之分,即没有控制整个系统的主机是,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的。副本(Replica)是分布式系统最常见的概念之一,指的是分布式系统对数据服务提供的一种冗余方式。在常见的分布式系统中,为了对外提供高可用的服务,我们往往会对数据和服务进行副本处理。数据副本是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题最为有效的手段。另一类副本是服务副本,指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。
- 并发性:同一个分布式系统中的多个节点,可能会并发的操作一些共享的资源,诸如数据库或分布式存储等,如何准确并高效的协调分布式并发操作成为了分布式系统架构与设计中最大的挑战之一
- 缺乏全局时钟:一个典型的分布式系统是由一系列在空间上随意分布的多个进程组成,具有明显的分布性,这些进程之间通过交换消息来进行相互通信。因此,在分布式系统中,很难定义两个事件究竟谁先谁后,原因就是因为分布式系统缺乏一个全局的时钟序列控制。
- 故障总是会发生:组成分布式系统的所有计算机,都有可能发生任何形式的故障。一个被大量工程实践所检验过的黄金定理是:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且,在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常故障。所以,除非需求指标允许,在系统设计时不能放过任何异常情况。
分布式事务
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。通常一个分布式事务中会涉及对多个数据源或业务系统的操作。 例如:一个跨银行的转账操作涉及调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个服务本身是无状态并且是相互独立的,共同构成了一个完整的分布式事务。如果从本地银行取款成功,但是因为某种原因存款服务失败了,那么就必须回滚到取款钱的状态,否则用户可能发现自己的钱不翼而飞了。 从这个例子中,我们可以看到,一个分布式事务可以看作是由多个分布式操作序列组成的,例如上面例子中的取款服务和存款服务,通常可以把这一系列分布式的操作序列称为子事务。因此,分布式事务也可以被定义为一种嵌套的事务,同时也就具有了ACID事务特性。但由于在分布式事务中,各个子事务的执行是分布式的,因此要实现一种能够保证ACID特性的分布式事务处理系统就显得格外复杂。
CAP理论
CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
- 一致性:跟新操作使各节点的数据一致
- 可用性:能够在有限的时间内返回明确的结果
- 分区容错性:分布式系统在遇到任何网络分区故障时,任然需要能够保证对外提供满足一致性和可用性服务,除非是整个网络环境都发生了故障。
一个分布式系统无法同时满足上述单个需求,而只能满足其中的两项,因此在进行对CAP理论的应用时,我们就需要抛弃其中的一项。场景说明如下:
| 放弃CAP理论 | 说明 |
|---|---|
| 放弃P | 如果希望系统避免出现分区容错性问题,一种较为简单的做法是将所有的数据(或者是仅仅是那些与事务相关的数据)都放在一个分布式节点上。这样的做法虽然无法100%地保证系统不会出错,但至少不会碰到由于网络分区带来的负面影响。但同时需要注意的是,放弃P的同时也就意味着放弃了系统的可扩展性 |
| 放弃A | 对于放弃“分区容错性”来说,放弃可用性则正好相反,其做法是一旦系统遇到网络分区或者其他故障时,那么受影响的服务需要等待一定的时间,因此在等待期间系统无法对外提供正常的服务,即不可用 |
| 放弃C | 这里所说的放弃一致性,并不是完全不需要数据的一致性,如果真是这样的话,那么系统数据都是没有意义的,整个系统也是没有价值的。事实上,放弃一致性指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据的实时一致性,但是能够承诺的是,数据最终会达到一个一致的状态。这就引入了一个时间窗口的额概念,具体多久能够达到数据一致性的状态取决于系统的需求与设计,主要包括数据副本在不同节点之间的复制时间长短 |
从CAP定理中我们可以看出,一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个需求。另一方面,需要明确的一点是,对于一个分布式系统而言,分区容错性可以说是最基本的需求。为什么这样说,其实很简单,因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成了分布式系统必然需要面对和解决的问题。因此系统架构师往往需要把精力花在如何根据业务特点在C(一致性)和A(可用性)之间寻求平衡。
BASE理论
BASE 是Basecally Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写,是由来自eBay的架构师Dan Pritchett在其文章BASE:An ACID Alternative中第一次明确提出的。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP理论逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual Consistency).接下来我们着重对BASE中的三要素进行详细讲解:
- 基本可用:
- 弱状态:
- 最终一致性: 参考文献《从PAXOS到Zookeeper分布式一致性原理与实践》
转载于:https://my.oschina.net/u/3729778/blog/2050227