分布式系统概念和设计
通过命名服务,客户进程可以根据名字获取资源或对象的地址等属性。
被命名的实体可以是多种类型,并且可由不同的服务管理。
命名服务
命名是一个分布式系统中的非常基础的问题,名字在分布式系统中代表了广泛的资源,名字方便了通信与资源共享。
在计算机系统需对资源进行访问的情况下就需要名字。
-
名字,地址和其它属性
- 任何请求一个资源的进程必须拥有该资源的名字或标识,例如文件名/etc/passwd
- 选择标识的一个重要指标是软件存储与查询标识的效率
- 与名字完全相反的是对象的地址,改值识别了对象的位置而不是对象本身,地址通常可以访问对象,但是对象有时候会被重定位,地址并不足以作为标识的方法
- 当一个名字被翻译成被命名的资源或对象数据,称一个名字被解析,解析名字的目的通常是为了在对象上调用的一个动作。
- 名称和对象之间的关系称为绑定
-
名字与服务
- 分布式系统使用的许多名字专用于特定的服务,客户使用名字请求特定服务在被命名的对象或资源上执行某个操作
- 例如:删除一个文件,需要将文件名传送给文件服务;如果需要向特定进程发送信号,该进程的标识会被传送到进程管理服务
- 在基于对象的中间件中,名字指向提供了服务或应用的远程对象,考虑到全球范围内对命名服务的需求,因为命名服务必须是能够理解的
-
统一资源标识符
识别web资源的主要方法,主要特性是对无限的web资源具有可伸缩性,是资源访问的高效句柄。不足之处是如果一个web资源被移动或者删除,会发生404,悬挂链接,也就是资源未找到
URL (Uniform Resource Locator) 和 URI (Uniform Resource Identifier) 都是用于标识互联网上某个资源的字符串。它们的主要区别在于范围和含义。
URI 是一个字符序列,用于唯一地标识某个抽象或物理资源。URI 有两种形式:URL 和 URN (Uniform Resource Name)。URL 是 URI 的子集,它指定了资源的位置和访问方式。例如:https://www.example.com/index.html 就是一个 URL,其中 https 表示协议,www.example.com 是主机名,index.html 是文件名。
相比之下,URI 是更通用的概念,因为它可以标识任何类型的资源,包括但不限于互联网上的资源。比如,一个 urn:isbn:978-1-491-90005-6 就是一个 URN,它标识了一本书的国际标准书号(ISBN)。
因此,URL 是一个特殊的 URI,用于定位互联网上的资源,并且包含标识该资源所需的信息。而 URI 则是更广泛的概念,用于标识各种类型的资源,包括但不限于互联网上的资源。
命名服务和域名系统
- 一个命名服务存储了一个或多个命名上下文——有关用户,计算机,服务以及远程对象等对象的文本名字与属性之间的绑定的集合
- 命名服务支持的主要操作是名字解析——根据一个给定的名字查询相应的属性
- 其他操作如生成新的绑定,删除绑定,列表绑定的名字以及增删上下文
名字管理从其他服务中分离出来的主要原因在于分布式系统的开放性:
- 一致性:不同服务管理的资源使用相同的命名机制带来的方便,URL是一个很好的例子。
- 集成性:在分布式系统中并不总能预测共享的范围。如果在不同管理域中创建的资源,如果没有一个公共的命名服务,管理域会使用完全不同的命名约定
通用命名服务的需求
- 最初设计的简单用来满足名字与单个管理域中的地址绑定的需求,而单个管理域对应于单个LAN/WAN,然而国际互联和分布式系统的不断扩展带来了一个更大的映射问题
- Grapevine
- 处理任意数量的名字,为任意数量的管理组织提供服务:系统尤其需要能处理全世界计算机用户的电子邮件地址
- 长生命周期:在生命周期中,名字集组织,实现服务的组件都会发生变化
- 高可用性:很多系统依赖命名服务,命名服务一旦崩溃,系统无法工作
- 故障隔离:局部故障不会带来整个服务的崩溃
- 不信任零容忍:一个大的开放系统很难拥有被系统中所有客户都信任的组件
- Globe命名服务和handle系统都将目标集中于命名服务在大规模对象情况下的可伸缩性
- 提供服务能力需要极大的依赖于名字数据的复制与缓存
名字空间
一个名字空间是一个特定服务所能识别的有效名字的集合,所谓的有效就是服务将试图查询之,即使该名字并不对应于任何对象——未绑定
名字空间需要预发定义,需计算机的DNS能够接收可解释的方式
- 在unix文件系统中,名字有一个内部结构标识它们在层次型名字空间中的位置,层次型名字空间最重要的好处在于名字的每个部分总是相对独立的上下文进行解析,而相同的名字在不同的上下文中有不同的含义。比如(/etc/passwd和/usr/passwd),不同的上下文解析不同的目的
别名
一个方便的名字代替一个更加复杂的名字的设计需求,DNS允许的别名使用方法是,定义一个域名来表示另一个。提供别名的原因是为了提供透明性。
命名域
仅仅通过一个总的管理权威管理有关该域中的名字指派问题的名字空间,该权威机构完全控制哪些名字可以被绑定到域中,也可以将这个任务委托。
- DNS的域名域名的集合。
- 语法上,一个域的名字是该域中所有域名的公共后缀,除了公共后缀这个特点,域名很难与其他名字如计算机名区分开。
- yahoo.com是域yahoo.com中的一台web服务器
- 域的管理可以被移动到子域中进行管理
组合与定制名字空间
- DNS提供了一个全局的,同构的名字空间,在DNS上,无论是哪台计算机上的哪个进程查询,同一个名字总是指向同一个实体。
- 某些命名服务允许不同的名字空间——甚至是异构的名字空间嵌入其中
- 有些是定制化的,满足用户甚至进程的需要
-
合并:在unix与nfs中安装文件系统的实践提供了个名字空间的一部分被方便的嵌入到另一个空间的实例,考虑如何合并两个或多个完整的unix文件系统,这两个系统分别在不同的计算机上,每台计算机都有自己的根,具有重叠的文件名。
- 合并过程最明显的方法是用一个超级根代替原来每台计算机上的根,然后将每台计算机的文件系统安装到该超级根目录下,带来根的兼容性问题
-
异构性:分布式计算环境(DCE)的名字空间允许嵌入异构名字空间,DCE名字包含结合点,和unix中的安装点类似
-
定制:用户偏爱于构造自己的名字空间,另一个动机是同一个名字在不同的计算机上可以指向不同的文件
命名解析
名字解析通常是一个迭代的过程,通过该过程,名字被反复地发送到命名上下文。
一个命名上下文或者直接地将一个给定的名字映射到一组简单属性中。
或者将之映射到一个更深的命名上下文中,同时将一个派生名送到该上下文。
- 在解析一个名字,该名字首先被送到某个初始命名上下文中,随着更深的命名上下文以及派生名的输出,解析过程不断进行。
- 解析过程的另一个迭代特性是别名的使用
- 例如当请求DNS服务器解析,服务器首先将该别名解析到另一个域名,然后这个域名进一步解析到一个IP地址
- 别名的使用可能会导致名字空间带有循环,这种解析会发生死循环,需要处理阈值放弃解析和管理禁用处理
命名服务器和导航
- 诸如DNS这样的命名服务,存储一个巨大的数据库,并由众多用户访问,通常不会将所有的名字信息放在单个服务器上
- 如果只使用一台服务器存放名字信息,那么这台服务器会成为一个瓶颈以及故障的临界点
- 任何重负载的命名服务都应该使用复制提高可用性,在DNS规定数据库的任何一个子集都必须复制到至少两个不会同时失效的服务器
缓存
- 在DNS以及其它命名服务中,客户端的名字解析软件以及服务器维护了一个以往名字解析结果的缓存
- 当客户发出一个名字查询请求时,客户的名字解析软件就查询它的缓存,最近访问原则。
- 缓存也是命名服务的性能关键,即时在命名服务器崩溃的时候,缓存也可以帮助维护命名服务网的可用性。
- 作用非常清晰:即通过约定与命名服务器的通信时间提高响应速度。
- 也有可能在缓存中的数据解析得到的数据是过时的数据,这个需要单独处理缓存最新数据一致性的问题,back write.
- 回写:回写机制设计的主要目的是确保缓存中的数据与主存中的数据保持一致性。当缓存中的数据被修改后,这些数据并不会立即写回到主存中,而是在缓存中暂时保存。为了确保数据的一致性,缓存需要根据一定的策略将修改过的数据周期性地或在特定条件下回写到主存中,从而保证缓存中的数据与主存中的数据的一致性。
域名系统
目录服务和发现服务
目录服务
存储了一组名字和属性的绑定,条目的查询基于属性规范。
有时也是基于属性的命名服务
发现服务
发现服务是一种目录服务,注册了自发网络环境下提供的服务。
在自发网络中,设备倾向于在不发出警告,未做管理预备工作的情况下接入网络。
自发网络的目标是客户于服务的集合可以动态改变,并且无需用户干预即可集成。