分布式系统概念和设计
文件系统的特点
负责文件的组织,存储,检索,命名,共享和保护
文件包含数据和属性
- 数据:包含一系列数据项——8比特的字节,读写操作可访问任何一部分数据
- 属性:用一个记录表示,包括文件长度,时间戳,文件类型,所有者身份和访问控制表
- 下图阴影部分是系统管理,其余则是用户操作维护
- 元数据:用于管理文件所需的存储在文件系统中的所有特殊信息,包含文件属性,目录和其他文件系统使用者的信息
- 每一层只依赖于下一层,分布式文件服务系统可能附加模块实现客户服务器通信,分布式命名和文件的定位能力
文件系统操作
分布式文件系统的需求
需求:开发过程中出现性能,可伸缩性,并发控制,容错和安全的需求
透明性
文件系统服务通常是负载最重的服务,功能和性能非常关键,设计必须平衡灵活性和可伸缩性与软件的复杂性和性能。
- 访问透明性:客户端不必了解文件的分布存储性质
- 位置透明性:客户可以只使用一个文件命名空间,不改变路径的情况下,多个文件或文件组应该可以被重定位:同时允许客户在任意时刻执行时都使用同样的命名空间
- 移动透明性:当文件移动,客户程序和客户节点上的系统管理表都不必改变,允许文件的移动性
- 性能透明性:服务负载在一个特定范围内变化,可能能保持满意的性能
- 伸缩透明性:文件可以不断地扩充,负载可以线性扩展
并发文件更新
一个客户改变文件的操作不应该影响其他客户访问或改变同一个文件的操作。
当前大多数UNIX标准,提供建议性和强制性的文件级别或记录级加锁
文件复制
在支持文件复制的文件服务中,一个文件可以表现为在不同位置文件内容的多个副本
一个允许多个服务器共享文件服务的负载,增强服务的伸缩性同时改进容错性能
当一个文件损坏,可以访问另一个具有此文件副本的服务器
硬件和操作系统异构性
文件服务的接口必须有明确的定义,这样在不同的操作系统和计算机上可以实现客户和服务器软件,开放性一个重要的需求交付实现
容错
- 文件服务器分布式系统中的中心角色决定了它必须在客户和服务器出现故障时能继续使用
- 容错设计可以基于至多一次调用语义,而在按幂等操作设计的服务器协议中容错设计可以使用简单的至少一次调用语义,保证重复请求不会导致对文件的不合法更新
一致性
- UNIX文件系统提供的是单一更新语义。
- 提供一个对文件并发访问的模型,当多进程并发访问文件时,只能看到仅有的一个副本存在
- 当文件在不同的地点被复制或被缓存,对一个副本所做的修改要被传播到所有的副本,传输中间的时间延迟,这种情况会发生偏离单一副本语义
安全性
大多数文件系统基于访问控制列表的访问控制机制。
在分布式文件系统,客户请求需要被认证,这样在服务器上的访问控制需要基于正确的用户身份。
同时还需要使用数字签名和私密数据加密机制保护请求和应答消息的内容
效率
效率的前提是需要处理好可靠性和稳定性的前提需求
文件服务系统结构
平面文件服务
注重在文件内容上的实现操作,文件唯一标识符(UFID)
在所有平面文件服务操作的请求中用于指明文件
文件服务和目录服务的职责划分是基于UFID的的使用实现
UFID是一长串序列,每个文件的UFID在分布式系统的所有文件中是唯一的
当平面服务接收一个创建请求,会生成一个UFID,将请求UFID返回给请求者,看看OSS的使用方式
目录服务
提供文件名到UFID的映射。
客户通过向目录服务提供文件名获取文件的UFID
目录服务提供生成目录,在目录中加入新的文件名以及目录中获得的UFID所必须的功能,是平面服务的客户,其目录文件存储在平面文件服务提供的文件中
客户模块
客户模块运行在客户机,集成和扩展了平面文件服务和目录文件服务的操作,并为客户端提供用户级程序提供单一应用程序接口
平面文件服务接口
访问控制
UNIX系统
- 在UNIX文件系统中,系统会将用户的访问权限和在open的请求访问权限模式比较,只有在用户拥有必要权限的时才能打开文件
- 在访问权限检查中使用的用户标识(UID)是用户早期认证登录的结果,并且在分布式的实现中不能被修改
- 访问权限会保持到文件关闭,并且在同一文件上进行随后操作,系统不需要进行再次检查
分布式文件系统实现
- 在分布式的实现中,访问检查必须在服务器上进行,因为服务器RPC接口是一个访问文件的无保护的点
- 用户标识必须在请求中传输,并且服务器容易被伪造的标识欺骗
- 严重:如果访问权限检查的结果被保留在服务器上并在下一次访问中使用时,服务器就不再是无状态的
- 当文件名被转化为UFID时,系统进行一次访问检查,同时其结果按权能的形式编码,它作为以后一系列请求的访问许可将被返回给客户
- 每一次客户请求,客户都发送用户标识,并且在每一次文件操作时,服务器都进行访问检查(更加通用的方式)
目录服务接口
提供从文件名到UFID的翻译服务
实现需要保留一个包含文件名到UFID映射的目录文件
每一个目录向普通文件一样存储,也有其UFID,因此,目录服务是文件服务的一个客户
每一操作中,需要包含在目录文件中的文件的UFID
基本目录服务中lookup操作执行一个文件名——》ufid转换
是一个构造块,提供其他服务或客户模块已完成更复杂的翻译
改变目录的两种操作:
- AddName:向目录中增加一个条目,并且在文件的属性记录中增加引用计数器
- UnName:从目录中删除一个条目并将计数器减,当计数器减到零,删除文件
- GetNames使客户可以检查目录内容,还可以实现类似UNIX shell中对文件名的模式匹配操作。返回存储在给定目录中的全部文件名或文件名的子集。此操作中系统对客户提供的正则表达式进行模式匹配进行文件名的匹配。
层次文件系统
- 向UNIX提供的由树形结构组织目录的文件系统是一中层次文件系统
- 每一个目录包含文件名和其他可以从此目录访问的目录名,可以使用路径名来访问任一文件或目录——路径名是代表树中一条路径的多部分名字
- 根有一个特定的名字,并且每一个在目录中的文件或目录都有名字
- UNIX文件命名机制不是严格的层次型的结构——一个文件可能有多个名字,可能在不同的目录中,通过link命令实现,该命令可以为指定的目录中的文件加入新的名字但是inode没有改变
文件组
- 文件组是一个给定服务器上的文件集合
- 一台服务器可能包含多个文件组,组不能在服务器之间移动,并且文件不能改变隶属的组
- 类UNIX和大多数其它系统中用到的一个相似构造(文件集系统)
- 文件组最早用于支持在计算机间移动哪些存储在可移动磁盘上的文件集合
- 在分布式文件服务中,文件组支持将文件一更大的逻辑单位分配到服务器上同时它还支持用存储在几个服务器上的文件实现文件服务。
- 在支持文件组的分布式文件系统中,UFID包括一个文件组标识组件,能使每个客户端上的客户模块向包含响应文件组的服务器发送请求
- 文件组标识必须唯一,文件组可以移动的是因为需要唯一的标识文件系统。
Sun网络文件系统
NFS(Network File System)是一种分布式文件系统协议,用于在计算机网络中共享文件和目录。它允许不同的计算机通过网络透明地访问和共享文件系统资源,就像这些资源本地存储在计算机上一样。NFS协议最初由Sun Microsystems开发,并成为UNIX和Linux操作系统中使用广泛的标准协议之一。其工作原理是客户端向服务器请求文件系统操作,服务器则将所需的数据进行处理并返回给客户端。
用Kerberos实现NFS的安全性
Kerberos可以实现NFS的安全性,其过程如下:
- 客户端向Kerberos服务器请求TGT(Ticket Granting Ticket)。
- Kerberos服务器用客户端提供的密码对其进行验证,如果验证通过,则向客户端发送TGT。
- 客户端使用TGT向Kerberos服务器请求服务票据(Service Ticket)。
- Kerberos服务器返回服务票据,其中包含着加密的会话密钥(Session Key)。
- 客户端向NFS服务器发送服务票据和会话密钥。
- NFS服务器使用会话密钥解密服务票据,并验证其有效性。如果验证通过,则允许客户端访问文件系统。
这样,Kerberos可以确保客户端与NFS服务器之间的通信是安全的,并且只有经过身份验证的用户才能访问文件系统。
Kerberos目的是减少需要信任假设的组件范围,当在Kerberos化,只接受哪些通过kerberos身份认证的客户发出的请求
HDFS的访问控制
HDFS(Hadoop Distributed File System)中的访问控制可以通过以下两个机制来实现:
权限控制列表(ACLs):针对文件或目录的每个对象,可以设置读、写和执行权限,也可以添加更高级别的访问控制,例如修改、删除等。这些权限可以授予特定用户和组。
POSIX 权限模型:类似于 UNIX/Linux 系统中的 chmod 和 chown 命令,可以为文件或目录设置基本的读、写和执行权限,以及所有者和组。不同之处在于 HDFS 中的 POSIX 权限控制是基于 Kerberos 认证和授权机制实现的。
在 HDFS 中,访问控制权限是由 NameNode 管理和维护的。只有拥有适当权限的用户才能够访问文件或目录。同时,HDFS 还提供了一种称为“代理用户”的机制,允许用户以其他身份执行操作。这可以在需要使用其他用户的权限时非常有用。
HDFS中的ACL(Access Control List,访问控制列表)可以用于控制文件和目录的访问权限。其实现思想是在每个文件和目录上维护一个包含授权用户和组信息的ACL,以便Hadoop系统在运行时检查用户对文件和目录的访问权限。
以下是设置HDFS ACL的步骤:
为文件或目录添加ACL:使用hdfs dfs -setfacl命令来设置文件或目录的ACL。例如,设置“user1”用户可以读取和写入文件:
hdfs dfs -setfacl -m user:user1:rwx /path/to/file
查看ACL:使用hdfs dfs -getfacl命令来查看文件或目录的ACL。例如,查看文件的ACL:hdfs dfs -getfacl /path/to/file
修改ACL:使用hdfs dfs -setfacl命令来修改文件或目录的ACL。例如,将“user1”用户的权限更改为只读:hdfs dfs -setfacl -m user:user1:r-- /path/to/file
删除ACL:使用hdfs dfs -setfacl命令来删除文件或目录的ACL。例如,删除文件的ACL:hdfs dfs -setfacl -b /path/to/file