NFS简介
nfs是Network File System的缩写,中文意思就是网络文件系统。主要功能就是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端,可以通过挂在的方式将NFS服务端共享的数据目录挂在到NFS客户端本地系统中。从客户端本地看,NFS服务端共享的目录就好像是客户端自己的磁盘分区一样,从而却是远端的NFS服务器的目录。NFS网络文件系统就像windows系统的网络共享。
NFS应用以及企业中NFS的作用
在企业的集群架构中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都可以读取NFS存储上的组员。
用户A上传一个图片无论是放在那台机器上,最终都会放到存储服务器上。而用户B无论访问那台机器都会找到。
NFS系统原理介绍
这张图说明了NFS在启动之前会需要先启动rpc服务,因为nfs是通过网络来进行传输的,因此,nfs会使用一些端口来传输数据。但是nfs的端口号不固定,是随机的。这样的话nfs客户端就无法得知nfs服务端的端口号了。也就不能建立连接了。所以得需要rpc来实现
rpc介绍
RPC(中文意思就是远程过程调用),NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对用的信息传递给请求数据的NFS服务端,从而确保客户端可以连接到正确的NFS端口上去。达到实现数据传输。
nfs 的工作流程图
1)用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端的RPC服务,会通过网络向NFS服务器端的RPC服务的111端口发出NFS文件存取功能的询问请求。
2)NFS服务器端的PRC服务找到对应自己的NFS端口后,通知NFS客户端的PRC服务
3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
4)NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果。
NFS部署
外网 10.0.0.7 内网 172.16.1.7 客户端 web01
外网10.0.0.41 内网172.16.1.31 服务端 nfs
yum install -y nfs-utils rpnbind (客户端和服务端都要安装)
nfs-utils :NFS服务的主程序,包括rpc.nfsd rpc.mountd rpc.idmapd和相关文档说明,以及执行命文件等
rpcbind:在启动RPC 程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。所以在提供NFS服务之前需要先启动rpcbind服务
启动nfs(服务端)
1)systemctl start rpnbind
- sustemctl start nfs
2)客户端启动rpcbind
systemctl start rpcbind
NFS配置文件/etc /exports
[root@nfs ~]# vim /etc/exports
shar upload## 前面有# 号
/upload 172.16.1.0/24(rw) rw带表允许客户端只读写
可以同通过如下来查看nfs配置参数以及默认的参数
root@nfs ~]# cat /var/lib/nfs/etab
/upload 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
参数说明
rw(Read-write) 表示可读写权限
ro(read-only)表示只读
sync 请求或写入数据时,数据同步写入到NFS server的硬盘后才返回。 优点,数据安全不丢失。缺点,性能比不启动该参数差。
async 写入时数据会先写到内存缓冲区,直到硬盘有了空挡才会写入磁盘,这样可以提升写入效率。风险就是服务器宕机或者不正常的关机,会损缓冲区中未写入磁盘的数据。
no_root_squash 如果该用户时root用户,它对共享目录具有root权限
root_squash 如果访问的用户时root用户,他对共享目录是匿名用户,并且他的UID和GID都为nfsnobody
all_squash 不管是谁访问,他的权限都是匿名用户并且UID和GID都为nfsnobody。
anonuid 他可以使得不同的NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入数据对所有NFS cliemts保持用同样的用户权限,即为配置的匿名UID对用户权限,这。
anongid 跟anonuid一样就是把uid换成gid
流程图:
实战
服务端客户端都启动 好了以后
在客户端检查
然后再服务端创建共享的的目录,并把这个目录授权用户主和用户组该成nfsnobody 客户端不用管
在客户端mount -t nfs 172.16.1.31:/upload /video
可以通过/proc/mounts查看客户端的挂在参数
NFS客户端优化
mount -o 指定挂在参数说明
nosuid 取消特殊权限如果有特殊权限文件里不让用
rw /ro 只能读写和只读
nodev 不能保留装置文件的特殊功能
noexec 不让具有执行文件的权限有x也不行
nouser 不允许用户拥有文件的挂在与卸载功能
noauto 这个auto 指的是“mount -a” 时会不会被挂在的项目,如果不需要这个分区随时被挂载,可以设置为noauto。
noatime 访问文件时不更新文件的inode时间戳,高并发环境,能提高I/O性能