第3章分布式系统的同步中国科技大学软件学院丁箐2主要内容3.1时钟同步3.2互斥3.3选举算法3.4原子性事务3.5分布式系统中的死锁3主要内容3.1时钟同步3.2互斥3.3选举算法3.4原子性事务3.5分布式系统中的死锁43.1时钟同步分布式算法的特点相关信息散布在多个场地上每个进程只能基于本地信息做决定应避免因单点故障造成整个系统的失败不存在公共时钟或精确的全局时间5时钟同步问题例:makefile误差时间output.o:cc–Coutput.c21442145214621472142214321442145根据本地时钟的时间根据本地时钟的时间进行编译的计算机进行编辑的计算机创建output.o创建output.c时间6逻辑时钟计时器:石英晶体+计数器时钟偏差(clockskew)逻辑时钟:相对时间物理时钟:真实时间“之前”关系:–事件a在b之前出现,则ab–a为发送消息m,b为接收m,则ab–具有传递性:ab,bc,则ac并发事件(concurrent)7Lamport算法对每一事件a,在所有进程中都认可给它分配一个时间值C(a)–ifab;则C(a)C(b)–a,bC(a)C(b)–C是递增的校正算法–ab,–ifC(b)C(a),则C(b)=C(a)+1860544842363024181260807264564840322416801009080706050403020100ABCD(a)76704842363024181260857769614840322416801009080706050403020100ABCD(b)012012Lamport算法时间慢快慢快9物理时钟与现实时钟(1)如何用现实世界的时钟将它们同步起来;(2)如何使各时钟之间保持同步。太阳日:连续的两次日中天的时间太阳秒:solar-day/86400平均太阳秒:如,格林威治时间10现实时钟铯原子钟:9192631770次跃迁=1秒TAI秒:国际原子时间UTC秒:世界时间(在TAI秒中加入闰秒)时间服务:WWV电台、GEOS卫星102011时钟同步算法如何与现实时钟同步如何使不同机器之间相互同步设机器时钟值Cp(t),t为UTC时间–最大偏移率–精确时钟:dC/dt=1–快时钟:dC/dt〉1–慢时钟:dC/dt1时钟时间,CUTC,tdC/dt1dC/dt=1dC/dt1稍快时钟最佳时钟稍慢时钟12Christian’s算法--逐步调整法时间服务器,可接受WWV的UTC时间每隔δ/2ρ校准时间(允许误差δ,存在误差ρ)o两个问题:时间决不能倒退,延迟o假设:每秒产生100次中断,每次中断将时间加10毫秒若调慢时钟,中断服务程序每次只加9毫秒;若加快时钟,则加11毫秒。传播时间13Berkeley算法–主动式方法1.时间监控器定期查询其他机器时间2.计算出平均值3.通知其他机器调整时间3:003:003:003:003:252:50时间守护3:000-10+253:252:503:05+5+15-203:053:05网络(a)(b)(c)14平均值算法–非集中式方法1.将时间划分成固定长度的再同步间隔,第i次间隔开始于T0+iR,而结束于T0+(i+1)R2.所有机器广播自己的时钟时间3.启动本地计时器收集在S时间间隔中到达的其他机器广播的时间4.执行平均时间计算算法,得到新的时间值(取平均值,去掉两端值)15多个外部时间源法例:OSFDCE方法1.接受所有时间源的当前UTC区间2.去掉与其他区间不相交的区间3.将相交部分的中点作为校准时间时间16使用同步时钟最多一次消息提交1.每个消息携带一个ID和一个时间印ts(timestamp)2.服务器的表T中,记录每个连接C最近的时间印t3.如果到达的消息m,ts(m)t,则拒绝m服务器要一直保存一个全局变量G=CurrentTime–MaxLifetime–MaxClockSkew•所有G的时间印从表T中清除•对于具有新的ID的到达消息m,如果ts(m)G则拒绝m,否则,接受m•按照一定时间间隔T,定期地将G写入磁盘。•当系统重启后,G’=G+T17使用同步时钟基于时钟的缓存一致性1.当客户读取一个副本到缓存时,设置一个租期(lease)2.在租期过期之前,客户可更新副本,重续租期3.如果已经过期,缓存中的副本失效改进的一致性协议•当客户修改文件时,只需将所有没有到期的缓存副本设为无效•如果某个客户崩溃,则等待直到该客户的租期过期18主要内容3.1时钟同步3.2互斥3.3选举算法3.4原子性事务3.5分布式系统中的死锁193.2互斥基本概念–当一个进程使用某个共享资源,其他进程不允许对这个资源操作临界区(CriticalSection):–对共享资源进行操作的程序段基本方法:–信号量、管程问题:–死锁–活锁–饥饿20集中式算法(仿照单处理机系统的方法)协调者:确定那个进程可进入临界区通信量:3个消息:请求-许可-释放缺点:单点失败单协调者会成为执行的瓶颈CCC21WinThread临界区CreateMutex()WaitForSingleObject()ReleaseMutex()InitializeCriticalSection()EnterCriticalSection()LeaveCriticalSection()22分布式算法(Ricart-Agrawala算法)要求系统中所有事件都是全序的1.在一个进程P打算进入临界区R之前,向所有其他进程广播消息临界区R名、进程号、时间印2.当一个进程P’收到消息后,做如下决定:•若P’不在临界区R中,也不想进入R,它就向P发送OK消息;•若P’已经在临界区R中,则不回答,并将P放入请求队列;•若P’也同时要进入临界区R,但是还没有进入时,则将发来的消息和它发送给其余进程的时间戳对比。如果P时间印小,则P发送OK消息;否则,不回答,并将P放入请求队列;3.当P收到所有的OK消息后,进入R。否则,等待。4.当P退出R时,如果存在等待队列,则取出请求者,向其发送OK消息。23分布式算法举例举例:共有0,1,2三个进程。进程0,2申请进入临界区02002224分布式算法评价缺点:•n点失败•n点瓶颈•2(n-1)个消息改进方案:–超时重发–组通信–简单多数同意比原来集中式算法慢,复杂,昂贵,而且不健壮。25令牌环算法构造一个逻辑环,得到令牌才可进入临界区326三种互斥算法的比较算法每次进出需要的消息进入前的延迟(按消息次数)存在问题集中式32协调者崩溃分布式2(n-1)2(n-1)任何一个进程崩溃令牌环1到∞0到n-1丢失令牌,进程崩溃27主要内容3.1时钟同步3.2互斥3.3选举算法3.4原子性事务3.5分布式系统中的死锁283.3选举算法许多分布式算法需要一个进程充当协调者,发起者,排序者或其他特定的角色。作用:做出统一的的决定–例如:确定协调者29欺负(Bully)算法将进程进行排序1.P向高的进程发E消息2.如果没有响应,P选举获胜3.如果有进程Q响应,则P结束,Q接管选举并继续下去。45656465630环算法所有进程按逻辑或物理次序排序,形成一个环1.当一个进程P发现协调者C失效后,向后续进程发送E消息2.每个进程继续向后传递E消息,直到返回P3.P在将新确定的协调者C’传给所有进程5231主要内容3.1时钟同步3.2互斥3.3选举算法3.4原子性事务3.5分布式系统中的死锁323.4原子性(Atomic)事务原子性:组成原子事务的一组操作要么全部执行,要么一个也不执行,并且事务失败后能返回到最初状态例1:老式磁带系统(备份)例2:汇款(提款存款)33事务模型稳定存储器(StableStorage):–通过一对双工磁盘实现34事务原语(1)BEGIN_TRANSACTION:标记一个事务的开始;(2)END_TRANSACTION:结束事务并设法提交;(3)ABORT_TRANSACTION:取消事务并恢复旧值;(4)READ:从一个文件(或其他类型的对象,如数据库)读取数据;(5)WRITE:将数据写入一个文件(或其他类型的对象,如数据库)35事务举例BEGINTRANSACTIONreserveWP-JFKreserveJFK-NairobireserveNairobi-MalindiENDTRANSACTIONBEGINTRANSACTIONreserveWP-JFKreserveJFK-NairobiNairobi-MalindifullABORTTRASACTION当第三个航班的机票预定失败后事务中止预定三个航班机票:中转站是JFK、Nairobi36事务的特性1.原子性(Atomic):对外部世界来说,事务的发生是不可分割的;2.一致性(Consistent):事务不会破坏系统的恒定;3.隔离性(Isolated):并发的事务之间不会互相干扰;可串行性(Serializable):多个事务并发执行的结果,与它们顺序地执行效果相同。4.持久性(Durable):一旦一个事务提交,它的更新结果不会因故障而丢失。37隔离性(Isolated)BEGIN_TRANSACTIONx=0;x=x+1;END_TRANSACTIONBEGIN_TRANSACTIONx=0;x=x+2;END_TRANSACTIONBEGIN_TRANSACTIONx=0;x=x+3;END_TRANSACTION(a)(b)(c)调度1调度2调度3x=0;x=x+1;x=0;x=x+2;x=0;x=x+3;x=0;x=0;x=x+1;x=x+2;x=0;x=x+3;x=0;x=0;x=x+1;x=0;x=x+2;x=x+3;合法合法不合法时间(d)38事务的实现私有工作空间与影子更新:当进程启动事务T时,分配一个私有工作空间W,在提交或中止T前所有的读写操作都是在W中进行0‘3‘影子块39先写日志(WAL)就地更新(in-place)日志纪录–〈事务标识,文件标识,块号,前像,后像〉例:40先写日志协议回滚(Rollback):–反做(undo)废弃事务的更新结果只有当日志成功地写入稳存之后,才可以修改文件。–如果事务执行成功并被提交,则它的提交记录将被写入日志。–如果事务异常中止,则用日志来备份初始状态。从日志的未尾开始,向回逐个读取日志记录,反做记录中描述的修改,即回滚处理。在系统崩溃后,日志也可用来进行的恢复。41示例x=0;y=0;BEGIN_TRANSACTIONx=x+1;y=y+2;x=y*y;END_TRANSACTION(a)x=0/1x=0/1y=0/2x=1/4x=0/1y=0/2(b)(c)(d)日志日志日志(a)一个事务(b)-(d)每条语句执行前的日志42两阶段提交协议(two-phasecommitprotocol)准备阶段:取得一致决定执行阶段:执行命令(提交或废弃)43并发控制(ConcurrencyControl)加锁法正确性标准:可串行性(serializable)封锁–加锁:获得资源上的封锁–解锁:释放已拥有的锁封锁的类型和相容性–读锁(R)–写锁(W)锁的粒度–细粒度:如字段–粗粒度:如文件RWR√☓W☓☓44两阶段封锁协议(2PL)恰好在需要或不再需要锁时去请求或释放锁可能会导致不一致和死锁?加锁阶段–开锁阶段严格的2PL与2PC结合避免级联废弃(cascadedabort)死锁:等待图(WFG)检查是否有环路超时检测(timeout)45乐观法(Optimistic)最适合于基于私有工空间的情况读阶段:将文件读入私有工作区1.确认阶段:提交前,检查是否有冲突–有,则废弃事务,重启。–无,则提交事务2.写阶段:如可以提交,则将修改内容从私有工作区,写入文件。46时间戳(Timestamp)每个事