分布式——ACID原则 CAP理论

分布式计算的原理

分布式计算就是将计算任务分摊到大量的计算节点上,一 起完成海量的计算任务。而分布式计算的原理和并行计算 类似,就是将一个复杂庞大的计算任务适当划分为一个个 小任务,任务并行执行,只不过分布式计算会将这些任务 分配到不同的计算节点上,每个计算节点只需要完成自己 的计算任务即可,可以有效分担海量的计算任务。而每个 计算节点也可以并行处理自身的任务,更加充分利用机器 的CPU资源。最后再将每个节点的计算结果汇总,得到最 后的计算结果。

分布式计算的理论基础

ACID原则

ACID是数据库事务正常执行的四个原则,分别指原子性一致性独立性持久性

A(Atomicity)—— 原子性 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失 败,整个事务就失败,需要回滚。 例如银行转账,从A账户转100元至B账户,分为两个步骤:①从A账户取 100元;②存入100元至B账户。 这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失 败,钱会莫名其妙少了100元。

C(Consistency)—— 一致性 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 例如现有完整性约束a + b = 10,如果一个事务改变了a,那么必须得改变 b,使得事务结束后依然满足a + b = 10,否则事务失败。

I(Isolation)—— 独立性 所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问 的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问 的数据就不受未提交事务的影响。 例如交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如 果此时B查询自己的账户,是看不到新增加的100元的。

D(Durability)—— 持久性 持久性是指一旦事务提交后,它所做的修改将会永久保存在数据库上, 即使出现宕机也不会丢失。 这些原则解决了数据的一致性、系统的可靠性等关键问题,为关系数据 库技术的成熟以及在不同领域的大规模应用创造了必要的条件。

CAP理论

一个分布式系统最多只 能同时满足一致性(Consistency)、可用 性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
分布式——ACID原则 CAP理论
一致性
指“All nodes see the same data at the same time”,即更新操作成功并返 回客户端完成后,所有节点在同一时间的数据完全一致。对于一致性,可以分 为从客户端和服务端两个不同的视角来看。

  • 从客户端来看,一致性主要指多并发访问时更新过的数据如何获取的问题。
  • 从服务端来看,则是如何将更新复制分布到整个系统,以保证数据的最终一 致性问题。

可用性

  • 指“Reads and writes always succeed”,即服务一直可用,而且是 在正常的响应时间内。对于一个可用性的分布式系统,每一个非故障的节点 必须对每一个请求作出响应。也就是该系统使用的任何算法必须最终终止
  • 当同时要求分区容错性时,这是一个很强的定义:即使是严重的网络错误, 每个请求也必须终止。好的可用性主要是指系统能够很好地为用户服务,不 出现用户操作失败或者访问超时等用户体验不好的情况。通常情况下可用性 和分布式数据冗余、负载均衡等有着很大的关联。
    分区容错性
  • 指“The system continues to operate despite arbitrary message loss or failure of part of the system”,也就是指分布式系统在遇到某节点或网络 分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
  • 分区容错性和扩展性紧密相关。在分布式应用中,可能因为一些分布式的原 因导致系统无法正常运转。好的分区容错性要求应用虽然是一个分布式系统, 但看上去却好像是一个可以运转正常的整体。例如现在的分布式系统中有某 一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求, 或者是机器之间有网络异常,将分布式系统分隔为独立的几个部分,各个部 分还能维持分布式系统的运作,这样就具有好的分区容错性。
CAP权衡

无法同时满足一致性、可用性和分区容错性这三个特性,那应该如何取舍呢?
(1)CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用 性)是可以保证的。但其实分区始终会存在,因此CA的系统更多的是允许分区 后各子系统依然保持CA。
(2)CP without A:如果不要求A(可用),相当于每个请求都需要在Server之 间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很 多传统的数据库分布式事务都属于这种模式。
(3)AP without C:要高可用并允许分区,则需放弃一致性。一旦分区发生, 节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务, 而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。