产生背景:应用驱动+技术支撑
分布式系统优点:支持业务固有的分布性、经济性、性能提升、可靠性提升
定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。硬件角度:各个计算机是自治的,通过网络互联;软件角度:用户看到一台逻辑计算机。(互联、协作、单一视图)
(1)使远程资源可访问
分布式系统的最主要目标是使用户能够方便地访问远程资源,并且以一种受控的方式与其他用户共享这些资源。
(2)透明性:隐藏进程和资源分布在多台计算机上的事实。
透明性的程度和具体应用相关,同时还要考虑性能问题( 副本能提高性能,但保持副本的一致性需要进行更新传播 )。透明性是要牺牲一些效率来达到的。具体透明性如下:
(3)开放性
根据一系列准则来提供服务,这些准则描述了所提供服务的语法和语义。分布式系统中服务通常通过接口来提供 ,而接口一般通过接口定义语言来描述
(4)可扩展性
规模扩展:方便的增加资源和用户(限制:集中的服务、数据及算法)
地域扩展:用户和资源相隔距离(限制:通信延迟、不可靠通信)
管理扩展:能跨越多个独立的管理机构(限制:安全问题、收费问题)
解决扩展性的技术
a.隐藏通信延迟
采用异步通信方式,避免等待响应
采用多线程技术,提高并发
减少通信量,胖客户端
b.分布:DNS,WWW分布式web项目
c.复制技术:扩展通常会导致性能的下降,复制能增加可用性,提高性能,利于负载均衡,但存在一致性问题。-复制也可隐藏通信时间
(1)分布式计算系统:用于高性能计算任务
①集群计算系统
底层硬件由类似的工作站或者PC集组成,通过高速局域网紧密相连,每个结点运行相同的操作系统(具有同构性)
②网格计算系统
异构的(硬件、操作系统、网络等都不尽相同)系统,把不同计算机的资源集中起来,进行协调工作
(2)分布式信息系统:适用于大型企业或者组织对信息进行管理和事务处理,解决大型企业或组织对大量网络应用、信息的集成和管理。
①事务处理系统(分布式数据库应用)
用户看到的是一个完整的数据库,但是数据实际是分布在多个计算机结点上,事务处理系统能提供有效的存取手段来对数据进行处理。事务处理的特征是所有操作要么被完全执行,要么不执行。
②企业应用集成:将各个应用集成起来,应用之间可以直接交换信息。
(3)分布式普适系统:移动和嵌入式设备加入到系统中,以便访问信息
①智能家居系统:把家庭中的设备集成为单个系统,能够进行自我配置和
自我管理
②电子健保系统:用于日常监视个人健康程度,在需要的时候与医生联系
软件体系结构: 软件的组件,以及组件之间的相互关系。
要素:组件-模块单元,具有良好的接口
链接器-实现组件间通信的机制
软件体系结构样式:如何表示一个软件体系结构
常见的体系结构样式 :
软件体系结构的具体实例 :集中式体系结构(客户/服务器模型–CS)、非集中式体系结构(点对点系统—P2P)、混合体系结构
客户 / 服务器模型
Server :服务器是实现特定服务的进程
Client :是通过往服务器发送请求来请求服务,然后等待服务器回复的进程
请求 / 答复模式:Client和Server分别扮演服务请求者和服务提供者。服务器监听请求,客户提出请求、接收响应;服务器等待请求,客户等待响应。
应用分层(逻辑三层):用户接口层、处理层、数据层
多层体系结构
物理两层体系结构:
逻辑上三层部署在物理上的两层上
(1)客户机,只含有实现(部分)用户接口的程序
(2)服务器,包含了其余的部分,即实现处理和数据层的程序
物理三层体系结构:
服务器有时会担任客户机的角色;用户接口、应用程序服务器、数据库服务器
多层是按纵向划分,也可以按横向划分:垂直分布(不同功能的分布)、水平分布(相同功能的复制)
c/s 适合集中式网络服务
点对点系统(P2P):网络上的所有节点都可以“平等”共享其他节点的计算资源,所有网络节点上的设备都可以建立P2P对话。(既可以是客户也可以是服务器))
P2P适合分散式服务,如即时通信、点对点文件传输、视频会议等(eg.napster )
结构化的点对点体系结构
逻辑上的结构,方便快速查找,eg. Chord系统-基于Hash运算,CAN上下文可编址网络-基于虚拟的 d 维笛卡尔坐标
非结构化的点对点体系结构
每个节点维护一个邻节点列表,泛洪查找–>改进:超级对等体(维护索引或充当代理)
将集中式和非集中式体系结构组合,eg.BitTorrent 系统,其目录的存储是集中的,但文件系统是分散的
中间件在应用程序和底层操作系统之间,其目的是要提供分布式透明性
中间件如何不同应用程序的需求:
拦截器:可中断正常执行的控制流,插入执行其他代码
进程----- 程序的一次执行过程;资源分配的最小单位;
线程-----CPU分配的单位;程序执行的最小单位,资源调度的最小单位
为什么引入线程的: 提高并发程度, 适合多核, 通信代价小
(1)不必使进程因等待某事件而阻塞,提高了进程的执行效率;
(2)多处理/多核上可使线程并行执行;
(3)IPC需要内核干预,上下文切换代价高,线程可通过数据共享实现;
(4)软件工程的需要,有些应用程序需要一组相互协作的任务完成。
线程的实现以线程包的形式提供,分为:
定义:将一台计算机虚拟为多台逻辑上的计算机
原因:
虚拟机体系结构
计算机系统提供了不同层次的接口以实现不同的虚拟化技术,如下图
①由机器指令组成的硬件和软件之间的接口
虚拟化可采用两种方式
①进程虚拟机-Runtime System,提供一套抽象指令集来执行程序,如 JVM,在操作系统和应用层之间
②虚拟机监视器VMM-系统屏蔽硬件同时提供机器指令接口,可以有多个不同的操作系统独立并发地运行在同一平台,如VMWare,硬件和操作系统之间
client:
server:
(1)工作方式
等待来自客户的请求,随后处理该请求,返回处理结果,并等待下一个客户请求。
(2)组织结构
迭代服务器(Iterative server):自己处理请求,并将响应返回给发出请求的客户。
并发服务器(Concurrent server):自己不处理请求,将请求传递给某个独立线程或者其他进程来处理,自己立即返回并等待下一个输入的请求。
(3)端口访问
客户如何访问服务器?服务器在端口监听客户的请求。
客户如何知道服务器的端口?为已知的服务分配特定端口,如Http是80端口,FTP是21端口;动态分配
客户端到服务器的绑定:
(4)中断服务
(5)状态
(6) 服务器集群
一组经网络相连的机器,每台机器运行一 个或多个服务器,实现分布式计算 ,逻辑上分三层
1 、存储器、交换机,分配客户请求给服务器
2 、存储器、应用或计算服务器,提供计算或相应处理
3 、存储器、文件或数据库服务器,完成数据处理服务
不同服务运行在不同的机器上,交换机需要区分不同的请求,转发到合适的服务器,可能导致负载不均(代码迁移, 负载均衡算法)
分布式透明性(单点访问, TCP handoff)
为什么要进行代码迁移
代码迁移模型:
一个进程包括:代码段,资源段,执行段(包括当前进程的状态)
移动的强弱:
移动的方向:
资源和进程的绑定方式
资源对机器的绑定方式
资源的迁移方式:建立全局引用GR,移动MV,复制CP,进程与本地资源重新绑定RB
中间件是一种应用程序,许多应用层的协议可以由它完成
中间件的通信类型
Persistent持久通信-存储起来 ;Transient瞬时通信
Asynchronous异步通信; Synchronous同步通信-阻塞
6 种不同语义的通信方式
1.持久异步通信-邮箱
2.持久同步
3.瞬时异步
4.Receipt-based 瞬时同步
5.Delivery-based 瞬时同步
6.Response-based 瞬时同步
允许程序去调用位于其它机器上的过程。消息的传送与 I/O操作对于程序员不可见
如何供分布式透明性: 实现客户存根stub和服务器存根stub,接口与过程实现分离。
执行一个RPC共10步
异构系统传参数
值(大小端模式)
指针:指针只在使用该指针的进程所在的 地址空间内才有意义
建立 RPC 协议:规定-消息的格式;数据的表示标准及对复杂数据操作步骤;消息的交换方式-TCP/IP协议
生成 Client/Server Stub:通过对 IDL 描述的接口编译产生
原始RPC 的缺点: 必须消息传递;隐含同步方式
改进: asynchronous RPC
DCE软件
DCE RPC 的目标
使远程过程可访问 ;
透明性:隐藏通信细节和底层硬件差异
开放性:采用统一的协议
RPC 特性
面向消息的瞬时通信
1.套接字:是一种通信端点,包含 IP 地址和 port ,在一对端口之间可以进行消息传递。只支持简单的 send 和 receive 原语,利用协议栈 (TCP/IP) 进行网络通信,不适合专用协议。瞬时同步
2.MPI:适合进程间标准消息传递的并行程序设计平台;最佳的可移植性
MPI 假定通信在一个已知进程组中, 每个组有 ID ,组内每个进程也有一个局部ID,(组 ID ,进 程 ID )对就可以唯一的确定消息来源或者目的地。
支持四种瞬时通信语义 (3,4,5,6)
支持一组消息传递原语
基于消息传递的并行程序执行模式:
面向消息的持久通信
消息队列系统
时间敏感的信息交换。如连续媒体播放传送等。
数据流是数据单元的序列,可以应用于离散或连续的媒体。如 TCP/IP 连接的面向字节的离散数据流,和面向播放音频文件的连续数据流;连续数据流关键是采用同步传输模式。
传输模式
命名服务将名字和计算机中的一个对象(可以是远程)相关联,通过名字可以方便地找到对应的对象
(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) ,目录结点会跟踪域中的实体
根目录结点包含全部实体位置记录
客户如何定位一个实体:从最小的域开始,自底向上查找,找到记录后,自顶向下定位(到叶域)
通过缓存引用来提高定位效率
根节点要存储所有实体的位置记录和指向低层目录结点的指针,处理查找和更新请求,会成为瓶颈。可将根结点分成多个子结点,在定位服务覆盖网上均匀的放置子结点
名称空间
如果路径名中的第一个结点是命名图的根,那么该路径称为绝对路径名,否则,称为相对路径名。
硬链接 vs 软链接
Mount两种方法
在分布式系统中,最常用的一种是用(值,属性)来描述实体,通常称为基于属性命名。基于属性的命名系统又称为目录服务。类似数据库查询
用向量时钟捕获因果关系 。
事件 a 的向量时钟 VC(a) ,对于某一事件 b ,有 VC(a)
(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);
使用向量逻辑时钟方法确定的各事件的逻辑时间 ,知道时间前进的原因
因果有序多播
使用向量时钟,确保所有先于某个消息的所有消息被接收后才传送这个消息。时钟只在接收和发送消息时更新,消息正确递交的条件:
当一个进程使用某个共享资源时,其他进程进程不允许对这个资源操作。
临界区:对共享资源进行操作的程序段
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
(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 次数
每个进程维持一个请求队列
令牌不用一直传送,只在被申请时才向申请者发送;令牌丢失问题;队列维护和令牌向量的协调工作。
如果协调者发生故障,需选择另一个副本代替其运行,这种选举过程称选举算法。选举算法总是找拥有最大号码的进程
1、欺负算法:高优先级进程做协调者
2、基于环结构的算法 (单向右传,建立活跃表 ):构造一个包含自身进程号的选举消息发给它的下一个有效后继者,并将自己的进程号加入到消息表。消息绕环一周,在活跃表中选最高者为协调者。
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)
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没有命中时,响应时间较长
1、基于主备份的协议
①每个数据项都有一个主备份,由主备份负责管理在数据项x上的写操作
②实现了顺序一致性
③分为远程写协议和本地写协议
2、复制写协议:写操作可以在多个副本上执行
(1)主动复制协议
每个副本有一个相关联的进程,将所有更新操作发给各个副本关联的进程执行相应的更新操作
问题:更新顺序问题,实现顺序一致性
①全序多播:Lamport时间戳
②中心协调器(定序器):给每个操作分配一个唯一的序列号,转发给各个副本
(2)基于多数表决的复制写协议:多个副本同时执行写操作
基本算法
设有N个副本
设置读团体Nr,写团体Nw
要求:①Nr+Nw>N ②Nw>N/2(①防止读写操作冲突②防止读读操作冲突)
3、实现以客户为中心的一致性
每个写操作 W 都被分配一个全局唯一的标 识符 。对于每个客户,跟踪两个操作集。 读操作集是由客户所执行的读操作相关的写操作组成的 。写操作集由客户执行的写操作的标识符组成。
单调读:执行读操作时,服务器获得客户的读操作集,确保写操作已在本地执行或转发,执行读操作,与读操作相关的写操作以及新的写操作加入客户的读操作集
单调写:执行写操作时 ,服务器获得客户的写操作集 ,写操作按正确顺序执行, 执行写操作,将新的写操作加入写操作集
读写一致性:客户执行读操作之前,确保写操作集的所有操作已经执行,执行读操作,将写操作加入读操作集
写读一致性:在写操作之前,先根据客户的读操作集里的写操作来更新服务器,执行写操作,将写操作和读操作集中的写操作加入写操作集
1、概念
缺陷(Defect):系统中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。
故障(Fault):是造成错误的原因。
失效(Failure):系统不能兑现它的承诺。
关系:缺陷 ->故障-> 失效
分布式系统容许部分失效,并可以从部分失效中自动恢复,不会严重影响系统整体性能
2、容错与系统可靠性相关。可靠性包括:
(1)可用性:系统准备好可以立即使用
(2)可靠性:给定的环境和时间区间连续提供期望服务的能力
(3)安全性:系统临时失效不发生灾难性事故
(4)可维护性:恢复失效系统的难易
3、故障类型
(1)暂时故障:只发生一次,然后就消失了,即时重复操作也不会发生。如果传输超时重发。
(2)间歇故障:错误出现后,消失不见,然后再次发生,如此反复。连接器接触不良。
(3)持久故障:直到故障组件被修复之前持续存在的故障。芯片燃烧。
4、处理机故障分类
(1)失败缄默(Fail_silent)故障
失效的处理机只是停止运行,对接下来的输入不作反应也不产生进一步的输出。
(2)拜占庭(Byzantine)故障(随意性故障)
出错的处理机继续运行,产生错误的结果,并可能和其它出错的处理机一起“恶意”的工作,给人一种工作正常的假象。
5、冗余
通过冗余来容错,隐藏故障的发生。处理失效的关键技术
(1)信息冗余:增加额外数据位以使出错的数据完全恢复。例如,海明码可用于附加在传输数据上,以使数据能从传输线的噪音中恢复。
(2)时间冗余:动作执行后,必要时可再次执行。例如:原子事务处理,若一个事务处理失败,它可无负作用地再被执行(对于暂时性和间断性错误特别有用)。
(3)物理冗余:使用额外部件或进程。物理冗余可以在硬件上也可以在软件上。例如,使用冗余的处理机,冗余的进程等。
1、进程容错
冗余:进程组
当有消息发送到进程组时,组中的所有成员都接收该消息。
2、平等组与等级组
(1)平等组
平等组是对称的,所有决定共同做出没有单独失败点
做出决定比较复杂,需要表决,开销和延迟
(2)等级组
组中有一个协调者,协调者做决定,存在单独失败点
3、进程组的管理方式
(1)使用组服务器
(2)分布式管理,采用可靠多播
正常退出,向所有成员发送再见消息;发生故障时,组成员退出:
(1)fail-stop类型:发送Goodbye信息
(2)fail-silent类型:需其他成员发现
消息同步:
(1)加入组时:立刻收到所有消息
(2)退出组时:不在收到任何消息
4、故障掩盖和复制进程
通过复制进程并将他们组织在一个组中。用一个容错的进程组来取代一个脆弱的进程。
如何复制进程?
(1)基于主进程的协议:采用等级组方式,一个主进程协调所有写操作
(2)复制的写协议:组成平等组,可采用多数表决(团体)方式
5、进程需要复制的程度
取决于想要达到的容错量,k容错——可在k个部件出故障时仍正常工作。
6、分布式协同一致算法的目标是使所有无故 障进程对待某些问题的意见达到一致,并在有限的步 骤内进行处理达成一致,需要考虑:消息传递是否可靠;进程会崩溃吗;系统是同步还是异步
可取得一致的三种情况:
(1)处理机同步方式、通信延时有限
处理机可用超时检测机制,确定其他失败进程
(2)消息有序,广播式传输
每个处理机原子式广播一个初始值,其他处理按照次序接收,能够同意谁是第一个发送的。
(3)处理机同步,消息有序
7、拜占庭协定问题
结论:如果要想容忍m个判国者,必须保证总的将军的个数大于3m,即无故障进程需要超过总数的 2/3,才能达成协定
1、可靠的点到点通信
通过使用可靠的传输协议来掩盖某些故障。(TCP建立点到点的可靠通信)
(1)遗漏性故障:通过TCP确认和重传可以掩盖
(2)崩溃性故障:TCP无法掩盖,通常会抛出一个异常信号,通知客户进程
2、可靠的RPC通信
RPC系统中发生的5种失败形式:
(1)客户不能定位服务器;(让错误抛出一个异常)
(2)客户到服务器的请求信息丢失;(返回应答或确认之前定时器超时,那么就重新发送消息)
(3)服务器在收到请求之后崩溃;(区分执行操作前崩溃和执行操作后崩溃)
区分这两种情况的3种方法,但是都不大行,吸引人的方法应该具有恰好一次的语义
①在服务器重启之前等待并再次尝试操作。(至少一次语义)
②立刻放弃并报告失败。(最多一次语义)
③什么都不保证。
(4)从服务器到客户的响应消息丢失;(每个请求编号,防止重复执行)
(5)客户在发送请求之后崩溃;
①日志文件,保存崩溃前的操作;②再生,把时间分为顺序编号的时期。
3、可靠的组间通信(多播服务):确保消息被传送到进程组中的所有成员。
区分不同情况:
(1)有故障进程时,保证所有正常组成员都接收到消息
(2)无故障进程时,保证消息被所有当前组成员接收(假设没有进程加入或离开组)
①简单可靠多播策略:不支持有很多接收方,因为每个接收方都要返回消息,产生反馈拥塞
解决:接收方只在消息丢失时才返回一个反馈,减少反馈的规模,但不能保证永远不会发生反馈拥塞(如果所有接收方都没有接收到消息);发送方不得不将所有消息保留在历史缓存区中
无层次反馈抑制:支持可扩展,仅当发现收到的信息丢失时才回应,随机延时回应,抑制其他进程同时回应
分层次的反馈控制:本地协作者把消息转发给他的孩子然后再处理重发请求
②原子多播:确保消息要么发送给所有成员,要么一个也不发送
③虚同步:只保证应用程序看到的结果是同步的
区分消息接收和消息递交
分布式系统中的同步形式:
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、三阶段提交协议:在有故障时,避免进程阻塞,
协作者多发【准备提交消息】
实现比较复杂,通信次数也比较多,实际应用不多。
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)前向恢复:在这种情况下,当系统进入错误状态时,尝试从可以继续执行的某点开始把系统带入一个正确的新状态。前向错误恢复机制的关键:必须预先知道会发生什么。