第一十零章 三足鼎立——DAS、SAN 和NAS

第一节 NAS也疯狂


 
10.1.3  万物归一——网络文件系统

    微软老道在吸取瓜董的思想之后,终于创立了自己的理论。武当的仓库就像一个大的卷,一个大的磁盘阵列。它可以划分出多个LUN供多个使用者使用。而每个使用者必须有自己的文件系统,因为这个LUN只是一个卷设备,只提供了不计其数的房间存放货物。至于怎么存放货物。需要由使用者自己决定和管理,也就是用文件系统来管理卷,像理货员作货物记录一样。

    微软老道把瓜董的思想用在了存储上,他把文件系统的功能从使用者处迁移到了磁盘阵列之上,让磁盘阵列自己管理存储空间。而对外提供统一的用户接口(货物存取单据v2.0),使得使用者不用再记录某某文件和卷上扇区或者簇块的对应关系,这个工作统统由盘阵上的集中式文件系统模块处理。使用者只需通过网络告诉这个文件系统需要存取什么文件,长度是多少就可以了。具体存取数据的过程,由集中式文件系统来做,使用者只需等待接收数据就可以了。同样,在存文件的时候,使用者只需告诉文件系统要存哪些数据,提供一些文件名、长度、哪个目录下等信息就可以了,至于文件存到卷的哪些空余扇区完全由盘阵上的文件系统逻辑来处理,使用者不必关心。

    位于盘阵上的集中式文件系统得益于包交换网络,可以同时处理多个使用者的请求。它可以给每个使用者提供各自的文件夹目录,并且可以为这些目录限定允许存放的最大数据量。总之,文件系统可以实现的任何功能都可以在盘阵上实现。

1.网络文件系统

    使用者如何与盘阵上的集中式文件系统进行交互呢?当然是通过网络来传递数据。由于一直以来的习惯,以太网加TCP/IP成为了首选的网络方式。除了底层传输网络,还必须定义上层的应用逻辑。

    针对上层逻辑,微软定义了自己的一套规范,叫做CIFS(Common Internet File System),意思是Internet范围的FS。Linux和UNIX系统使用了另一种方式,称为NFS(Network File System),这些上层协议都是利用TCP/IP协议进行传输的。

    以上描述的模型统称为“网络文件系统”。这种文件系统逻辑不是在本地运行,而是在网络上的其他节点运行,使用者通过外部网络将读写文件的信息传递给运行在远端的文件系统,也就是调用远程的文件系统模块,而不是在本地内存中调用文件系统的API来进行。所以网络文件系统又叫做远程调用式文件系统,也就是RPC FS(Remote Procedure Call File System)。

    相对于SAN来说,这种网络文件系统不仅磁盘或卷在远程节点上,连文件系统功能也搬运到了远程节点上。本地文件系统可以直接通过主板上的导线访问内存来调用其功能。而网络文件系统只能通过网络适配器上连接的网线而不是主板上的导线来访问远端的文件系统功能。
网络文件系统在网络上传递的是些什么内容呢?下面用抓包的方式来分析一下。

1) CIFS协议网络包分析

    在某个用CIFS访问方式的目录下新建一个文本文档,然后将它删除。此过程中抓取网络流量。在CIFS方式下,仅仅上述两个动作,就引发了网络上数百个包的流量(如图10-10所示),可见CIFS是一个开销非常大的NAS协议。这里就不一一分析每个包了。
 
图10-10  CIFS协议交互的数据包
 
图10-10  CIFS协议交互的数据包

2) NFS协议网络包分析

    在一台Linux客户端上使用NFSv3来Mount一台NFS服务器上的某个目录到本地的/mnt目录下。进入这个目录,然后用touch a命令来创建一个名为 a的文件,然后执行vi a,进入编辑模式,不作到任何修改,退出,之后用rm a命令来删除这个文件。其间抓取网络上的流量。
 
    提示 10.128.132.45是NFS客户端的IP地址,10.128.132.175是NFS服务器端的IP地址。分析结果已经去除了不必要的TCP包以及TCP_ACK等包。
 
提示
 
图10-11显示的是这个过程中网络上双方所交互的主要数据包。
 
图10-11  NFS方式下网络上的数据包
 
图10-11  NFS方式下网络上的数据包

     可以看到,NFS协议的开销远远小于CIFS协议。完成相似动作,NFS只需要交互十几个包即可。下面来分析每个包的作用。

    Frame1(如图10-12所示):客户端在创建文件之前,首先做了一次lookup操作,来查找当前目录中是否已经有同名文件;如果有,则拒绝创建。图中的DH表示Directory Handle,是一个32字节长的字段,这个值用来指代目录名称。在第一次访问某个目录时,NFS服务端会动态分配这个值,将其通知给客户端。随后的访问请求中,客户端将使用这个值而不是目录名称来向NFS服务端发起针对这个目录的请求。
 
图10-12  客户端的Lookup请求提示
 
图10-12  客户端的Lookup请求提示

提示

    图中DH值的hash值为0x98f8d6bb,为了表示方便,抓包软件将其hash成一个4字节的值,这个hash值并不是存在于网络包中的。本例中,/mnt目录被指定的DH值的hash值就是0x98f8d6bb。