Gluster源代码阅读1--RPC与NFS

来源:互联网 发布:c语言图形编程 编辑:程序博客网 时间:2024/06/05 07:48

Gluster本质上是一个NFS(网络文件系统),NFS解释如下(摘自网络)

Sun Microsystems公司于1984年推出了一个在整个计算机工业中被广泛接受的远程文件存取机制,它被称为Sun的网络文件系统(Network File System),或者简称为NFS。该机制允许在一台计算机上运行一个服务器,使对其上的某些或所有文件都可以进行远程存取,还允许其他计算机上的应用程序对这些文件进行存取。它使我们能够达到文件的共享。当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的文件操作上和本地机器的文件没两样。一个应用程序可以打开(Open)一个远程文件以进行存取,可以从这个文件中读取(Read)数据,向该文件中写入(Write)数据,定位(Seek)到文件中的某个指定位置(开始、结尾或者其他地方),最后当使用完毕后关闭(Close)该文件。并且这些操作都是对编程者透明的,操作方法和对本地文件的操作方法完全一样。NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件

图示如下


从上图可以看到RPC是基于内核的,基于内核的最明显的一个好处就是少了用户态和内核态之间的切换,因为切换是要拷贝数据的

但是Gluster这货,没有利用操作系统自带的NFS服务,而是基于NFS标准写了自己的RPC服务,并且利用NFS默认的监听端口2049来监听RPC服务,在后续章节将会介绍Gluster RPCGluster NFS

而在Gluster里,服务端利用RPC Server响应来自客户端的请求,客户端利用RPC Client来发送请求,所以一切的通信都是基于RPC的。

但是RPC和NFS又是2个独立的组件,但是它们同时又是密不可分的,所以在NFS启动之前,一定要保证RPC先启动,原因如下:(摘自网络http://vbird.dic.ksu.edu.tw/linux_server/0330nfs.php):

NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此, NFS的功能所对应的端口是固定的,但如此一来又造成客户端想要连上服务器时的困扰,因为客户端得要知道服务器端的相关端口才能够联机吧!

此时我们就得需要远程过程调用 (RPC)的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number,并且回报给客户端,让客户端可以连结到正确的端口。那 RPC又是如何知道每个 NFS的端口呢?这是因为当服务器在启动 NFS时会随机取用数个端口,并主动的向 RPC注册,因此 RPC 可以知道每个埠口对应的 NFS 功能,然后 RPC 又是固定使用 port111来监听客户端的需求并回报客户端正确的端口。


当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?

1、客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。

2、服务器端找到对应的已注册的NFSdaemon端口后会回报给客户端。

3、客户端了解正确的端口后,就可以直接与NFS守护进程来联机。


所以整个协议栈看起来如下:

NFS

XDR(备注1)

RPC

TCP,UDP

IP

DataLink 

Ethernet

备注1XDReXternalData Representation,即外部数据表示法)提供一种方法,把数据从一种格式转换成另一种标准数据格式表示法,确保在不同的计算机、操作系统及程序语言中,所有数据代表的意义都是相同的

 

可以使用rpcinfo 去获取注册的rpc



0 0