概述
文章目录
- 1 分布式系统简介
- 1.1 分布式系统定义
- 1.2 分布式系统目标
- 1.3 常见分布式系统类型
- 2 分布式系统体系结构
- 2.1 体系结构样式
- 2.2 系统体系结构
- 2.2.1 集中式体系结构
- 2.2.2 非集中式体系结构
- 2.2.3 混合体系结构
- 2.3 中间件
- 3 进程
- 3.1 进程和线程
- 3. 2虚拟化
- 3.3 c/s模型
- 3.4 代码迁移(migration)
- 4 进程间通信
- 4.1 Layered Protocols
- 4.2 中间件协议
- 4.3 RPC远程过程调用
- 4.4 面向消息的通信
- 4.5 Data Stream
- 5 命名系统
- 5.1 名称、标识符、访问点、地址
- 5.2 无层次命名
- 5.3 结构化命名
- 5.4基于属性的命名
- 6 同步
- 6.1时钟同步
- 6.2 向量时钟
- 6.3 分布式互斥算法
- 6.4 选举算法
- 7 复制和一致性
- 7.1 复制的原因
- 7.2 以数据为中心的一致性模型
- 7.3 以客户为中心的一致性模型
- 7.4 复制管理
- 7.5 一致性协议
- 8 容错性
- 8.1 基本概念
- 8.2进程恢复
- 8.3 可靠的组间通信
- 8.4分布式提交
- 8.5 恢复
1 分布式系统简介
1.1 分布式系统定义
产生背景:应用驱动+技术支撑
分布式系统优点:支持业务固有的分布性、经济性、性能提升、可靠性提升
定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。硬件角度:各个计算机是自治的,通过网络互联;软件角度:用户看到一台逻辑计算机。(互联、协作、单一视图)
1.2 分布式系统目标
(1)使远程资源可访问
分布式系统的最主要目标是使用户能够方便地访问远程资源,并且以一种受控的方式与其他用户共享这些资源。
(2)透明性:隐藏进程和资源分布在多台计算机上的事实。
透明性的程度和具体应用相关,同时还要考虑性能问题( 副本能提高性能,但保持副本的一致性需要进行更新传播 )。透明性是要牺牲一些效率来达到的。具体透明性如下:
(3)开放性
根据一系列准则来提供服务,这些准则描述了所提供服务的语法和语义。分布式系统中服务通常通过接口来提供 ,而接口一般通过接口定义语言来描述
(4)可扩展性
规模扩展:方便的增加资源和用户(限制:集中的服务、数据及算法)
地域扩展:用户和资源相隔距离(限制:通信延迟、不可靠通信)
管理扩展:能跨越多个独立的管理机构(限制:安全问题、收费问题)
解决扩展性的技术
a.隐藏通信延迟
采用异步通信方式,避免等待响应
采用多线程技术,提高并发
减少通信量,胖客户端
b.分布:DNS,WWW分布式web项目
c.复制技术:扩展通常会导致性能的下降,复制能增加可用性,提高性能,利于负载均衡,但存在一致性问题。-复制也可隐藏通信时间
1.3 常见分布式系统类型
(1)分布式计算系统:用于高性能计算任务
①集群计算系统
底层硬件由类似的工作站或者PC集组成,通过高速局域网紧密相连,每个结点运行相同的操作系统(具有同构性)
②网格计算系统
异构的(硬件、操作系统、网络等都不尽相同)系统,把不同计算机的资源集中起来,进行协调工作
(2)分布式信息系统:适用于大型企业或者组织对信息进行管理和事务处理,解决大型企业或组织对大量网络应用、信息的集成和管理。
①事务处理系统(分布式数据库应用)
用户看到的是一个完整的数据库,但是数据实际是分布在多个计算机结点上,事务处理系统能提供有效的存取手段来对数据进行处理。事务处理的特征是所有操作要么被完全执行,要么不执行。
②企业应用集成:将各个应用集成起来,应用之间可以直接交换信息。
(3)分布式普适系统:移动和嵌入式设备加入到系统中,以便访问信息
①智能家居系统:把家庭中的设备集成为单个系统,能够进行自我配置和
自我管理
②电子健保系统:用于日常监视个人健康程度,在需要的时候与医生联系
2 分布式系统体系结构
2.1 体系结构样式
软件体系结构: 软件的组件,以及组件之间的相互关系。
要素:组件-模块单元,具有良好的接口
链接器-实现组件间通信的机制
软件体系结构样式:如何表示一个软件体系结构
常见的体系结构样式 :
- 分层体系结构:系统由不同层的组件组成,只有相邻层可以通信 ,请求消息自上 而下,响应消息自下而上
- 基于对象的体系结构 :每个组件对应一个对象; RMI 通信
- 以数据为中心的体系结构:组件间通过一个公用的存储实现通信
- 基于事件的体系结构 :通过事件的传播实现组件间的通信
2.2 系统体系结构
软件体系结构的具体实例 :集中式体系结构(客户/服务器模型–CS)、非集中式体系结构(点对点系统—P2P)、混合体系结构
2.2.1 集中式体系结构
客户 / 服务器模型
Server :服务器是实现特定服务的进程
Client :是通过往服务器发送请求来请求服务,然后等待服务器回复的进程
请求 / 答复模式:Client和Server分别扮演服务请求者和服务提供者。服务器监听请求,客户提出请求、接收响应;服务器等待请求,客户等待响应。
应用分层(逻辑三层):用户接口层、处理层、数据层
多层体系结构
-
物理两层体系结构:
逻辑上三层部署在物理上的两层上
(1)客户机,只含有实现(部分)用户接口的程序
(2)服务器,包含了其余的部分,即实现处理和数据层的程序 -
物理三层体系结构:
服务器有时会担任客户机的角色;用户接口、应用程序服务器、数据库服务器
多层是按纵向划分,也可以按横向划分:垂直分布(不同功能的分布)、水平分布(相同功能的复制)
c/s 适合集中式网络服务
2.2.2 非集中式体系结构
点对点系统(P2P):网络上的所有节点都可以“平等”共享其他节点的计算资源,所有网络节点上的设备都可以建立P2P对话。(既可以是客户也可以是服务器))
P2P适合分散式服务,如即时通信、点对点文件传输、视频会议等(eg.napster )
结构化的点对点体系结构
逻辑上的结构,方便快速查找,eg. Chord系统-基于Hash运算,CAN上下文可编址网络-基于虚拟的 d 维笛卡尔坐标
非结构化的点对点体系结构
每个节点维护一个邻节点列表,泛洪查找–>改进:超级对等体(维护索引或充当代理)
2.2.3 混合体系结构
将集中式和非集中式体系结构组合,eg.BitTorrent 系统,其目录的存储是集中的,但文件系统是分散的
2.3 中间件
中间件在应用程序和底层操作系统之间,其目的是要提供分布式透明性
中间件如何不同应用程序的需求:
- 针对不同的应用实现多个中间件版本
- 按照应用程序的需要来配置、适应中间件系统
拦截器:可中断正常执行的控制流,插入执行其他代码
- 请求级拦截器
- 消息级拦截器
3 进程
3.1 进程和线程
进程----- 程序的一次执行过程;资源分配的最小单位;
线程-----CPU分配的单位;程序执行的最小单位,资源调度的最小单位
为什么引入线程的: 提高并发程度, 适合多核, 通信代价小
(1)不必使进程因等待某事件而阻塞,提高了进程的执行效率;
(2)多处理/多核上可使线程并行执行;
(3)IPC需要内核干预,上下文切换代价高,线程可通过数据共享实现;
(4)软件工程的需要,有些应用程序需要一组相互协作的任务完成。
线程的实现以线程包的形式提供,分为:
- user-level线程库;上下文切换代价小,但容易造成整个进程的阻塞。
- kernel-level线程库;不会导致进程的阻塞,但上下文切换代价高。
为此采用混合方式,通过 LWP 进行线程管理(结合kernel-level lightweight processes和user-level threads)。
多核处理器的三种实现方案 : 1) 共享缓存方案 ; 2) 共享 IO 接口方案 ; 3) 共享数据包方案 ;
多线程之间的合作方式:(a)派遣者 / 工作者模式 (b) 团队模式 © 管道模式
在分布式系统中,线程可用于开发高效率的客户端和服务器.
3. 2虚拟化
定义:将一台计算机虚拟为多台逻辑上的计算机
原因:
- 高层软件跟不上底层硬件的更新
- 可移植和灵活性
虚拟机体系结构
计算机系统提供了不同层次的接口以实现不同的虚拟化技术,如下图
①由机器指令组成的硬件和软件之间的接口
- 任何程序都能调(General instructions)
- 只有特权程序才能调用(Privileged instructions)
②由操作系统提供的系统调用(System calls)组成的接口
③由库函数组成的接口(Library functions),通常形成了应用程序编程接口(API)
虚拟化可采用两种方式
①进程虚拟机-Runtime System,提供一套抽象指令集来执行程序,如 JVM,在操作系统和应用层之间
②虚拟机监视器VMM-系统屏蔽硬件同时提供机器指令接口,可以有多个不同的操作系统独立并发地运行在同一平台,如VMWare,硬件和操作系统之间
3.3 c/s模型
client:
- 提供用户接口
- 和服务器进行交互
- 执行部分处理工作(ATM 机,机顶盒,条码阅读器等)
- 提供分布式透明性(Client-side solution)
server:
(1)工作方式
等待来自客户的请求,随后处理该请求,返回处理结果,并等待下一个客户请求。
(2)组织结构
迭代服务器(Iterative server):自己处理请求,并将响应返回给发出请求的客户。
并发服务器(Concurrent server):自己不处理请求,将请求传递给某个独立线程或者其他进程来处理,自己立即返回并等待下一个输入的请求。
(3)端口访问
客户如何访问服务器?服务器在端口监听客户的请求。
客户如何知道服务器的端口?为已知的服务分配特定端口,如Http是80端口,FTP是21端口;动态分配
客户端到服务器的绑定:
- 使用daemon(守护程序,查找end-point table)
- 使用superserver(create server)
(4)中断服务
- 退出客户应用程序
- 利用带外数据:带外数据是服务器在处理客户发送的其他所有数据之前必须处理的数据。
(5)状态
- 状态无关服务器(Stateless server):服务器不保存其客户的状态信息,也不把自身的状态变化告知任何客户(例如:Web服务器)
- 状态相关服务器(Stateful server):服务器端保存每次通信的信息(例如:文件服务器)
(6) 服务器集群
一组经网络相连的机器,每台机器运行一 个或多个服务器,实现分布式计算 ,逻辑上分三层
1 、存储器、交换机,分配客户请求给服务器
2 、存储器、应用或计算服务器,提供计算或相应处理
3 、存储器、文件或数据库服务器,完成数据处理服务
不同服务运行在不同的机器上,交换机需要区分不同的请求,转发到合适的服务器,可能导致负载不均(代码迁移, 负载均衡算法)
分布式透明性(单点访问, TCP handoff)
3.4 代码迁移(migration)
为什么要进行代码迁移
- 性能提升:从负载重的机器迁移到负载轻的机器;把客户端的部分迁移到服务器;把服务器的部分代码迁移到客户端
- 灵活性 客户绑定到服务器时,可以动态下载代码
代码迁移模型:
一个进程包括:代码段,资源段,执行段(包括当前进程的状态)
移动的强弱:
- 弱可移动性,只传输代码及相关初始化数据 ,要求目标机器能执行代码,迁移后的代码 总是从预先定义的位置开始执行
- 强可移动性,移动代码和执行段,可以先停止运行中的程序,然后迁移,在目标机器上从停止的地方继续执行
移动的方向:
- 发送者启动迁移:代码当前驻留在哪台机器上或者正在哪台机 器上执行,就由该机器来启动迁移。如向计算服务器上载程序
- 接收者启动迁移:代码迁移的主动权掌握在目标机器手中。 如Java 小程序
资源和进程的绑定方式
- By identifier----like URL(强绑定方式 )
- By value–like standard libraries: C等(较弱绑定方式 )
- By type------like monitors, printers (弱绑定方式 )
资源对机器的绑定方式
- Unattached resources不同机器间可移动
- Fastened resources移动复制代价高
- Fixed resources不能移动
资源的迁移方式:建立全局引用GR,移动MV,复制CP,进程与本地资源重新绑定RB
4 进程间通信
4.1 Layered Protocols
- 物理层:负责对电平信号(位)的传输 ;
- 数据链路层:帧校验和纠错 ;
- 网络层:路由 ( 面向连接 X.25 , 面向非连接的IP);
- 传输层:消息的无损传送,并保持进入时的次序(TCP/UDP)
- 会话层:提供对话控制、对正在会话的对话者进行跟踪 以及同步功能
- 表示层:消息表示(为了实现各机器内部表示方式不同 的数据传递) ;
- 应用层:公共事务遵循的一个杂项协议的集合 .
Client-Server TCP:T/TCP-省略了连接开始的三次握手 ,缩短了连接结束时TIME_WAIT状态持续时间。更快、更高效和更可靠
4.2 中间件协议
中间件是一种应用程序,许多应用层的协议可以由它完成
中间件的通信类型
Persistent持久通信-存储起来 ;Transient瞬时通信
Asynchronous异步通信; Synchronous同步通信-阻塞
6 种不同语义的通信方式
1.持久异步通信-邮箱
2.持久同步
3.瞬时异步
4.Receipt-based 瞬时同步
5.Delivery-based 瞬时同步
6.Response-based 瞬时同步
4.3 RPC远程过程调用
允许程序去调用位于其它机器上的过程。消息的传送与 I/O操作对于程序员不可见
如何供分布式透明性: 实现客户存根stub和服务器存根stub,接口与过程实现分离。
执行一个RPC共10步
异构系统传参数
值(大小端模式)
指针:指针只在使用该指针的进程所在的 地址空间内才有意义
建立 RPC 协议:规定-消息的格式;数据的表示标准及对复杂数据操作步骤;消息的交换方式-TCP/IP协议
生成 Client/Server Stub:通过对 IDL 描述的接口编译产生
原始RPC 的缺点: 必须消息传递;隐含同步方式
改进: asynchronous RPC
DCE软件
DCE RPC 的目标
使远程过程可访问 ;
透明性:隐藏通信细节和底层硬件差异
开放性:采用统一的协议
RPC 特性
- 隐藏通信细节,提供了分布式透明性
- RPC 是瞬时同步通信
RMI :远程方法调用
4.4 面向消息的通信
面向消息的瞬时通信
1.套接字:是一种通信端点,包含 IP 地址和 port ,在一对端口之间可以进行消息传递。只支持简单的 send 和 receive 原语,利用协议栈 (TCP/IP) 进行网络通信,不适合专用协议。瞬时同步
2.MPI:适合进程间标准消息传递的并行程序设计平台;最佳的可移植性
MPI 假定通信在一个已知进程组中, 每个组有 ID ,组内每个进程也有一个局部ID,(组 ID ,进 程 ID )对就可以唯一的确定消息来源或者目的地。
支持四种瞬时通信语义 (3,4,5,6)
支持一组消息传递原语
基于消息传递的并行程序执行模式:
- SPMD 模式:单程序多数据流,初始复制多份程序代码并独立执行
- MPMD 模式:多程序多数据流,初始启动多个可执行代码,
面向消息的持久通信
消息队列系统
- 面向消息的中间件(MOM)
- 提供消息的中介存储能力
- 应用程序可以通过向指定队列插入消息来实现通信。只保证送达,不保证送达的时间。
- 需要给出目的消息队列的名字(系统内唯一)
消息如何送达
队列-网络地址映射表
消息如何解析
message broker ,格式转换
实例: IBM MQSeries - 所有队列由队列管理器管理
- 一对队列管理器通过消息通道相连
每个消息通道都有且只有一个与其对应的发送队列, 通道两端的 MCA 都启动时,消息沿通道传输 - 消息通道提供单向可靠连接
- 消息通道两端各自有一个消息通道代理MCA
- 应用程序接口和队列管理器可使用 RPC 通信
消息如何传递
消息中应包含有目标地址(接收消息的队列管理器,目标队列名字)
指明本地发送队列
( 发送队列,目标队列管理器 ) 表
别名表:别名可以适应队列管理器的变化
4.5 Data Stream
时间敏感的信息交换。如连续媒体播放传送等。
数据流是数据单元的序列,可以应用于离散或连续的媒体。如 TCP/IP 连接的面向字节的离散数据流,和面向播放音频文件的连续数据流;连续数据流关键是采用同步传输模式。
传输模式
- 异步传输模式:数据项逐个传输,无时间限制。
- 同步传输模式:端到端最大延迟
- 等时传输模式:须按时传输,端到端延迟有上限和下限约束
简单流;复杂流,各子流之间是时间敏感的
确保 QoS服务质量
时间敏感的需求 - 数据传输所需要的比特率;
- 创建会话的最大延时;
- 端到端的最大延时;
- 最大延时抖动;
- 最大往返延时;
QoS控制方法 - 资源预留:带宽,缓冲区, CPU 资源
- 缓存(消除延时抖动)
- 纠错
- 交错传输
- 队列控制
流同步
连续流保持同步,同步建立在流的数据单元层次上 ,只要保证两个流的数据单元同步;在发送方同步
5 命名系统
5.1 名称、标识符、访问点、地址
命名服务将名字和计算机中的一个对象(可以是远程)相关联,通过名字可以方便地找到对应的对象
- 一个名字标识一个对象,它们之间的联结叫做绑定
- 实体访问点:特殊的实体,是访问实体的接口
(1)可以有多个访问点
(2)实体可以改变访问点
(3)访问点可赋给另一个实体 - 地址:实体访问点的名字,指向实体的一个访问点
- 位置独立性:实体的名字与他的地址无关
- 真正的标识符是具有以下属性的名字
(1)一个标识符最多引用一个实体
(2)每个实体最多由一个标识符引用
(3)一个标识符始终引用同一个实体 - 地址(机器可读的名字)和标识符(用户友好的名字)
命名与实体定位
5.2 无层次命名
(1)广播、转发指针
广播:将包含实体所用标识符的消息广播到每个结点,拥有该标识符的结点返回相应的地址
网络规模变大时,广播很低效;网络带宽被请求数据包浪费;很多主机接收到它无法回答的请求,可转换成多播,只有符合条件的一组主机才会接收到请求。
实体迁移如何定位:转发指针,每个转发指针都以 (客户存根、服务器存根)对的形式实现,当实体移动时在原位置留下指针(客户存根),指向新位置(安装对应服务器存根)。
优点:很简便,一旦找到实体之后,客户就可以顺着转发指针形成的链来查找实体的当前地址。
缺点:如果不采取特殊措施,链会很长,以致定位开销很大;链很脆弱,易断开。
重定向转发指针: 存储shortcut
链断开怎么办: 让创建对象的机器始终保留对象当前位置的引用
(2)基于宿主位置
持续跟踪实体的当前位置,可以使用特殊的技术来预防网络故障或进程失效。缺点:宿主需始终存在,使用了固定的宿主位置,地域扩展性差;解决方法:在传统的命名服务中注册宿主位置,客户查找宿主位置
(3)分布式散列表 Chord系统(从0开始标号)
node被组织成逻辑环,被赋予随机的m位标识符,entity被赋予一个特定的m位键值,含有键值K的实体位于含有最小标识符ID且ID≥K的节点上,每个结点n只知道其后继节点successor(n) (实际存在的).
finger table:指状表,提高效率,结点知道successor(n + 2^( i-1)),i=1…m(实际存在的)
基于指状表的查找:查找 k ,结点 p 将请求转发给指状表中索引比 k 小的最大节点 (ppt29习题)
(结点的加入与离开,需要更新指状表)
(4)分层方法
最底层的域称为叶域
每个域 D 都有关联的目录结点 dir(D) ,目录结点会跟踪域中的实体
根目录结点包含全部实体位置记录
客户如何定位一个实体:从最小的域开始,自底向上查找,找到记录后,自顶向下定位(到叶域)
通过缓存引用来提高定位效率
根节点要存储所有实体的位置记录和指向低层目录结点的指针,处理查找和更新请求,会成为瓶颈。可将根结点分成多个子结点,在定位服务覆盖网上均匀的放置子结点
5.3 结构化命名
名称空间
如果路径名中的第一个结点是命名图的根,那么该路径称为绝对路径名,否则,称为相对路径名。
硬链接 vs 软链接
Mount两种方法
- 将外部空间安装到分布式系统需要-访问协议,服务器,被安装点
- 增加新的 Root 结点
名称空间逻辑上可分为三层
全局层:良好的可用性 ,变化少,客户可缓存信息提高性能
行政层:类似全局层
管理层:要求性能很好,经常更新 ,通常不采用客户端缓存
zone:一个名字服务器管辖的区域
名称解析
(1)迭代名称解析
(2)递归名称解析
优点:更有效的缓存结果、通信开销较小
例子:DNS,主机名的书写方法:叶节点名. 三级域名. 二级域名. 顶级域名
5.4基于属性的命名
在分布式系统中,最常用的一种是用(值,属性)来描述实体,通常称为基于属性命名。基于属性的命名系统又称为目录服务。类似数据库查询
6 同步
6.1时钟同步
- 物理时钟:实际测量的时间(例如:平均太阳日、原子时钟)
物理时钟校准:UTC接收器;Cristian算法: s 在 时 刻 t 传回给p,来回时间Tround=min+Δ1+Δ2+min ,用t+Tround/2来估计当前时间,时间服务器是被动的;Berkeley UNIX 中时间服务器主动定期地询问每台机器的时间,计算出平均值并告诉所有的机器进行调整。 - 逻辑时钟:对于某一类算法,重要的是内部各时钟的一致
- Lamport 逻辑时钟
用因果关系来描述进程事件发生的顺序
(1)事件定序关系HB:对于事件e1、e2
①如果存在进程p,p包含e1、e2, 且e1在e2前发生,则 e1–> e2
②如果存在消息m,e1为Send(m),e2为Receive(m),则e1–> e2
③如果e1–> e2&e2–>e3,则e1–>e3
④如果e1–>e2,e2–>e1均不成立,则e1和e2可以并发:e1||e2
(2)一种逻辑时钟的定义:设每个进程p有一个逻辑时钟计数Tp,则:
①在进程p的一个事件发生前,执行Tp=Tp+1
②当进程p发送消息m时,在m上携带时钟值:(m, Tp)
③当进程q接收消息(m, Tp)时,取Tq=max{Tq,Tp}
(3)逻辑时钟排序与HB的关系
①如果p–>q,则Tp<Tq
②如果Tp<Tq,则p–>q不一定成立:可能有p||q
4)逻辑时钟与事件全排序
用序对(Tp,pa)来进行定序。其中Tp为时间的逻辑时钟值,pa为进程p的优先级,称之为时间戳。逻辑时钟值相同时,优先级高者优先。
如果事件 a 、b 存在因果关系, a 为 因, b 为果,那么 C(a)<C(b) ,但反过来,知道 C(a)<C(b) 并不能知道 a 、 b 事件的关系。标量时钟无法识别时钟的推进是局部事件引起 , 还是包文交换引起的。因此引入向量时钟
6.2 向量时钟
用向量时钟捕获因果关系 。
事件 a 的向量时钟 VC(a) ,对于某一事件 b ,有 VC(a)<VC(b) ,则 a 在因果关系上先于 b
每个进程Pi和一个时间向量VCi[1,2,…,n]相关联,其中:
(1)向量元素VCi[i]描述进程Pi自身的逻辑时钟进展情况.
(2)向量元素VCi[j]表示进程Pi所知道的关于进程Pj的逻辑时钟进展情况.
(3)向量VCi[1,2,…,n]组成进程Pi对于逻辑全局时间的局部视图.
进程Pi向量时钟修改规则如下:
(1)发生一个事件之前,Pi更新VCi[i]:
VCi[i]:= VCi[i] + d (d>0);
(2)每个报文带有发送时的向量时钟,当收到一个带时间戳的报文(m, VCj,j)时,Pi更新VCi:
VCi[k]:=max(VCi[k], VCj[k]) 1<= k <=n;
VCi[i]:=VCi[i] + d (d>0);
使用向量逻辑时钟方法确定的各事件的逻辑时间 ,知道时间前进的原因
因果有序多播
使用向量时钟,确保所有先于某个消息的所有消息被接收后才传送这个消息。时钟只在接收和发送消息时更新,消息正确递交的条件:
6.3 分布式互斥算法
当一个进程使用某个共享资源时,其他进程进程不允许对这个资源操作。
临界区:对共享资源进行操作的程序段
1.集中式算法
每一个资源有一个协调者进程管理,保证了互斥,无饥饿问题,单个协作者会成为性能瓶颈。
①每完成一次临界区操作,要发Request、Reply、Release三个消息
②当协调者进程故障,需安排新进程代替:选一个进程,通知其它进程,建立相应队列,恢复工作
2、非集中式
将单个协作者变为多个协作者,采用投票的方式,某个进程要访问资源,需要从m>n/2个协作者中获得多数投票
通信量:3mk个消息
优点:当某个协作者崩溃时,能快速恢复
缺点:重置将使协作者忘记之前的授权许可。且当多个进程要访问同一资源,可能出现都得不到足够投票,发生饥饿或死锁
3、分布式
①Lamport算法
基本思想:要想获得某一资源的使用权,必须征得所有结点的同意;冲突时,按“定序”进行处理
主要数据结构:每个进程拥有一个全局请求队列
算法思路:
(1)进程p进入临界区时,向系统中所有进程发送Request(Tp, p),并将此请求放入自己的请求队列
(2)当进程q接到此消息,将其放入自己的请求队列,并返回一个带有时间戳的Reply(Tq):[Tq>=Tp+1];
(3)当Request(Tp, p)按“定序”规则排在p的队列首位时,p进入临界区,否则p等待
(4)当p退出临界区时,从自己的队列中去掉Request(Tp, p),并向其它进程发出Release
(5)当q接到Release后,将相应的Request(Tp, p)从自己的队列中删除。然后看自己是否正在等待此临界区:
a)如果是,则转3;
b)如果不是,不做任何进一步的工作。
Lamport算法讨论:
(1)每完成一次临界区操作,要发Request、Reply、Release消息各n-1个(3(n-1))
(2)时间戳及全排序保证不死锁
②Lamport算法的改进
改进思路:
(1)Request消息:p必须让系统中的其它n-1个进程知道它的需求,这n-1个消息时必须的
(2)Reply消息:
a.如果进程q未在临界区内,且现在也不打算进入临界区,则同意p的进入请求,向p发Reply
b.如果进程q在临界区内,则不向p发Reply,并将此Request挂入请求队列
c.如果进程q正打算进入临界区,则看Tp<Tq是否成立:
i. 成立,同意p的进入请求,向p发Reply; ii. 不成立,则将此Request挂入相应队列,此时不发Reply
(3)按照发Reply消息的原则,当未发Reply的进程使用完临界区后,再向原来发Request的进程发送Release消息
发送的Reply和Release消息的总数为n-1。只用2(n-1)条消 息就可以完成一次对临界区的操作
改进算法讨论:
(1)实现互斥,没有饥饿和死锁,需要2(n-1)个消息,不存在单个故障点
(2)多个故障点
(3)新来者问题——参与此活动的进程都需要知道彼此的名字,当一进程新参与时,要完成相应的工作
(4)故障问题——某参与者故障时,会使算法失效,这可用监测方法解决
(5)改进算法最适用于进程数目较少且成员不发生变化的情况
4、令牌传递算法
① 基于环结构的令牌传递算法
单向环(令牌右传):没有进程要进入临界区时,令牌绕环高速传递。单向环—被动等待
双向环—请求驱动 ( 请求右传 , 令牌左传 )
②基于非环结构的令牌传递算法
全局n维令牌向量VT=(vt1,vt2,…vtn), vti 为对应的进程已获得服务的Request 次数
每个进程维持一个请求队列
令牌不用一直传送,只在被申请时才向申请者发送;令牌丢失问题;队列维护和令牌向量的协调工作。
6.4 选举算法
如果协调者发生故障,需选择另一个副本代替其运行,这种选举过程称选举算法。选举算法总是找拥有最大号码的进程
1、欺负算法:高优先级进程做协调者
2、基于环结构的算法 (单向右传,建立活跃表 ):构造一个包含自身进程号的选举消息发给它的下一个有效后继者,并将自己的进程号加入到消息表。消息绕环一周,在活跃表中选最高者为协调者。
3、无线环境中的选举算法:生成树
7 复制和一致性
7.1 复制的原因
- 可靠性(防止单点失效)
- 性能(扩展性)
将数据的副本放置在处理它们的进程附近以减少访问时间,解决可伸缩性问题
7.2 以数据为中心的一致性模型
一致性模型实质上是进程和数据存储之间的一个约定。即,如果进程同意遵守某些规则,那么数据存储将正常运行。正常情况下,一个进程在一个数据项上执行读操作时,它期待该操作返回的是该数据在其最后一次写操作之后的结果
持续一致性模型
- 范围:数值偏差(未收到其他副本的更新数,权重-已提交值与因未收到其他副本更新产生的最大差分)、副本之间新旧程度的偏差,顺序偏差(副本的暂时更新操作)
一致性单元(conit):受控的数据集
一致性单元粒度:
粗粒度:任一个更新操作都导致更新传播
细粒度:当一个数据更新时,另一个数据无需更新
一致性分类 - 严格一致性:写操作在任一时刻对所有进程都是可见的,一旦存储器中的值改变,后读出的都是新更改值。 反之,无论后面的写操作有多快,前面的读操作仍应是原来的值。(不现实)
- 顺序一致性:任何有效的交错都是可以接受的行为,但所有进程必须看到相同的访问操作次序。每个进程的操作都是符合程序内部的顺序。
- 线性一致性:满足顺序一至性约束,同时满足时间戳的顺序
- 因果一致性:所有进程必须以相同的顺序看到具有因果关系的写操作
- FIFO一致性:一个进程的写操作被其它进程以相同的顺序接收到,但不同进程的写操作在不同进程看来次序可以是不同的
- 弱一致性:同步变量S仅有一个相关操作,即同步操作,该操作同步数据存储的所有副本。弱一致性模型要求满足以下几点:
①对同步变量的访问是顺序一致性的(即所有进程都以相同的顺序看到同步变量执行的所有操作)
②在所有先前的写操作完成之前,不能访问同步变量(即要求在所有副本上完成所有的写操作)
③在先前所有同步变量的访问完成前,不能访问(读或写)数据(即保证所得到的数据是最新的)
对一组操作的一致性约束, 不是单独的读或写。以簇的形式访问共享变量时,模型很有用。
- 释放一致性:弱一致性存在的问题,即当访问同步变量时,存储器并不知道这是因为进程已完成对共享变量的写操作还是要开始读共享变量。若能够区分进入还是离开临界区的话,应用起来会更有效。因此,引入释放一致性,需要提供两种操作:
获取(acquire)—— 访问用于通知存储器系统临界区已就绪。
释放 (release)——访问表明临界区刚退出。
遵守以下规定:
①在访问共享变量前,进程所有先前的获取访问都必须成功地完成;
②在允许释放访问前,进程先前的所有读写操作都必须结束;
③获取访问和释放访问必须是FIFO一致的。 - 入口一致性:不用在整个共享数据上,而是每个共享数据都有一个关联的同步变量;使得多个包含不同共享数据的临界区可以同时执行,从而增加系统的并行度,付出的代价是多个同步变量的额外开销和复杂性。
标准:
①只有某一进程的保护共享变量全部被更新以后,该进程才允许执行同步变量的获取访问;
②在一进程以互斥模式访问该进程的同步变量之前,不允许其它进程持有此同步变量 ;
③在结束互斥模式下对一个同步变量的访问后,任意其它进程必须与该变量的拥有者核查,才能试图以非互斥模式访问该同步变量。
一致性模型总结
7.3 以客户为中心的一致性模型
保证一个客户对数据存储的访问是一致的、不考虑不同客户之间的并发访问
1、最终一致性:如果很长时间不发生更新操作,则所有的副本将逐渐变为一致的
2、假设:
①每个数据项X有一个拥有者,只有拥有者可以修改X
②客户的读写操作在本地副本上进行
③更新最终将传播给其他副本上
3、记号
①Xi[t]:表示t时刻本地副本Li中数据项x的版本
②WS(Xi[t]):产生Xi[t]的所有写操作的集合
③WS(Xi[t1];Xj[t2]):WS(Xi[t1])中的写操作在t2时刻在副本Lj上执行
4、一致性模型
单个进程在两个不同副本上执行操作
-
单调读一致性:如果一个进程读取数据项X的值,那么该进程对X执行的任何后续读操作将总是得到第一次读取的那个值或更新的值(读之前,写都要传过来)
-
单调写一致性:一个进程对数据项X执行的写操作必须在该进程对X执行任何后续写操作之前完成(写之前,写都要传过来)
-
读写一致性:一个进程对数据项X执行一次写操作的结果总是会被该进程对X执行的后续读操作看见(read your write)
-
写读一致性: 同一进程对数据项X 执行的读操作之后的写操作,保证发生在于 X 读取值相同或比其更新的值上(write follow read)
7.4 复制管理
1、副本服务器的放置问题:从N个位置中选出K个最优位置
基于距离的方法
最优:使得服务器与其客户之间的平均距离最小
距离:延迟、带宽等指标来衡量
基于单元的方法
划分成多个单元
选择 K 个密度最大的单元放置副本服务器
2、副本类型
永久副本:构成分布式数据存储的初始集合;静态的,固定的;数量较少
服务器发起的副本:提高性能。当负载突然发生变化时,减少服务器负担,减少客户的通信开销
动态复制算法:服务器Q上的F资源的-访问计数cnt,删除计数del,复制计数rep,判断是否删除、迁移或复制到其他服务器
cnt(Q ,F ) < del(Q ,F )-remove;del(Q ,F ) < cnt( P,F ) < rep(Q ,F )-migrate;cnt(Q ,F ) > rep(Q ,F ) -replicate
客户启动的副本,也称为客户高速缓存。用于改善数据的访问时间,适用于大部分操作是读操作时
高速缓存的放置:放置在客户所在的机器、放在客户所在地局域网上的某个共享的机器上、在广域网的某些特定点放置高速缓存服务器。
3、更新的传播
(1)只传播更新的通知
数据量少,占用很少网络带宽,适用于读/写比较低时
(2)传送更新数据
数据量多,占用较多网络带宽,适用于读/写比较高时
(3)传送更新操作
占用较少带宽,但是要求副本有较高处理能力
4、推协议和拉协议
(1)推协议
①不需要其他副本请求,更新就传播给副本
②通常用于永久性副本和服务器启动的副本
③适用于读写比非常高的情况
④保持较高的一致性
(2)拉协议
①由客户请求服务器发送更新
②通常用于客户高速缓存
③适用于读写比比较低的情况
④当cache没有命中时,响应时间较长
7.5 一致性协议
1、基于主备份的协议
①每个数据项都有一个主备份,由主备份负责管理在数据项x上的写操作
②实现了顺序一致性
③分为远程写协议和本地写协议
- 远程写协议
①所有操作都转发给单个固定的远程服务器
②所有写操作转发给单个固定的远程服务器,读操作在本地副本执行 - 本地写协议
①主副本在要执行写操作的进程之间迁移
2、复制写协议:写操作可以在多个副本上执行
(1)主动复制协议
每个副本有一个相关联的进程,将所有更新操作发给各个副本关联的进程执行相应的更新操作
问题:更新顺序问题,实现顺序一致性
①全序多播:Lamport时间戳
②中心协调器(定序器):给每个操作分配一个唯一的序列号,转发给各个副本
(2)基于多数表决的复制写协议:多个副本同时执行写操作
基本算法
设有N个副本
设置读团体Nr,写团体Nw
要求:①Nr+Nw>N ②Nw>N/2(①防止读写操作冲突②防止读读操作冲突)
3、实现以客户为中心的一致性
每个写操作 W 都被分配一个全局唯一的标 识符 。对于每个客户,跟踪两个操作集。 读操作集是由客户所执行的读操作相关的写操作组成的 。写操作集由客户执行的写操作的标识符组成。
单调读:执行读操作时,服务器获得客户的读操作集,确保写操作已在本地执行或转发,执行读操作,与读操作相关的写操作以及新的写操作加入客户的读操作集
单调写:执行写操作时 ,服务器获得客户的写操作集 ,写操作按正确顺序执行, 执行写操作,将新的写操作加入写操作集
读写一致性:客户执行读操作之前,确保写操作集的所有操作已经执行,执行读操作,将写操作加入读操作集
写读一致性:在写操作之前,先根据客户的读操作集里的写操作来更新服务器,执行写操作,将写操作和读操作集中的写操作加入写操作集
8 容错性
8.1 基本概念
1、概念
缺陷(Defect):系统中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。
故障(Fault):是造成错误的原因。
失效(Failure):系统不能兑现它的承诺。
关系:缺陷 ->故障-> 失效
分布式系统容许部分失效,并可以从部分失效中自动恢复,不会严重影响系统整体性能
2、容错与系统可靠性相关。可靠性包括:
(1)可用性:系统准备好可以立即使用
(2)可靠性:给定的环境和时间区间连续提供期望服务的能力
(3)安全性:系统临时失效不发生灾难性事故
(4)可维护性:恢复失效系统的难易
3、故障类型
(1)暂时故障:只发生一次,然后就消失了,即时重复操作也不会发生。如果传输超时重发。
(2)间歇故障:错误出现后,消失不见,然后再次发生,如此反复。连接器接触不良。
(3)持久故障:直到故障组件被修复之前持续存在的故障。芯片燃烧。
4、处理机故障分类
(1)失败缄默(Fail_silent)故障
失效的处理机只是停止运行,对接下来的输入不作反应也不产生进一步的输出。
(2)拜占庭(Byzantine)故障(随意性故障)
出错的处理机继续运行,产生错误的结果,并可能和其它出错的处理机一起“恶意”的工作,给人一种工作正常的假象。
5、冗余
通过冗余来容错,隐藏故障的发生。处理失效的关键技术
(1)信息冗余:增加额外数据位以使出错的数据完全恢复。例如,海明码可用于附加在传输数据上,以使数据能从传输线的噪音中恢复。
(2)时间冗余:动作执行后,必要时可再次执行。例如:原子事务处理,若一个事务处理失败,它可无负作用地再被执行(对于暂时性和间断性错误特别有用)。
(3)物理冗余:使用额外部件或进程。物理冗余可以在硬件上也可以在软件上。例如,使用冗余的处理机,冗余的进程等。
8.2进程恢复
1、进程容错
冗余:进程组
当有消息发送到进程组时,组中的所有成员都接收该消息。
2、平等组与等级组
(1)平等组
平等组是对称的,所有决定共同做出没有单独失败点
做出决定比较复杂,需要表决,开销和延迟
(2)等级组
组中有一个协调者,协调者做决定,存在单独失败点
3、进程组的管理方式
(1)使用组服务器
(2)分布式管理,采用可靠多播
正常退出,向所有成员发送再见消息;发生故障时,组成员退出:
(1)fail-stop类型:发送Goodbye信息
(2)fail-silent类型:需其他成员发现
消息同步:
(1)加入组时:立刻收到所有消息
(2)退出组时:不在收到任何消息
4、故障掩盖和复制进程
通过复制进程并将他们组织在一个组中。用一个容错的进程组来取代一个脆弱的进程。
如何复制进程?
(1)基于主进程的协议:采用等级组方式,一个主进程协调所有写操作
(2)复制的写协议:组成平等组,可采用多数表决(团体)方式
5、进程需要复制的程度
取决于想要达到的容错量,k容错——可在k个部件出故障时仍正常工作。
- fail_silent型:k+1个冗余部件可满足k容错的要求。
- Byzantine型:至少需2k+1个处理机才能达到k容错。最坏情况下,k个失效处理机偶然(或甚至有意)产生同样的应答。则剩下的k+1个未出错的也将产生相同的应答,因此客户或表决器只要相信大多数的应答就可得到正确的结果。
6、分布式协同一致算法的目标是使所有无故 障进程对待某些问题的意见达到一致,并在有限的步 骤内进行处理达成一致,需要考虑:消息传递是否可靠;进程会崩溃吗;系统是同步还是异步
可取得一致的三种情况:
(1)处理机同步方式、通信延时有限
处理机可用超时检测机制,确定其他失败进程
(2)消息有序,广播式传输
每个处理机原子式广播一个初始值,其他处理按照次序接收,能够同意谁是第一个发送的。
(3)处理机同步,消息有序
7、拜占庭协定问题
结论:如果要想容忍m个判国者,必须保证总的将军的个数大于3m,即无故障进程需要超过总数的 2/3,才能达成协定
8.3 可靠的组间通信
1、可靠的点到点通信
通过使用可靠的传输协议来掩盖某些故障。(TCP建立点到点的可靠通信)
(1)遗漏性故障:通过TCP确认和重传可以掩盖
(2)崩溃性故障:TCP无法掩盖,通常会抛出一个异常信号,通知客户进程
2、可靠的RPC通信
RPC系统中发生的5种失败形式:
(1)客户不能定位服务器;(让错误抛出一个异常)
(2)客户到服务器的请求信息丢失;(返回应答或确认之前定时器超时,那么就重新发送消息)
(3)服务器在收到请求之后崩溃;(区分执行操作前崩溃和执行操作后崩溃)
区分这两种情况的3种方法,但是都不大行,吸引人的方法应该具有恰好一次的语义
①在服务器重启之前等待并再次尝试操作。(至少一次语义)
②立刻放弃并报告失败。(最多一次语义)
③什么都不保证。
(4)从服务器到客户的响应消息丢失;(每个请求编号,防止重复执行)
(5)客户在发送请求之后崩溃;
①日志文件,保存崩溃前的操作;②再生,把时间分为顺序编号的时期。
3、可靠的组间通信(多播服务):确保消息被传送到进程组中的所有成员。
区分不同情况:
(1)有故障进程时,保证所有正常组成员都接收到消息
(2)无故障进程时,保证消息被所有当前组成员接收(假设没有进程加入或离开组)
①简单可靠多播策略:不支持有很多接收方,因为每个接收方都要返回消息,产生反馈拥塞
解决:接收方只在消息丢失时才返回一个反馈,减少反馈的规模,但不能保证永远不会发生反馈拥塞(如果所有接收方都没有接收到消息);发送方不得不将所有消息保留在历史缓存区中
无层次反馈抑制:支持可扩展,仅当发现收到的信息丢失时才回应,随机延时回应,抑制其他进程同时回应
分层次的反馈控制:本地协作者把消息转发给他的孩子然后再处理重发请求
②原子多播:确保消息要么发送给所有成员,要么一个也不发送
③虚同步:只保证应用程序看到的结果是同步的
区分消息接收和消息递交
分布式系统中的同步形式:
- 同步系统----时间上一致;
- 松弛同步----时间上延迟, 顺序一致;
- 虚同步—顺序不保证。
组视图:在发送一个消息时,属于该组的所有进程的名单;
视图变更:当有进程加入或退出组时。
虚同步组播不保证接收者收到报文的顺序,只保证在发送报文 m的进程失效的时候, G中的其它进程要么都收到报文m, 要么 都忽略报文m
④多播排序的四种方法:
(1)不排序的多播:是一种虚拟同步多播,不保证接收到的消息的递交次序是相同的
(2)FIFO顺序的多播:从同一发送者进程接收到消息的递交次序和其发送次序一致
(3)按因果关系排序多播:具有因果关系的消息的递交次序与发送次序一致,无论消息是不是同一个发送者发送的。可以使用时间戳向量实现。
(4)全序多播:对所有组员的消息递交次序相同的。原子多播就是提供全序递交的虚拟同步可靠多播。
虚拟同步可靠多播总结
⑤如何实现虚拟同步
保证发送到视图G的所有消息在G发生改变之前被传送到G中的所有正常进程。解决:可以让G中的每个进程在确认G中的所有进程接收到m之前保留m。如果G中的所有进程都接收到m,那么m就被称为是稳定的,稳定的消息只允许传送一次。不稳定的消息在G改变时,需广播出去,接收反馈,变成稳定消息。
8.4分布式提交
1、两阶段提交协议可以实现分布式环境下的事务特性,但是可能导致事务阻塞。
(1)协作者先向所有的参与者发送一个Vote-request消息
(2)参与者收到消息后,根据自己的情况返回同意提交Vote-Commit或拒绝Vote-Abort消息
(3)协作者收集来自参与者的所有投票。如果都同意则协调者向所有参与者发送Global-Commit消息。如果有一个参与者返回拒绝,则协作者决定取消并多播一个Global-Abort消息
(4)每个参与者都等待协作者最后发来的消息,根据消息执行相应的操作,提交或取消事务。
2、事务阻塞
(1)参与者可能在INIT状态阻塞
超时没有收到投票请求消息,参与者在本地终止事务
(2)协作者可能在WAIT状态阻塞
超时没有收到所有参与者的表决,协调者做出中止表决决定,并向所有参与者发消息
(3)参与者可能在READY状态阻塞(不好解决)
参与者不能简单做出中止事务的决定
3、参与者 P 处于 Ready 状态,与另一个参与者 Q 通信后,可能采取的动作
4、三阶段提交协议:在有故障时,避免进程阻塞,
协作者多发【准备提交消息】
实现比较复杂,通信次数也比较多,实际应用不多。
8.5 恢复
1、错误恢复的两种形式:回退恢复和前向恢复
(1)回退恢复:主要问题是要将系统从当前的错误状态回到先前的正确状态。必须定时记录系统的状态,即设置一个检查点。
Checkpointing 设置(包括存储)和更新
1 存储:
(1) 每一个Checkpointing被组播到每一个备份模块.
(2) 每一个Checkpointing被存储在它的本地稳定存储
2 更新:
当进程正确地从一个旧Checkpointing运行到一个新的 Checkpointing时,旧的Checkpointing要被新的Checkpointing 更新.
用2个库实现原子更新:
设A, B两个库存放Checkpointing,A库更新完后,再更新B库。在每一个库更新前后都要写入一个时间戳。
TA1、TA2分别表示A库更新前后的时间戳;
TB1、TB2分别表示B库更新前后的时间戳;
TA1、TA2、TB1和TB2初始值相同(假设为0)。
更新过程:
①TA1=TA1+1;②A库更新;③TA2=TA2+1;
④TB1=TB1+1;⑤B库更新;⑥TB1=TB2+1;
4种可能情况:
if TA1=TA2=TB1=TB2 then 正常;
if TA1>TA2=TB1=TB2 then copy B to A; /*A更新中失效
if TA1=TA2>TB1=TB2 then copy A to B; /*A更新结束,B更新前失效
if TA1=TA2=TB1>TB2 then copy A to B; /*B更新中失效
checkpointing设置问题
设置不恰当导致:报文丢失(有发无收),孤儿报文(有收无发),全局检查点状态是强一致的指没有上述两种类型的报文
两种设置方式:
Independent -各进程周期性地、独立地保存自己的运行状态,不相互协商(状态不一致),但是在恢复时需要相互协商。可能产生多米诺效应
Coordinated -建立 Checkpointing 时协商,使其满足一致性状态,恢复时不需要协商,Sync-and-Stop ( SNS )算法
(2)前向恢复:在这种情况下,当系统进入错误状态时,尝试从可以继续执行的某点开始把系统带入一个正确的新状态。前向错误恢复机制的关键:必须预先知道会发生什么。
最后
以上就是默默小伙为你收集整理的分布式系统原理与应用复习1 分布式系统简介2 分布式系统体系结构3 进程4 进程间通信5 命名系统6 同步7 复制和一致性8 容错性的全部内容,希望文章能够帮你解决分布式系统原理与应用复习1 分布式系统简介2 分布式系统体系结构3 进程4 进程间通信5 命名系统6 同步7 复制和一致性8 容错性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复