分布式理论 | 青训营笔记

99 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第8天

一.分布式理论

什么是分布式?

 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
 严格地讲,同一个分布式系统中的计算机在空间部署上是可以随意分布的, 这些计算机可以分布在不同的空间。一个标准的分布式系统在没有任何特定业务逻辑约束的情况下,都会有如下几个特征。

  • 分布性

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

    • 在常见的分布式系统中,为了对外提供高可用的服务,我们往往会对数据和服务进行副本处理。
    • 数据副本是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题最为有效的手段。
    • 另一类副本是服务副本,指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。
  • 并发性

    • 在一个计算机网络中,程序运行过程中的并发性操作是非常常见的行为,例如同一个分布式系统中的多个节点,可能会并发地操作一些共享的资源,诸如数据库或分布式存储等。

时间和事件顺序

  • Lamport逻辑时钟
    1.对于每一个节点Pi我们定义时钟Ci为一个函数,它为任意的事件 a赋值编号为Ci(a)
    ⒉.如果事件a表示节点Pi发送某条消息,b表示节点Pj接受这条消息,则有Ci(a)<Cj(b)

于是我们可以在时空图中加入类似右图虚线所示的“tick line"
在同一节点内的连续两个事件之间,至少要有一条tick line
利用逻辑时钟,我们可以对整个系统中的事件进行全序排序

image.png

利用以上理论,我们可以想到既然时间与事件顺序存在影响关系,那么我们可以有一个全局时钟,以这个全局时钟作为整个分布式系统的全局时钟,以若干个全局时钟的单位作为一次原子操作的时间,就可以解决分布式的时间序列问题(选取分布式系统中操作最长的操作),但是性能上会有一定的损失。

CAP理论

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能同时满足其中的2个。

image.png

选项描述
Consistency(一致性)指数据在多个副本之间能够保持一致的特性(严格的一致性)
Availability(可用性)指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据)
Partition tolerance(分区容错性)分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障

CAP理论往往运用于数据库领域,同样可以适用于分布式存储方向

  • CA:放弃分区容错性,加强一致性和可用性,其实就是传统的单机数据库的选择
  • AP:放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,例如一些注重用户体验的系统
  • CP:放弃可用性,追求一致性和分区容错性,例如与钱财安全相关的系统
  • 具体采取那种策略比较合适,还需要分析业务场景而定。

二.分布式事务

两阶段提交

 两阶段提交(Two-Phase Commit,以下简称2PC)方案,通常也被称为一种协议,从字面意思理解就是事务分两个阶段进行提交,整个方案在执行分布式事务的过程中被分为两个重要阶段:

  • 准备阶段(Prepare Phase):事务发起方通过事务管理器发起一个分布式事务后,由事务协调器(事务管理器)通知各个事务参与方(资源管理器),给他们发送一条prepare指令,每个参与者要么返回失败,要么就进行执行本地事务(分支事务),写本地redo和undo日志,但是不进行事务的commit,到达一种临界状态,此时每个参与者持有当前本地事务涉及的锁资源不释放;
  • 提交阶段(Commit Phase):事务协调器收集所有事务参与方在一阶段返回的信息,如果都成功则通知所有参与方进行事务提交(Commit),如果有返回失败或超时,则通知所有参与方进行事务回滚(Rollback)。参与方根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。

image.png

三阶段提交

相比两阶段,三阶段做了一些改进:

  • 三阶段提交协议引入了超时机制。
  • 在第一阶段和第二阶段中,引入了一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

三阶段提交

简单讲:就是除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。

image.png

参考引用