第一章
-
为什么需要分布式系统:功能分离,固有的分布性,负载均衡,可靠性,经济性。
-
定义:分布式系统是这样一种系统,其中位于联网计算机上的组件仅通过传递消息来通信和协调它们的操作。
-
特点:
- 并发性:多个程序(进程,线程)并发执行,共享资源
- 无全局时钟:每个机器有各自的时间,难以精确同步,程序间的协调靠交换消息
- 故障独立性:一些进程出现故障,并不能保证其它进程都能知道
-
分布式系统举例:WEB 搜索、大型多人在线游戏、金融交易、区块链系统、语音系统、数据库系统
-
分布式系统趋势:
- 泛在联网与现代互联网
- 移动与无处不在的计算
- 分布式多媒体系统
- 将分布式计算作为公共设施
-
挑战:透明性、异构性、并发、开放性、安全性、可伸缩性、故障处理
第二章
-
系统的体系结构:用独立指定的组件以及这些组件之间的关系来表示的结构。
-
整体目标:确保结构能满足现在和将来可能的需求。
-
体系结构元素:
- 通讯实体:(进程、线程、节点)(对象、组件、web服务
- 通信泛型:进程间通信(套接字、多播、消息传递),远程调用(请求-应答协议、RPC、PMI)
-
体系结构模式:构建在相对原始的体系结构元素之上,提供组合的、重复出现的结构。
- 分层体系结构:一个复杂的系统被分成若干层。每层利用下层提供的服务。中间件是一种软件,它提供基本的通信模块和其他一些基础服务模块,为应用程序开发提供平台。
- 层次化体系结构:层次化是一种从应用角度理解系统的体系结构模式,与分层体系结构互补,是一项组织给定层功能的技术。
- 瘦客户:本地只是一个 GUI ,应用程序在远程计算机上执行。
-
基础模型:对体系结构模型中公共属性的一种更为形式化的描述。
- 交互模型:用来描述延迟的不确定性与缺乏全局时钟的影响。被用来处理消息发送的通讯性能问题,解决在分布式系统中设置时间限制的难题。
- 故障模型:组件、网络等故障的定义、分类,试图给出进程和信道故障的一个精确的约定。定义了什么是可靠通信和正确的进程 。
- 遗漏故障:进程或者通信通道没有正常的工作(进程崩溃、丢失信息)
- 随机故障:对系统影响最大的一种故障,且错误很难探知。
- 时序故障:仅发生在同步分布式系统中
- 安全模型:提供依据,以此分析系统可能收到的侵害,并在设计系统时防止这些侵害的发生。(进程、通信信道、对象)威胁:DoS攻击、移动代码。对策:加密技术与共享密钥、认证、安全通道
第三章:时间与全局状态
-
事件:一个通信动作或进程状态转换动作。
-
进程历史:在进程中发生的一系列事件,按发生在先排序,即
h i s t o r y ( p i ) = < e i 0 , e i 1 , e i 2 , . . . > history(p_i)=<e_i^0,e_i^1,e_i^2,...> history(pi)=<ei0,ei1,ei2,...> -
时钟漂移:震荡频率变化(电源稳定性、环境温度)
-
同步物理时钟:
- 外部时钟:采用权威的外部时间源。
- 内部时钟:无外部权威时间源,系统内时钟同步。
- 关系:若P(时钟集合)在范围D内外部同步,则P在范围2D内内部同步。
- 时钟正确性含义:
- 基于漂移率——漂移率在一个已知的范围内;
- 基于单调性—— t ′ > t → C ( t ′ ) > C ( t ) t'>t→C(t')>C(t) t′>t→C(t′)>C(t)
- 基于混合条件——单调性+漂移率有界+同步点跳跃前进
- 物理时间同步的三种方法:
- Cristian方法:应用条件:存在时间服务器,作为外部时间源消息;往返时间与系统所要求的精度相比足够短。协议:进程P根据消息 m r m_r mr, m t m_t mt计算消息往返时间 T r o u n d Tround Tround根据服务器在 m t m_t mt中放置的时间 t t t设置时钟为: t + T r o u n d / 2 t+Tround/2 t+Tround/2。精度: ± ( T r o u n d / 2 – m i n ) ±(Tround/2 – min) ±(Tround/2–min)。
- Berkeley方法:主机周期轮询从属机时间,主机通过消息往返时间估算从属机的时间,主机计算容错平均值,主机发送每个从属机的调整量。
- NTP:外部同步,高可靠性,拓展性好,安全性强。
-
逻辑时间和逻辑时钟:
- 逻辑时间的引入:节点具有独立时钟,缺乏全局时钟,分布式系统中的物理时钟无法完美同步,事件排序是众多分布式算法的基石。
- 逻辑时钟:众多应用只要求所有节点具有相同时间基准,该时间不一定与物理时间相同。不进行交互的两个进程之间不需要时钟同步。
- 发生在先(偏序):
- 若存在进程 P i P_i Pi满足 e → i e ′ e→_ie' e→ie′,则 e → e ′ e→e' e→e′
- 对于任一消息 m m m,存在 s e n d ( m ) → r e c v ( m ) send(m)→recv(m) send(m)→recv(m)
- 若事件满足 e → e ′ e→e' e→e′和 e ′ → e ′ ′ e'→e'' e′→e′′,则 e → e ′ ′ e→e'' e→e′′
- 并发(X||Y):XY与YX均不成立,则称事件X、Y是并发的。
- Lamport时钟:Lamport 发明的一种简单机制,可以数字化发生在先排序。它规定每个进程维护自己的逻辑时钟(一个单调增长的计数器),进程 P i P_i Pi用它给事件加上Lamport时间戳 L i L_i Li。若进程触发了某个事件,则将该事件标注时间戳为 ( L i + 1 ) (L_i+1) (Li+1);发送消息时,在消息中附带 t = L i t=Li t=Li;接收进程接收消息事件被标注时间戳为 m a x ( L j , t ) max(L_j,t) max(Lj,t)。
- 向量时钟与Lamport时钟的区别:在 P i P_i Pi给事件加时间戳之前,设置 V i [ i ] = V i [ i ] + 1 V_i[i]=V_i[i]+1 Vi[i]=Vi[i]+1。克服了Lamport时钟的缺点: L ( e ) < L ( e ′ ) L(e)<L(e') L(e)<L(e′)不能推出 e → e ′ e→e' e→e′。
- 全局状态:单个进程状态的集合;
S = ( s 1 , s 2 , . . . , s N ) S=(s_1,s_2,...,s_N) S=(s1,s2,...,sN) - 割集:系统全局历史的子集(部分事件的集合,有序)。
C = < h 1 c 1 , h 2 c 2 , . . . , h n c n > C=<h_1^{c1},h_2^{c2},...,h_n^{cn}> C=<h1c1,h2c2,...,hncn> - 割集的一致性:割集C是一致的,即对于任意事件 e ∈ C , f → e ⟺ f ∈ C e∈C,f→e⟺f∈C e∈C,f→e⟺f∈C,即有果必有因。
- 一致的全局状态:对应于一致割集(增量序列)的状态 S 0 → S 1 → S 2 → … S0→S1→S2→… S0→S1→S2→…(系统的执行可以描述成系统全局状态之间的一系列转换)。
- Chandy和Lamport的“快照”算法:为了捕获一致的全局状态(在缺乏类似全局时钟或者全局时钟不可靠的分布式系统中来确定一种全局状态)。算法定义了两个规则:标记发送规则和标记接收规则。前者强制记录下自己状态的进程立即发送一个标记信息,后者强制没有记录状态的进程去记录自己的状态。
第四章:协调和协定
-
分布式互斥:分布式进程常常需要协调它们的动作,如访问共享资源时需要互斥来防止干扰并保证一致性,这对应操作系统领域常见的“临界区”问题。然而分布式系统中原有互斥方法基本均失效,需要一个仅基于消息传递的分布式互斥解决方案。
-
目的:仅基于消息投递,实现对资源的互斥访问。
-
假设:异步系统;无故障进程;可靠的消息投递。
-
基本要求:
- 安全性:在临界区内一次最多有一个进程可以执行。
- 活性:进入和离开临界区的请求最终成功执行。
- 顺序:先请求进入临界区的进程先进入临界区
-
评价指标:
- 带宽:消耗的带宽,与进入和退出临界区发送消息的数量成正比。
- 延迟:每次进入和退出操作导致的客户延迟。
- 吞吐量:用一个进程离开临界区和下一个进程进入临界区之间的同步延迟来衡量。
-
中央服务器算法:满足安全性和活性要求,但不满足顺序要求。
- 带宽消耗:
- enter:2个消息,即请求消息+授权消息
- exit: 1个消息,即释放消息;
- 客户延迟:
- enter: request + grant = 1 round-trip
- exit: release ;
- 同步延迟:
- 1个消息的往返时间:1 release + 1 grant。
- 带宽消耗:
-
基于环的算法:所有程序构成一个环结构,令牌按照顺时针(或逆时针)方向在程序之间传递,收到令牌的程序有权访问临界资源,访问完成后将令牌传送到下一个程序;若该程序不需要访问临界资源,则直接把令牌传送给下一个程序。在分布式领域,这个算法叫作令牌环算法,也可以叫作基于环的算法。
- 满足安全性和活性要求,不满足顺序要求。
- 带宽消耗:由于令牌的投递,会持续消耗带宽;
- 客户延迟(enter):
- Min: 0个消息,正好收到令牌;
- Max: N个消息,刚刚投递了令牌;
- 同步延迟:
- Min: 1个消息,进程依次进入临界区;
- Max: N个消息,一个进程连续进入临界区,期间无其他进程进入临界区。
-
基于组播和逻辑时钟的算法:进程进入临界区需要所有其它进程的同意。要进入临界区的进程组播一个请求消息,并且只有在其他进程都回答了这个消息时才能进入。采用Lamport时间戳避免死锁,请求进入的消息形如 < T , P i > <T,P_i> <T,Pi>,如果请求具有相等的时间戳,那么请求将根据进程的标识符排序。
- 满足安全性、活性和顺序要求。
- 带宽消耗:
- enter: 2(N-1),即(N-1)个请求、 (N-1)个应答。
- 客户延迟:1 round-trip (multicast);
- 同步延迟:1个消息的传输时间(无exit,vs round-trip)。
-
Maekawa投票算法:进程进入临界区不需要所有进程同意(部分即可)
- 满足安全性,活性和顺序性。
- 带宽消耗:
- enter:需要 2 n 2\sqrt{n} 2n个消息
- exit:需要 n \sqrt{n} n个消息
- Ricard:2(N-1)
- 客户延迟:1 round-trip
- 同步延迟:1 round-trip
-
-
分布式选举:选择一个唯一的进程来扮演特定角色的算法。
-
含义:集群一般是由两个或者两个以上的服务器组建而成,每个服务器都是一个节点。对于一个集群来说,多个节点到底是怎么协调,怎么管理的呢,解决方法是选出一个“领导”来复杂调度和管理其他节点。这个所谓的“领导”,在分布式中叫做“主节点”,而选“领导”的过程叫做“分布式选举”。
-
基本要求:
- 安全性:参与进程 P i P_i Pi的 e l e c t e d i = ⊥ elected_i=⊥ electedi=⊥或 e l e c t e d i = P elected_i=P electedi=P(有效进程 pid最大值)。
- 活性:所有进程 P i P_i Pi都参加并且最终置 e l e c t e d i ≠ ⊥ elected_i≠⊥ electedi=⊥或进程 P i P_i Pi崩溃。
-
基于环的选举算法:
- 目的:在异步系统中选举具有 最大标识符 的进程作为协调者。
- 基本思想:按逻辑环排列一组进程, id 不必有序。
- 性能
- 最坏情况:启动选举算法的逆时针邻居具有最大标识符,共计需要3N-1个消息,周转时间为3N-1
- 最好情况:周转时间为2N
-
霸道算法:
- 同步系统,使用超时检测进程故障。
- 通道可靠,但允许进程崩溃。
- 每个进程知道哪些进程具有更大的标识符
- 每个进程均可以和所有其它进程通信
- 性能:
- best: N − 2 N-2 N−2
- worst: N 2 N^2 N2
-
-
组播通讯:发送一个消息给进程组中的每个进程。
-
基本组播:B-multicast(g, m):对每个进程p∈g,send(p, m);进程p receive(m)时:p执行B-deliver(m)。
-
可靠组播:
- 协定:如果一个正确的进程投递消息m,那么group中其它正确的进程终将投递m。
- 区别:B-multicast 不保证协定(sender中途失效)。
-
实现可靠组播的方法:协定表明了 B-Multicast 不能再基于一对一的send来实现,因为组播进程在send中途出现故障时,会导致剩余进程无法Deliver该消息。可行方案如下:
- 用基本组播实现可靠组播:满足完整性,满足有效性,满足协定,但是效率低。
- 用IP组播实现可靠组播:将IP组播、捎带确认法、否定确认结合起来,实现可靠的Multicast和Deliver。
-
-
共识、交互一致性及拜占庭将军问题含义:这三类问题统称为协定,即在一个或多个进程提议了一个值应当是什么后,使系统内所有进程对这个值达成一致的意见。
- 共识问题:一个或多个进程提议一个值后,应达成一致意见。
- 基本要求:
- 终止性:每个正确的进程最终设置它的决定变量。
- 协定性:如果 P i P_i Pi和 P j P_j Pj是正确的且已进入决定状态,那么 d i = d j d_i=d_j di=dj。
- 完整性:如果正确的进程都提议了同一个值,那么处于决定状态的任何正确进程都已选择该值。
- 共识算法:每个进程组播它的提议值;每个进程收集其它进程的提议值每个进程计算 V = m a j o r i t y ( v 1 , v 2 , … , v N ) V = majority(v_1, v_2, …, v_N) V=majority(v1,v2,…,vN)。其中 m a j o r i t y ( ) majority() majority()函数为抽象函数,可以是 m a x ( ) max() max()、 m i n ( ) min() min()等。
- 基本要求:
- 拜占庭将军问题:3个或更多将军协商是进攻还是撤退;1个将军(司令)发布命令,其他将军(中尉)决定进攻或撤退;一个或多个将军可能会叛变;所有未叛变的将军执行相同的命令 。
- 拜占庭将军问题要求:
- 终止性:每个正确进程最终设置它的决定变量。
- 协定性:所有正确进程的决定值都相同。
- 完整性:若司令正确,则所有正确进程采用司令提议的值。
- 与共识问题的区别:一个独立的进程提供一个值,其他进程决定是否采用。
- 拜占庭将军问题要求:
- 交互一致性:每个进程提议一个值,就向量达成一致。决定向量: 向量中的每个分量与一个进程的值对应。
- 交互一致性的要求:
- 终止性:每个正确进程最终设置它的决定变量。
- 协定性:所有正确进程的决定向量都相同。
- 完整性:如果进程pi是正确的,那么所有正确的进程都把vi作为他们决定向量中第i个分量。
- 交互一致性的要求:
- 共识问题:一个或多个进程提议一个值后,应达成一致意见。