网络文件系统

网络文件系统

基本概念

网络文件系统(Network File System)是基于 TCP/IP 协议(整个协议可能会跨层)的文件系统,它可以将远端服务器文件系统的目录挂载到本地文件系统的目录上,允许用户或者应用程序像访问本地文件系统的目录结构一样,访问远端服务器文件系统的目录结构,而无需理会远端服务器文件系统和本地文件系统的具体类型,非常方便地实现了目录和文件在不同机器上进行共享。

网络文件系统通常分为客户端和服务端,其中客户端类似本地文件系统,差异是在读/写数据时不是访问磁盘等设备,而是通过网络将请求传输到服务端。而服务端则是对数据进行管理的系统,将数据存储到磁盘等存储介质上。

网络文件系统 VS 本地文件系统

网络文件系统与本地文件系统主要存在以下差异:

  • 数据的访问过程。 本地文件系统的数据是持久化存储到磁盘上的,而网络文件系统则需要将数据传输到服务端进行持久化处理。
  • 是否需要格式化。 本地文件系统需要进行格式化处理才可以使用。而网络文件系统则不需要客户端进行格式化操作,通常只需要挂载到客户端就可以直接使用。当然在服务端通常是要做一些配置工作的,包括格式化操作。

网络文件系统最主要的特性是实现了数据的共享。 基于数据共享的特性,使得网络文件系统有很多优势,如增大存储空间的利用效率(降低成本)、方便组织之间共享数据和易于实现系统的高可用等。

关键原理

由于网络文件系统基于网络实现,其分为本地的客户端与远端的服务端。因此其除了之前提到的本地文件系统相关的技术,还引入文件系统协议、RPC,网络文件锁等机制。

文件系统协议

网络文件系统本质上是一个基于 C/S(客户端/服务端)架构的应用,其大部分功能是通过客户端与服务端交互来实现的。因此,对于网络文件系统来说,其核心之一是客户端与服务端的交互语言——文件系统协议

网络文件系统的协议的定义类似函数调用,包含 ID(可以理解为函数名称),参数和返回值。这里以 NFS v3 协议举例:

从上图可以看出,协议语义与文件系统操作的语义基本上一一对应,因此客户端对网络文件系统的访问都可以通过协议传输到服务端进行相应的处理。

远程过程调用(RPC)

由于在客户端与服务端都要实现对协议数据的封装和解析,因此实现起来比较复杂。为了降低复杂性,通常会在文件系统业务层与 TCP/IP 层之间实现一层交互层,这就是 RPC 协议。

RPC(Remote Procedure Call,远程过程调用) 是 TCP/IP 模型中应用层的网络协议(OSI 模型中会话层的协议)。RPC 协议通过一种类似函数调用的方式实现了客户端对服务端功能的访问,简化了客户端访问服务端功能的复杂度。

RPC 协议通常架构如下:

  • 客户端:文件系统。
  • 服务端:文件系统服务。
  • 存根:定义的函数集。以网络文件系统为例,函数集包括创建文件、删除文件、写数据和读数据等。函数集通常需要分别在客户端和服务端定义一套接口。
  • RPC 运行时库:实现了 RPC 协议的公共功能,如请求的封装与解析、消息收发和网络层面的错误处理等。

在客户端调用 RPC 函数时,会调用 RPC 库的接口将该函数调用转化为一个网络消息转发到服务端,而服务端的 RPC 库则对网络数据包进行反向解析,调用服务端注册的函数集(存根)中的函数实现功能,最后将执行的结果反馈给客户端。

对于客户端的应用,这个函数调用与本地函数调用并没有明显的差异。

网络文件锁

本地文件系统可以在文件系统内实现文件锁。但由于网络文件系统会有多个不同的客户端文件系统访问同一个服务端的文件系统,文件锁是无法在客户端的文件系统中实现的,只能在服务端实现。这样就需要一个协议将客户端的加锁、解锁等请求传输到服务端,并且在服务端维护文件锁的状态。

在 NFS 协议族中,其通过 NLM(Network Lock Manager) 协议实现了一个网络文件锁服务。由于网络文件锁需要考虑到网络分区、丢包、服务端/客户端宕机等多方面因素,实现要比本地文件锁服务复杂得多,但其核心原理还是与本地文件锁一样:维护一个数据结构,负责记录每个文件的加锁情况。当客户端传来新的加锁请求时查找该结构,判断是否存在锁冲突,来考虑是允许加锁还是报错返回。

Licensed under CC BY-NC-SA 4.0
最后更新于 May 23, 2022 19:00 CST
Built with Hugo
主题 StackJimmy 设计