pNFS是NFSv4.1最主要的特色,主要目的是为了解决系统吞吐量问题。随着网络和并行计算的迅猛发展,文件IO成为了限制系统整体性能的瓶颈。以前的版本中,所有的客户端与一个服务器连接,所有的请求都必须由这个服务器处理,这不适应并行计算的环境。Linux中pNFS正处于开发阶段,pNFS客户端程序已经合并到Linus Torvalds的主线库中,但是处于EXPERIMENTAL状态,pNFS服务器端程序还没有合并到Linus Torvalds的主线库中,目前由Tonian公司CTO Benny Halevy在Linux主线外进行开发和维护。
pNFS是NFSv4.1的可选特性,pNFS允许客户端直接将数据传送到保存文件的存储设备中。当存储设备中的文件是分布式存储方式或者存储设备的吞吐量明显关于NFS服务器的吞吐量时,客户端读写文件的速率会得到显著提升。pNFS的网络结构如下图所示:
pNFS提供了文件数据并行访问的能力,pNFS系统由三个3部分构成:
(1)Server
Server是支持pNFS特性的一台NFS服务器,Server中保存了文件的布局结构(layout)。文件布局是对文件在Storage Devices中存储方式的一种说明,Clients在读写数据前需要先向Server请求文件的layout,通过layout,Clients就可以知道文件存储在哪个Storage Device中了,以及是如何存储的。读写操作完成后,Clients需要将layout返还给Server。如果是写操作,Clients可能会修改layout,写操作完成后需要更新Server中的layout。
(2)Storage Devices
Storage Devices是保存文件实际数据的设备,由一台或者多台数据服务器构成。当Clients获得了文件的layout后,就可以直接向Storage Devices发送数据了。由于Storage Devices包含多台数据服务器,Cleints可以同时执行多个I/O请求,从而提升了系统吞吐量。pNFS只是Clients和Server之间的通信协议,Clients和Storage Devices传输数据时需要使用专门的存储协议。目前RFC定义了三种存储协议:file layout(RFC5661)、block layout(RFC5663)、object layout(RFC5664),后面的文章中我们会详细讲解file layout。
(3)Clients
Clients就是支持pNFS的NFS客户端,并且需要至少支持一种传输协议。
另外,由于Server保存了文件元数据,Storage Devices保存了文件实际的数据,因此二者之间必须保持同步,这是由专门控制协议(Control Procotol)实现的,控制协议的定义超出了pNFS的范围,pNFS没有对控制协议做出规定。
下面介绍几个跟pNFS相关的请求。
(1)LAYOUTGET
客户端(Clients)向数据服务器(Storage devices)发送I/O请求前需要先获取文件的布局信息(layout),客户端通过向元数据服务器(Server)发起LAYOUT请求获取文件的layout信息。客户端向元数据服务器发起LAYOUTGET服务时,需要提供自己请求的layout类型(file layout, block layout or object layout)、客户端请求的文件、IO类型(read, rw or any)、IO操作的数据在文件中的起始位置、请求的数据长度等信息。服务器端接收到LAYOUTGET请求后,需要检查是否支持请求的layout类型。如果服务器端不支持pNFS,返回错误码NFS4ERR_LAYOUTUNAVAILABLE;如果服务器端支持pNFS但是不支持客户端请求的layout类型,返回错误码NFS4ERR_UNKNOWN_LAYOUTTYPE;否则进行处理,返回layout的信息。具体返回什么信息跟layout类型有关,不同类型的layout返回的信息不同。客户端可以对一个文件的不同部分进行IO操作,因此可以为一个文件请求多个layout。
(2)LAYOUTRETURN
客户端执行完IO请求后会将layout返回给元数据服务器。客户端可以一次只返回一个layout(LAYOUTRETURN4_FILE),也可以返回文件中所有的layout(LAYOUTRETURN4_FSID),还可以返回所有文件中所有的layout(LAYOUTRETURN4_ALL)。三种情况下LAYOUTRETURN请求的参数不同,客户端执行LAYOUTRETURN请求后就不能使用这些layout了。
(3)LAYOUTCOMMIT
LAYOUTCOMMIT是写操作中使用的请求,服务器根据LAYOUTCOMMIT请求中的信息更新文件的布局信息。
(4)GETDEVICEINFO
客户端通过LAYOUTGET请求到了文件的布局信息,GETDEVICEINFO的作用是根据文件布局信息请求数据服务器的信息。因为pNFS中包含多个数据服务器,客户端需要确定到底向哪个数据服务器发送IO请求。客户端从GETDEVICEINFO应答消息中选取一个数据服务器发送IO请求。
(5)GETDEVICELIST
GETDEVICELIST返回系统中所有数据服务器的信息。
先讲这么多,后面的文件会以file layout为例详细讲解pNFS。