整体(“爹!”)https://zhuanlan.zhihu.com/p/341819774
基本组播和可靠组播 https://blog.csdn.net/fragile98/article/details/113880738
有序组播 https://www.icode9.com/content-4-872325.html
两阶段锁
本文是在“整体”上,结合自己的看法和老师给的考察框架总结的,其他的同上一篇(包括跪拜)
may the flame guide thee
目的
假设
执行临界区的应用层协议
基本要求
安全性(ME1)
活性(ME2)
顺序(ME3)
性能
带宽消耗,在每个enter和exit操作中发送的消息数
客户延迟,进程进入、退出临界区的等待时间
同步延迟,进程切换所消耗的时间
架构
满足安全性和活性,但不满足顺序要求(请求过程有延迟)
性能分析:
带宽消耗
客户延迟,消息往返时间导致请求进程的延迟
同步延迟,一个消息的往返时间
中央服务器是瓶颈
满足安全性和活性,但不满足顺序性
性能分析
带宽消耗,由于令牌的传递会持续消耗带宽
客户延迟
同步延迟
基本思想
进程进入临界区需要所有其它进程的同意
并发控制
伪码算法
性能分析
带宽消耗
客户延迟,一个消息往返时间
同步延迟,一个消息传递时间
基本思想
Maekawa 将每一个进程都关联到一个选举集 Vi 中
算法伪码
可以修改算法避免死锁,则修改后算法满足安全性、活性、顺序性
性能分析
基本概念
基本要求
安全性
活性
性能分析
每一个进程有到下一个进程的通信通道,按顺时针发送消息给邻居
目的
基本思想
伪码算法
性能分析
最坏情况
最好情况,2N
且不具备容错能力
假设
三种消息类型
如果它具有最大的进程标识符,它会决定自己是协调者,并向其他进程宣布。该算法为“霸道算法”
算法伪码
性能分析
区分一下组播和广播
组播通信系统模型
multicast(g,m),进程发送消息给进程组 g 的所有成员
deliver(m),传递由组播发送的消息到调用进程
如果
组播进程不出错
Unicast 是可靠的
发送方不崩溃
我们认为信息可以最终传送到组内
两个原语
性质(建议结合下一张图理解,别卡着)
有效性和协定保障了整体的活性(overall liveness):如果一些正确的进程组播了信息m,那所有正确进程都会传递信息m。
例子
如果一个进程B-multicast到一半崩溃了,其他一半进程deliver了m,另一半没有。就破坏了协定(Agreement)
可以用于投票,但不一定用于投票,思路上要分开
(以发动者为开始)初始化为空(其他参与者收到消息后也初始化参与信息为空)
收到信息后检查信息m是否已经在收到的参与信息,不在则添加其中((全局消息)完整性)。如果发起者不是收到信息者,组播信息(协定)上传最新信息到应用层(有效性)
算法评价
“java中组播的例子好像是先建立一个虚拟ip,然后组中的都从这个ip接受。
这样服务器只用往虚拟ip发,所有人都可以收到。”
特点
实现
)(设想发送json格式,多一个元素“序号”,内容是全组人公认的下一个消息好,怎么公认是共识机制的事情,这里假设都打成了共识)
有Rq > Rg,q, 则漏掉了一个或多个消息。将消息暂存在保留队列中,并发送否认确认NACK,要求重新发送丢失消息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRczfNiv-1638620904415)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211202171527672.png)]
•算法评价
•完整性
•通过检测重复消息和IP组播性质实现
•有效性
•仅在IP组播具有有效性时成立
•协定
•需要:进程无限组播消息(保证有机会探测消息丢失,因为是被动NACK)+无限保留消息副本时成立(一旦收到NACK,重发)à 不现实
•某些派生协议实现了协定
•如果一个正确的进程发出multcast(g, m),然后发出multicast(g, m’),那么每个投递m’的正确的进程将在m’前投递m。
•保证每个进程发送的消息在其它进程中的接收顺序一致
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3fMyk6bG-1638620904416)(https://www.icode9.com/i/ll/?i=20210220132606355.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyYWdpbGU5OA==,size_16,color_FFFFFF,t_70)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88ynWzze-1638620904417)(https://www.icode9.com/i/ll/?i=20210220133037431.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyYWdpbGU5OA==,size_16,color_FFFFFF,t_70)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3IRRUzJ-1638620904418)(https://www.icode9.com/i/ll/?i=20210225162800342.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyYWdpbGU5OA==,size_16,color_FFFFFF,t_70)]
全排序不能保证因果
因果也不能保证全排序
以下是满足因果排序的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0TkkOO5-1638620904419)(https://www.icode9.com/i/ll/?i=20210225163609830.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyYWdpbGU5OA==,size_16,color_FFFFFF,t_70)]
但是下图不满足全排序,在圈出来的两个地方的两个信息传递的顺序不一样。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4K3XP5x-1638620904419)(https://www.icode9.com/i/ll/?i=20210225163657610.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyYWdpbGU5OA==,size_16,color_FFFFFF,t_70)]
简单的说,FIFO就是本地看到谁先来就是谁,因果要求有因果的事件可以看出排序,无因果顺序先后都行,全排序要求所有节点对事件排序一致
共识问题:一个或多个进程提议一个值后,应达成一致意见
•pi: 进程i
•vi: 进程pi的提议值(proposed value)
•di: 进程pi的决定变量(decision value)
基本要求
问题描述
与共识问题区别
每一个进程提供一个值,最终就一个值向量达成一致
算法要求
两个条件
简化模型
使用一个将军发送多个中尉的形式来证明,发送命令的将军称为司令,接受命令的将军称为中尉:
对 N <= 3f 的不可能性 (作恶的人超过1/3即忠臣不可打成共识)
n1、n2、n3
P1、P2、P3,分别模拟 n1、n2、n3个将军(组和个原理类似)
解决方案
正确的将军通过两轮消息取得一致
性能讨论
串行等价
两个事务串行等价充要条件
应用
串行等价可作为一个标准用于生产并发控制协议
互斥锁是一种简单的事务串行化机制
两阶段加锁,事务释放任何一个锁后,都不允许再申请新的锁
若并发执行的所有事务均遵守两段锁协议
,则对这些事务的任何并发调度策略都是可串行化
的。严格的两阶段加锁
读写锁
事务冲突规则
死锁:死锁是一种状态,在该状态下一组事务中的每一个事务都在等待其它事务释放某个锁
预防死锁
每个事务在开始运行时锁住它要访问的所有对象(两阶段锁?)
次序加锁
死锁检测
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKLruCuu-1638620904422)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211202213322564.png)]
锁超时,解除死锁最常用的方式
乐观策略
基于事实,大多数应用中,两个客户事务访问同一个对象的概率很低
方法
事务三阶段
工作阶段(给副本拿着用(指读写),分配个事务号)
验证阶段(用户表示结束,系统看冲突没)
更新阶段(不冲突就更新)
事务的验证
事务号
冲突规则
事务验证必须保证事务的对象之间的重叠遵循规则 1 和规则 2。有两种验证方式
向后:较早的重叠事务
检查Tv的读集是否和其它较早重叠(Tv进入提交开始之前开始的新事务(可能已经先结束))事务的写集是否重叠
算法
startTn+1=T2,finishTn=T3(俺寻思这里的Tv应该是指图上T1)
向前:重叠的活动事务(工作阶段的事务)
算法
n验证失败后,冲突解决方法
向前验证和向后验证的比较
年少无知,人颂我写;年老言休,人写我读
一个事务放弃后会被重启,但不能保证事务最终能通过验证检查
利用信号量,实现资源的互斥访问,避免事务饥饿
时间戳
基本思想
冲突规则
写请求有效
读请求有效
基于时间戳的并发控制
临时版本
读和写时间戳
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7p7H36D-1638620904425)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211203153300522.png)]
if (Tc ≥ D的最大读时间戳 && Tc > D的提交版本上的写时间戳)
在D的临时版本上执行写操作,写时间戳置为 Tc
else /* 写操作太晚了 */
放弃事务 Tc
abc中T3大于提交版本T1的时间戳,所以图上有T3,表示事务被接受。不管上一个是否是紧密相连的(b),后面有没有其他更新的事务(先接受3再接收4,注意这里4是临时版本!)
d中4从临时变为提交版本,就没必要收3了,T3放弃,不在记录(图中出现)
规则3,决定是否接收事务Tc对对象D执行的读操作
if (Tc > D提交版本的写时间戳)
设Dselected是D的具有最大写时间戳的版本≤Tc;
if (Dselected已提交)
在Dselected版本上完成读操作
else
等待直到形成Dselected版本的事务提交或放弃,然后重新应用读规则;
}else
放弃事务 Tc
举例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cjZvecAL-1638620904426)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211203155919962.png)]
我方以时间戳T3请求,服务器方a中有个提交板T2,b中虽然有T4,但因为是临时版本不影响,C中针对临时版本想读(被选中),那就只能等临时版本写完,d中T4>T3,类似给报社说要读10.1的报纸但摊位只有10.2的报纸,读取失败
时间戳应用举例
开始时假设ABC三个账户(对象)刚被(编辑用户S)初始化写入
随后T要B中账户转账给A,先请求读对象,B维护的读序列序列加上T,然后写对象B,写对象A,期间U编辑者想编辑B,但发现B上一个时间戳事件还是临时状态,于是系统拒绝U对B的读并等待T转为提交版B,提交后UgetB的读取版,B的读取序列也加上U
这章比较烦(也可能是那段时间病了全靠自己理解),几个控制方法的应用对比,ppt后面很多题很有代表性,建议看一下
概念
复制的动机:增强服务
增强性能
提高可用性
增强容错能力(正确性)
基本要求
复制透明性
一致性
无论主动或被动复制,都基于该模型,问题在于客户和复数个副本管理器交互方式
组件
前端
副本管理器
一个副本管理器 + 多个次副本管理器
操作事件次序
请求:前端将请求发送给主副本管理器
协调(排序):主副本管理器按接收次序对请求排序(FIFO,因果,全排序)
执行:主副本管理器执行请求并存储响应
协定(共识)
响应
可线性化一致性
操作的次序由时间决定
链式复制可以提供可线性化
被动复制(主备份)可以提供可线性化
模型
请求:前端使用全序、可靠的组播原语将请求组播到副本管理器组
协调:组通信系统以同样的次序(全序)将请求传递到每个副本管理器
执行:每个副本管理器以相同的方式执行请求
协定:鉴于组播的传递语义,不需要该阶段(因为组播,已经服务器对数据状态已经有了共识)
响应
目的:复制数据上的事务
单拷贝串行化
读一个写所有
本地验证(不懂)
本地验证用来确保任何故障或恢复事件不会在事务的执行过程中发生
个人理解:通过用户的事件过程可以推断故障顺序,如果抵触,则一方为假,不适用拷贝算法并回滚复原
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wd3r3ON8-1638620904428)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211204183045198.png)]
N 出故障 ->T 在 X 上读对象 A;T 在 M 和 P 上写对象 B ->T 提交 ->X 出故障
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mka9D8uV-1638620904429)(C:\Users\14182\AppData\Roaming\Typora\typora-user-images\image-20211204183104404.png)]
X 出故障 ->U 在 N 上读对象 B;U 在 Y 上写对象 A ->U 提交 ->N 出故障
X出故障在T验证之后,U验证之前-> U验证在T验证之后 ->两个序列不相容
如果 T 检查 N 不可用,而 X、M、P 可用,T 提交
当正常工作的副本管理器不能和另外的副本管理器通信时,可用拷贝算法不能使用
Gossip 定义:又称反熵,表示在杂乱无章中寻求一致
特点:
体系结构
系统的两个保证
随着时间的推移,每个用户总能获得一致服务
副本之间松弛的一致性
查询和更新流程
请求(爹帮个忙):前端将请求发送至副本管理器
更新响应(嗯收到了):副本管理器立即应答收到的更新请求
协调(刚刚谁先说话?):收到请求的副本管理器并不处理操作,直到它能根据所要求的次序约束处理请求为止
执行(我记个账):副本管理器执行请求
查询响应:副本管理器对查询请求立即作出应答
协定:副本管理器通过交换 gossip 消息进行相互更新
前端的版本时间戳
每个前端维护一个向量时间戳
向量时间戳的作用
副本管理器状态
Coda 目标:
扩展(相对AFS亮点):
体系结构
Venus/Vice 进程
卷存储组(VSG)
可用的卷存储组(AVSG)
文件访问过程
关闭文件
复制策略
乐观策略
Coda 版本向量(CVV,Code Version Vector )
作为时间戳附加在每个版本的文件上
CVV 中每个元素是一个估计值,表示服务器上文件修改次数的估计
目的:提供足够的关于每个文件副本的更新历史,以检测出潜在的冲突,进行手工干预和自动更新
例如 CVV = (2,2,1)
冲突检测
文件关闭