文章目录
分布式
一、介绍
1.目标
通信基本是不可靠的,构建一个看起来很少失败的系统,尽管它的组件经常出现故障
2.可靠的通信层
- ack:利用接收方返回的ack来判断是否成功
- 发送方需要保存副本,等待超时的重发
- 利用计数器来添加发送信号的标识,防止重复的无效发送和接受
3.通信抽象
-
分布式共享内存:在不同的机器上共享一个大的虚拟地址空间
-
远程过程调用(RPC):使在远程机器上执行代码的过程像调用本地函数一样直接
-
存根生成器(协议编译器):自动化打包函数参数和结果,输入服务器希望导出到客户端的一组调用
-
客户端存根创建消息缓冲区:连续字节数组
-
将所需要的信息打包到缓冲区:函数标识符,函数参数
-
消息发送到目标RPC服务器
-
等待回复
-
解包返回代码和其他参数
-
从存根返回到应用程序
-
服务器解包信息:提取函数标识符和参数 主线程负责信息的接受,从线程池中取出一个线程执行
-
调用实际函数
-
打包结果
-
发送回复
-
-
运行时库:
- 通过DNS服务器找到远程服务器
- 构建RPC传输协议,可能会选择UDP更高效地实现
-
4.其他问题
- 远程调用时间过长:没有立即回复时,接收方生成一个显式确认表示已经接收到了
- 大数据传输:将大包分组
- 客户端和服务器一方采用大端序,一方小端序,如果不一样,那么需要转换
- RPC允许异步调用
二、网络文件系统(NFS)
1.定义
一种用于客户端和服务器通信的开放协议
2.简单快速的服务器崩溃恢复
- 无状态:服务器要求客户端提交请求时,能够提供无状态的请求(即每一次都能依靠该状态独立完成运行),那么发生崩溃时,只需要客户端重新发送即可
- 句柄:唯一描述文件或目录
- 卷标识符:告知服务器,请求指向那个文件系统
- inode号:告知服务器,请求访问哪个分区
- 世代号:复用inode
- 过程
- 客户端传递句柄和文件名称
- 服务器返回句柄及其属性(包括文件的元信息)
- 客户端请求打开文件,则向服务器发出查找请求,传递根文件句柄和文件名
- 幂等性:操作执行一次和执行多次的结果相同
3.客户端缓存
- 更新可见性:
- 本地数据更新已经完成,但是还在缓存中,尚未写入服务器,其他机器会读到旧数据
- 关闭时刷新:文件关闭后,客户端将刷新所有脏页到服务器
- 陈旧的缓存:
- 服务器已经完成了数据的更新,但是本地还在使用缓存中的旧数据
- 每次使用都会询问服务器缓存中的数据是否正确(为了避免高频的访问,可能会有一小段时间的信任期)
三、Andrew文件系统(AFS)
1.目标
实现更好的扩展性
2.AFS v1
- open请求之后,服务器会缓存整个文件到本地,后续再使用只需要发送信号TestAuth来验证数据是否更新,若没有更新则直接在本地操作
- 问题
- 验证信息TestAuth太多了
- 路径查询成本很高:频繁发送验证信息,客户端发送了一个很长的路径,需要一级级查询
3.AFS v2
- 回调:不需要一直发送TestAuth,服务器会通知客户端其缓存中的文件被修改
- 文件标识符:客户端会对每一个文件设置标识符,告知服务器,进而完成回调
4.缓存一致性
- 更新可见性:当一个客户端更新后,服务器会让所有拥有该文件的客户端重新来
- 多个一起写,则最后一个成功(NFS可能会混合)
5.崩溃恢复
- 服务器崩溃:重连后,告知所有客户端停止相信
- 客户端崩溃:重连后,怀疑所有缓存,向服务器发送TestAuth查询