nfs 架构¶
NFS 跟其他文件共享协议一样,也是采用了 C/S 架构。借助 RPC 协议实现 TCP/IP 数据传输 功能。
1 NFSv4 简要概述¶
NFS 这个协议 (NFSv2) 最初由 Sun Microsystems 在 1984 年设计提出,由于存在一些不足,因此在随后由几家公司联合推出了 NFSv3。到了 NFSv4 时,开发完全由 IETF 主导,设计目标是:
- – 提高互联下的 NFS 访问和性能
- – 提供安全性
- – 更强的跨平台操作
- – 方便后期扩展
我们可以看到 NFSv4 在缓存能力、扩展性、高可用性方面取得了很大的突破,放弃了之前版本的无状态性,采用了强状态机制,客户端和服务端采用了复杂的方式交互,由此保证了服务器端的负载均衡,减少了客户端或服务端的 RTO。
在安全性方面,NFSv4 采用了面向连接的协议,强制使用 RPCSEC_GSS 并且提供基于 RPC 的安全机制。放弃了之前版本中采用的 UDP,采用了 TCP。NFSv4 支持通过次要版本进行扩展,我们可以看到在 NFSv4.1 支持了 RDMA、pNFS 范式以及目录委派等功能。
1.1 NFS 服务器和客户端的通信过程¶
首先,客户端上的 RPC 程序连接到服务器上的 UDP 111
端口(即 rpcbind 服务)来通过端口映射器查询 NFS 各项服务所使用的端口,然后客户端分别连接 rpc.nfsd
和 rpc.mountd
所在的端口,取得挂载点信息之后将文件系统挂载起来,客户端就可以操作共享文件系统了!
1.2 RPC 又是如何知道每个 NFS 功能的端口?¶
首先当 NFS 启动后,就会随机的使用一些端口,然后 NFS 就会向 RPC 去注册这些端口,RPC 就会记录下这些端口,并且 RPC 会开启 111 端口,等待客户端 RPC 的请求,如果客户端有请求,那么服务器端的 RPC 就会将之前记录的 NFS 端口信息告知客户端。如此客户端就会获取 NFS 服务器端的端口信息,就会以实际端口进行数据的传输了。
2 NFS 服务器主要进程¶
2.1 rpc.nfsd
进程¶
NFS 服务的主进程,主要管理客户端是否能够接入 NFS 服务器以及数据的传输。
该进程固定监听 TCP/UDP 2049
端口。
2.2 rpc.mountd
进程¶
管理和维护 NFS 文件系统,根据所设定的权限 决定是否允许客户端挂载指定的共享目录。 该进程监听的端口默认是不固定的。 当从 NFS 客户端接收 MNT 请求时,rpc.mountd 会根据其导出表检查路径名和发送方的 IP 地址。如果发送方被允许访问请求的导出,rpc.mountd 会向客户端返回导出根目录的 NFS 文件句柄。然后,客户端可以使用根文件句柄和 NFS LOOKUP 请求来导航导出的目录结构。
2.3 rpc.lockd
进程¶
提供 文件锁功能,防止多个客户端同时写入一个文件。 该进程监听的端口默认是不固定的。
2.4 rpc.statd
进程¶
负责 检查数据的状态及一致性,需要与 rpc.lockd
配合使用。
该进程监听的端口默认是不固定的。
2.5 rpcbind
进程¶
注意:CentOS 6.2 以后版本变更了 portmap 服务为 rpcbind
RPC 的端口映射器进程,监听 UDP 111
端口。
3 delegation 机制¶
由于多个客户端可以挂载同一个文件系统,如何在多个客户端之间保持数据一致性是个非常麻烦的问题,NFSv2 和 NFSv3 没有规定具体的方法,一般的做法是客户端不定期检查文件是否发生了冲突,比如读操作中在发起 READ 请求前可能要发起 GETATTR 请求,判断本地缓存是否有效。在大规模系统中以及当客户端和服务器分布比较遥远时就会影响系统性能,因为 GETATTR 操作需要一定的执行时间。 NFSv4 引入了一种机制保持文件缓存一致性,这种机制称为 delegation。这种机制的基本原理是客户端 A 打开文件时服务器给客户端 A 颁发一个凭证,只要客户端 A 持有这个凭证就可以认为没有与其他客户端发生冲突,读写操作中就不需要发起 GETATTR 请求了。当客户端 B 试图访问同一个文件时,这两个客户端就发生了冲突。服务器先暂时不响应客户端 B 的请求,而是向客户端 A 发送 RECALL 请求。客户端 A 接收到 RECALL 请求后将缓存中的数据刷新到服务器中,然后将凭证交还给服务器。这时服务器再响应客户端 B 的请求。以后两个客户端就按照 NFSv2、NFSv3 中的方法检查文件冲突。因此,这种机制适用于只读文件系统,或者客户端对数据修改不频繁的文件系统。
4 pNFS¶
当 NFS 客户端达到一定数量时,NFS 服务器就会称为瓶颈。因为 NFS 服务器的局限性 ,比如 带宽、存储容量和处理器速度,限制了总体计算性能。 NFS v4.1,包括一个扩展 pNFS,它将普通 NFS 的优势和并行 I/O 的高传输率结合起来。使用 pNFS 时,客户机也像以前一样可以从服务器共享文件系统,NFS 服务器仅仅提供元数据服务,但数据不经过 NFS 服务器,客户机系统将与数据存储系统直接连接,为大型数据传输提供许多并行的高速数据路径。
在 pNFS 中,数据并发传输是实现并行访问和处理的一种方式。通过将 数据分成多个块,并让不同的客户端并行地读取和写入这些块,可以显著提高数据的访问速度和效率。此外,pNFS 还支持其他并行访问和处理技术,例如并行 IO 和并行锁定,以优化不同类型的应用程序的性能表现。
5 pNFS 相比 NFS 优势¶
- 并行性:pNFS 允许跨多个服务器并行访问数据,这可以大大提高性能。
- 可扩展性:pNFS 可以扩展以支持超大的文件系统和大量的客户端。
- 灵活性:使用 pNFS,可以组合使用不同类型的存储设备(如 SSD、HDD、对象存储),以优化存储性能和成本。
与传统 NFS 相比,pNFS 提供了更好的性能和可扩展性,尤其是对于大型文件系统和高并发工作负载。它还在存储硬件选择方面提供了更大的灵活性。然而,pNFS 需要更复杂的配置,可能不适合较小的部署。