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

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 来监听客户端的需求并回报客户端正确的端口。

扫描二维码关注公众号,回复: 1607361 查看本文章


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

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

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

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


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

NFS

XDR(备注1)

RPC

TCP,UDP

IP

DataLink 

Ethernet

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

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




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




猜你喜欢

转载自blog.csdn.net/qq_38918259/article/details/80492419