分布式系统学习——分布式计算范型
本章对分布式应用中各种范型进行分类,介绍基于这些范型的典型工具和协议。
范型和抽象
抽象
抽象->理论->设计
,计算机科学研究的三种形态,对应学科问题求解中三个典型过程。
抽象
:源于实验学科,抽象的结果是概念、符号、模型。
理论
:源于数理,主要为定义、定理、公理、证明与结果解释,研究内容跟的基本特征是构造性数学特征。
设计
:源于工程学,用来开发求解给定问题的系统和设备主要是需求说明。
范型
范型是一种模式、例子、模型。(不同形式语言有不同的范型,面向对象、底层 blabla)。识别基本模型并根据模型分类在研究解决复杂问题时非常有用。
本章视图描述分布式系统模型、应用的范型、物理模型等等进行分类。
系统模型分类
物理模型
:考虑组成系统的计算机和设备的类型以及它们的互联,不涉及特定的技术细节。
体系结构模型
:从系统的计算元素执行的计算和通信任务来描述系统。
基础模型
:采用抽象的挂点描述大多数分布式系统面临的单个问题的方案。(交互模型 && 故障模型 && 安全模型)。
物理模型
早期分布式系统和初期互联网规模的分布式系统特征静态、分立、自治。
当代的分布式系统特征
- 移动计算:节点移动
- 无处不在的计算:嵌入日常物品周围环境
- 云计算:一组节点提供给定服务
体系结构模型
一个系统体系结构是指:各个独立指定组件的结构,
- 整体目标:确保结构能满足现在和将来可能的需求。
- 主要关心:系统可靠性、适应性、可管理型和性价比
体系结构元素与常见问题
- 通信实体是什么
- 如何通信(通信范型)
- 扮演的角色及承担的责任是什么
- 如何映射到具体的基础设施上(放置)
体系结构元素——通信实体
- 面向系统的角度:线程、进程、结点。
面向问题的角度:对象(自然单元)、组件(提供的接口和所需接口)、Web 服务(经常跨越组织边界)。
- 进程间通信:相对底层支持(套接字、多播、消息传递)
远程调用:最常见的通信范型,双向交换
- 请求——应答协议(RR):一对消息的交换
- 远程过程调用(RPC):远程计算机上进程中的过程能被调用
远程方法调用(RMI):一个发起调用的对象可以调用一个远程对象中的方法
进程通信及远程调用的限制:
- 发送者需要知道接收者(空间耦合)
发送者和接收者同时存在(时间耦合)
- 间接通信(时间空间解耦合)
- 组通信:一对多通信范型
- 发布——订阅系统:提供一个中间服务,有效确保生产者生成的消息被路由到需要这个消息的消费者(体系结构生产者消费者问题特化,特对特)
- 消息队列:提供点到点服务
- 元组空间:进程可把任意结构化数据存放在一个持久化元组空间,其他进程可读可删除。
- 分布式共享内存:用于支持在不共享物理内存的进程间共享数据
小结
体系结构元素——中间件内容补充
操作系统及以下,归为平台(Platform),最上层是应用服务,中间有一个中间件(MiddleWare)。
中间件提供一个编程抽象来屏蔽异构问题,主要解决包括:
- 硬件
- 数据类型在不同硬件平台上表示不同
- 存储方式不同(PowerPC 采用 big-endian,X86 采用 little-endian)
- 通信协议
- 独立于网络底层的传输协议(底层无关)
- 操作系统
- 在操作系统上提供更高级的抽象 API,屏蔽操作系统级的异构
- 编程语言
- CORBA 通过 IDL,可以使得不同的语言写的代码互相调用
- CORBA——公共对象请求代理结构
体系结构模型——分布式系统结构的设计需求
设计考虑:
- 系统组件间的责任划分
- 组件在网络上的放置
- 等等
影响 1:性能问题
- 响应能力
- 服务器和网络负载
- OS 中间件与代码引起的延迟
- 吞吐量
- 负载平衡
影响 2:QoS 服务质量
- 可靠性、安全性
- 适应性
- 性能一般体现在响应与吞吐,但是还有一些新的解释
- 强时间性数据(time-critical data)
- QoS 可以在操作系统层、网络层等多个层级实现
影响 3:缓存和复制的使用
- 缓存复用频度
- 优化访问时间
影响 4:可靠性问题
- 正确性
- 形式化验证
- Model Checking
- 测试技术
- 容错性
- 冗余是关键
- 安全性
- 保证数据不受攻击
- 通过网络访问数据的权限
体系结构模型——客户-服务器模式
客户端 Client 发出 Invocation,服务端 Server 返回 Result。
CS 模式 C 端比较肥胖,分担了 S 端一些任务,但同样,result 计算却又只在,S 端进行。S 端和网络也是瓶颈。
体系结构模型——层次化体系化结构
层次化与分层体系结构互补,是一项组织给顶层功能的技术。层次化应用功能分解。(MVC,MVV?)
- 表示逻辑:用户交互与用户应用视图逻辑
- 应用逻辑:设计应用相关(业务逻辑)详细的应用特定储里
- 数据逻辑:涉及应用的持久存储,通常在一个数据库管理系统中。
体系结构模型——P2P 体系化结构
结构化 P2P(分布式哈希表 DHT 映射)与非结构化 P2P,与混合 P2P
体系结构模型变体
思路:
- 使用多个服务器和缓存,增加性能和灵活性
- 使用移动代码和移动代理
- 用户硬件喜好
- 弹性扩展删除的需求
方式
- 服务器组
- 代理服务器与缓存
- 移动代码(服务器与客户端传递)
- 移动代理(Server 间传递)
- 网络计算机
分布式通信范型
进程间通信
- 同一节点(操作系统/体系结构中学习)
- 管道
- 消息队列
- 共享内存
- 不同节点
- 基于套接字
- 报文传递
消息传递
- 发送与接收原语
- 阻塞/非阻塞:同步型/异步
- 有缓冲/无缓冲(Buffer)
超时和线程
阻塞机制为 IPC 提供了必要的同步,但导致的无限挂起问题通常不能被接受,解决方案
- 超时机制(Timeout)设置最大阻塞期限
- 子进程、线程提供组赛操作,主线程 or 父进程可继续其他储里(挂起子进程或子线程)。
- 解决死锁(协议误解或者程序错误)
IPC 数据表示引例
在网络体系的物理层中,数据被表示成二进制流,并作为模拟信号进行传输。在应用层中,为支持编程语言提供的数据类型和数据结构,需要用更为复杂的数据表示方法来表示待传输的数据。(如 big endian 与 little endian 的问题)
一些更优的分布式解决方案
数据编码
尽管可以用专门定制的程序,采用双方认同的任意一种数据组装方案执行 IPC(IPC 前的额外程序接口),通用分布式应用要求为交换数据编码提供通用的、独立于平台的方案。因此一些有关网络数据编码的标准应运而生。
外部数据表示和编码
三种外部数据表示和编码方法
- CORBA 的公共数据表示
- Java 的对象序列化
- XML(可扩展标记语言)
此外 Goggle 采用协议缓冲区(protocol buffer),JSON(JavaScript Object Notation)也是近年来常用的外部数据表示方法。
- 序列化:将一个对象或者一组关联对象打平成适合于磁盘存储或消息传送的串行格式
- 解序列化: 从串行格式中恢复对象或一组对象的状态
Java 反射的应用
- 实现了根据类名创建类的能力,以及为给定的类创建具有给定参数类型的构造函数
- 反射使得以完成通用的方式进行序列化和反序列化成为可能
- Java 对象序列化使用反射找到要序列化的对象的类名,以及该类的实例变量的名字、类型和值
(解序列化有时候像一个动态生成类的过程)
组播通信
- 单个消息从一个进程发送到译组进程的每个成员的操作
- 组的成员对发送方常是透明的
- 组播的行为有很多种情况,最简单的组播不提供消息传递保证或排序保证
组播消息为构造具有下列特征的分布式系统提供了基础设施:
- 基于复制服务的容错(比如 Raft 协议,Leader Election 过程都是基于组播通信)
- 在自发网络中发现服务
- 通过复制的数据获得更好的性能(找寻恢复?)
- 事件通知的传播(包括内网穿透等)
网络虚拟化
网络虚拟化涉及在一个已有的网络之上构造多个不同的虚拟网络
每个虚拟网络被设计成支持一个特定的分布式应用
- 多媒体数据流
- 多人在线游戏
面向特定应用的虚拟网络构建在一个已有的网络上并为特定的应用进行优化,而不改变底层网络的特征。
覆盖网络
积淀和虚拟链接组成的虚拟网络,位于一个底层网络之上
- 满足一类应用需求的服务器胡总一个特别高层的服务,例如多媒体内容分发
- 在一个给定的联网环境中的更有效的操作
- 额外特色,例如:组播或安全通道
好处
- 不改变底层网络就能定义新的网络服务
- 取决于该领域标准化的水平和修补底层路由功能的困难
- 鼓励对网络服务进行实验和对服务进行面向特定应用的定制
- 能定义多个覆盖王,它们能同时存在,从而行成更开放和拓展的网络体系结构
不足
- 引入了额外的间接层
与属虚的分层概念相关
- 一个覆盖网是一层,TCP/IP 结构外存在的一层
- DIY 该层核心元素:寻址模式、要采用的协议、路由方法等。
客户-服务器范型
注意说的是通信范型还是体系结构
CS 范型服务器扮演服务提供者决策,被动地等待请求的到达。
寻址
- 为了发消息给服务器,客户必须知道服务器的地址
- 进程编址方法
- 客户机代码中指明机器/进程号(machine,process number):文件服务器不透明(类似于绝对地址)
- 给每个进程分配唯一地址->中央服务器(单点故障)
- 让进程选择随机地址,用广播定位进程:额外的系统负担
- 在客户机中存放 ASCII 服务器名字,运行时寻找它:需要命名服务器(有点像 DNS)
阻塞与非阻塞原语
- 有一个要求??消息要是不可修改的(WHY?)
有缓冲和无缓冲原语
- 无缓冲的形式,当多 C 访问 S 时可能会造成消息丢失的问题
- 解决:缓冲,邮箱 blablabla
可靠的和非可靠原语
- 可靠:请求后多一个 ACK(内核到内核的确认)
P2P 范型
集中目录式结构
用户注册与文件检索过程类似于传统的 C/S 模式 ,区别在于所有资料并非储存在服务器上,而是储存在各个节点中。查询选择合适的节点建立直接连接。
这种结构简单,显示系统信息量的巨大优势和吸引力,同时也揭示了 P2P 系统本质上所不可避免的两个问题:法律版权和资源浪费的问题。
纯 P2P 网络模型
广播式 P2P,取消集中的中央服务器。现在应用最广泛的纯 P2P 非结构化拓扑模型——Gnutella 模型。
明显的问题:易受垃圾信息和病毒的恶意攻击,搜索算法是泛洪方式,低效性。
混合式网络模型
Kazza 模型是代表,引入超级节点的概念。根据节点能力不同(计算能力、内存大小 blabla)
结构化网络模型
结构化/非结构化根本区别:每个节点所维护的邻居是否能够按照某种全局方式组织起来以利于快速查找。
目前的主流方式:分布式哈希技术(DHT)。目前扩展性最好的 P2P 路由方式质以。借助 DHT 的优势,取消泛洪算法,又可有效达到目标节点。
远程过程调用范型
范型简介补充,自行了解
- 请求应答协议
- 远程过程调用(RPC),将传统的过程调用模型扩展到分布式系统中,允许客户程序透明地调用在服务程序中的过程。
- 远程方法调用(RMI),基于对象的编程模型的扩展,允许不用进程运行的对象通过其彼此通信。是对本地方法调用的扩展。(数据库操作中,ODBC)
RPC 主要步骤
略
RPC 的设计问题
- RPC 编程风格——接口编程
- RPC 关联的调用语义
- 透明性的关键问题和它如何与远程过程调用相关联
接口编程
- 一些编程语言提供了把程序组织成很多个模块+彼此通信的方法。(面向对象编程典型)
- 模块间通信依靠模块间过程调用/访问变量
- 通过模块定义显示接口,接口访问过程和变量。
- 实现的接口可以隐藏除接口外的所有信息,只要模块接口保持相同,模块的实现就可以随意改变而不影响模块的使用。
分布式系统的接口
- 分布式程序中,模块能够运行在不同的进程中
- 服务接口,涉及服务器提供过程的说明、定义和每个过程参数的格式
- 分布式编程中使用接口的好处
- 对于任何形式的模块化编程,只需要关系服务接口提供的抽象而不需要关注它们的实现细节(比如 Map、Reduce)
- 程序员无需知道实现服务的语言和底层平台
- 只要接口保持不变,实现可以改变,自然的支持软件的演化。
- 接口定义受到分布式底层基础设施的影响
- 某进程访问另一个进程中模块的变量是不可能的
- 本地过程调用使用参数传递机制,不适用于调用者和过程在不同进程中的情况
- 不支持引用的传递
- 某个参数同时作为输入/输出时,请求和应答必须传值
- 内存地址无效化,不能作为调用结果返回(没有意义)
- 接口定义语言(IDL)
- RPC 可以集成在编程语言中
- 接口定义语言,跨语言,以不同语言实现过程以便相互调用
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!