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 RPC与Gluster 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
备注1:XDR(eXternalData Representation,即外部数据表示法)提供一种方法,把数据从一种格式转换成另一种标准数据格式表示法,确保在不同的计算机、操作系统及程序语言中,所有数据代表的意义都是相同的
可以使用rpcinfo 去获取注册的rpc
- Gluster源代码阅读1--RPC与NFS
- Gluster源代码阅读3--MGMT Xlator
- NFS与RPC
- NFS 与RPC
- Gluster源代码阅读2--启动分析service glusterd start
- NFS中RPC的异步与同步
- RPC + NFS
- 阅读Hadoop 源代码最重要的就是明白rpc机制,client与master,master和slave的通信
- Hadoop RPC 源码阅读1
- HBase源代码阅读与理解
- HBase源代码阅读与理解
- OS161 源代码阅读-1
- 源代码阅读技巧1
- NFS和RPC
- gluster安装,镜像卷配置,扩展,故障恢复,nfs挂载
- quake源代码阅读分析(1)
- 阅读go语言源代码1
- ROHC源代码阅读日志(1)
- javaScript文档中常用的集合
- LLDB调试命令(一) p 和 po 命名行的鼻祖 expression 命令
- scala集合
- iOS 基础篇4—懒加载
- git学习一
- Gluster源代码阅读1--RPC与NFS
- SAP携手NBA 中国在华推出 NBA.com/Stats
- 建造者模式(生成器模式)
- 2016年中小总结
- 微信自定义菜单集成多客服功能的方法与总结
- Android应用开发之自动更新不用愁
- Android开发之使用AndroidStudio开发工具实现JNI的开发
- muduo网络库使用
- Eclipse复制粘贴很卡解决方法