共计 2068 个字符,预计需要花费 6 分钟才能阅读完成。
导读 | RPC(远程过程调用,定义在 RFC1057),见名知意,就是客户端调用远程服务器上函数的一种方法。RPC 的目标就是要以下 2~8 这些步骤都封装起来,让用户对这些细节透明。 |
1)服务消费方(client)调用以本地调用方式调用服务;
2)client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3)client stub 找到服务地址,并将消息发送到服务端;
4)server stub 收到消息后进行解码;
5)server stub 根据解码结果调用本地的服务;
6)本地服务执行并将结果返回给 server stub;
7)server stub 将返回结果打包成消息并发送至消费方;
8)client stub 接收到消息,并进行解码;
9)服务消费方得到最终结果。
NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。在 NFS 的应用中,本地 NFS 的客户端应用可以透明地读写位于远端 NFS 服务器上的文件,就像访问本地文件一样。
目前 NFS 主要有两个版本(NFSv2,NFSv3)两个版本,而 NFSv2 和 NFSv3 除了 3 版本支持更多的新特性以外,最主要的区别应该就是 NFSv2 是使用 UDP 协议进行传输的,所以 NFSv2 的连接在复杂网络环境下可能没有那么可靠,而 NFSv3 同时支持 UDP 和 TCP 协议。
刚才看了一下,Centos7 已经支持 NFSv4 协议了,这里就不贴 NFSv4 了,有时间了再去看 v4 吧。
当 client 端要挂载 NFS 共享卷的时候,会发送 RPC 请求给服务端,而 NFS 服务端会在用户验证后将一个随机的 cookie 传送至客户端,以便客户端使用这个 cookie 来认证那些要访问的共享卷。
NFS 的验证支持内置的 IP/ 主机权限分配,同时也被 tcp wrappers 所限制。
Redhat 内核中默认就开启了 NFS 支持,并且通过 NFS 的 Daemon 来控制 NFS 服务端的启动,而负责将网络套接字和 RPC 调用绑定起来,还需要一个 rpcbind 服务(在 redhat5 中名为 portmap),如果你在系统中找不到 nfs 服务,是因为没有安装 nfs-utils 这个包,这个包提供了一些工具和服务脚本等。
整个 NFS 服务大概包含以下几个(抄自红帽官方文档,但是有点老了好像):
- nfs — 启动响应的 RPC 进程来响应 NFS
- nfslock — 这是一个可选的服务,用来响应客户端对文件加锁的请求。
- rpcbind(portmap) — 这个是 rpc 服务的守护进程,用来建立连接并且响应 rpc 请求。
NFS 服务提供了这几个 RPC 调用(函数):
- rpc.mountd — 这个函数用来响应客户端的 mount 请求并且验证所请求的文件系统是否有权可用,这个进程由 nfs 服务来启动。
- rpc.nfsd — nfs 服务的主进程(函数)。
- rpc.lockd — 上面 nfslock 这个服务的主要调用(函数),主要用来响应客户的文件加锁请求。
- rpc.statd — 这个调用(函数)主要是用来当 nfs server 重启或不正常关闭时通知 client 的,由 nfslock 服务启用。
- rpc.rquotad — nfs 服务用于支持配额的调用(函数)。
NFS 的配置文件在 /etc/exports
默认是一个空文件,只需要按照如下格式配置即可,一行一个共享卷
host: 限定主机(域名)
1. 单个主机或 IP
2. 通配符 *(匹配任意字符)或?(匹配任意单个字符),用在域名或主机名中
3.IP/MASK, 例如 192.168.110.0/24
options: 挂载选项,用于限定前面主机的挂载权限。
常用选项:
- ro,rw: 只读或可读写
- sync: 同步,当 client 的写请求完成后,立即将内存中的数据写入到磁盘,这样做是安全的。
- async:异步,当 client 的写请求完成后,server 不是立即将数据写入到磁盘,而是在某个时机(空闲或…. 鬼知道)写入到磁盘,这就造成了数据丢失的可能性。
- wdelay(write delay):写入延迟,这是一个优化选项,允许服务器延迟将数据写入磁盘,这样如果第二次 client 的写请求到来,将两次数据使用一次 write 系统调用写入到磁盘。
- nowdelay:与上相反,仅在 sync 模式下可使用。
- root_squash:“压扁”root, 因为 client 将文件写入到 server 时,是使用 client 写入用户的 uid 直接映射为 server 同 uid 的用户,这样 root 用户存放到 nfs share volume 上的文件,在 server 端属主和属组还是 root,有一定的安全隐患,所以可用此选项将 root 压扁为 nfsnobody 用户。
- all_squash:压扁所有用户,可使用 anonuid=,anongid= 来指定压扁为哪个用户。