分布式计算的原理
分布式计算就是将计算任务分摊到大量的计算节点上,一 起完成海量的计算任务。而分布式计算的原理和并行计算 类似,就是将一个复杂庞大的计算任务适当划分为一个个 小任务,任务并行执行,只不过分布式计算会将这些任务 分配到不同的计算节点上,每个计算节点只需要完成自己 的计算任务即可,可以有效分担海量的计算任务。而每个 计算节点也可以并行处理自身的任务,更加充分利用机器 的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)这三项中的两项。
一致性
指“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都属于此类。