一、 NFS优缺点
NFS是Network File System的缩写及网络文件系统,NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph。
1、NFS存储优点
1)NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。(2000w日pv以下网站没问题)
2)NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
2、NFS存储局限
1)存在单点故障, 如果nfs服务器宕机,所有客户端都不能访问。
解决:需加backup机器,维护麻烦web->nfs()->backup
2)NFS数据明文, NFS并不对数据完整性做任何校验。
3)客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)
3、NFS应用建议
1)生产场景应将静态数据(比如:jpg\png\mp4\avi\css\js)尽可能往前端推,减少后端NFS存储压力。
比如使用CDN加速以及内网搭建文件缓存服务(Squid、Nginx、Varnish)
2)多个目录挂载到不同NFS服务器上(即NFS拆分为多台)
3)使用分布式文件系统(如MFS、FastDFS)
4)如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
二、 NFS原理介绍
我们知道,NFS通过网络进行数据传输。因此,NFS会使用一些端口来传输数据,那么,NFS到底使用哪些端口呢?
通过重启NFS测试可知,NFS会随机启动很多端口。
[root@nfs ~]# netstat -lntup|grep rpc
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 6752/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 6789/rpc.mountd
tcp 0 0 0.0.0.0:40868 0.0.0.0:* LISTEN 6746/rpc.statd
tcp6 0 0 :::111 :::* LISTEN 6752/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 6789/rpc.mountd
tcp6 0 0 :::49786 :::* LISTEN 6746/rpc.statd
udp 0 0 127.0.0.1:986 0.0.0.0:* 6746/rpc.statd
udp 0 0 0.0.0.0:987 0.0.0.0:* 6752/rpcbind
udp 0 0 0.0.0.0:20048 0.0.0.0:* 6789/rpc.mountd
也就是说,NFS在传输数据时使用的端口会随机选择。既然这样,NFS 客户端是怎么知道 NFS 服务器端使用的是哪个端口的呢?答案就是通过 RPC (Remote Procedure Call,中文意思远程过程调用)服务/协议来实现。
什么是RPC?
因为 NFS 支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动个功能就会启用一些端口来传输数据,因此,NFS 的功能所对应的端口无法固定,它会随机取用一些未被使用的端口作为传输之用,其中 Centos5.x 的随机端口都小于 1024,而 Centos7.6 的随机端口都是比较大的。
因为端口不固定,这样一来就会造成 NFS 客户端与 NFS 服务器端的通信障碍,因为 NFS 客户端必须要知道 NFS 服务器端的数据传输端口才能进行通信,才能交互数据。要解决这个问题,就要RPC出马了。
NFS 的 RPC服务最主要的功能就是记录每个 NFS 功能所对应的端口号,并且在 NFS 客户端发出请求时将该端口和功能对应的信息传递给请求数据的 NFS 客户端,从而确保客户端可以连接到正确的 NFS 端口上去,达到实现数据传输、交互数据目的。这个RPC服务类似 NFS服务器端和 NFS 客户端之间的一个中介,NFS 工作流程如下图所示。
那么RPC又是如何知道每个NFS端口号呢?
当 NFS 服务器端启动服务时会随机取用若干端口,并主动向 RPC 服务注册取用的相关端口及功能信息,如此一来,RPC 服务就知道 NFS 每个端口对应的 NFS 功能了。然后 RPC 服务使用固定 111端口来监听 NFS 客户端提交的请求,并将正确的 NFS 端口信息回复给请求的 NFS 客户端,这样一来,NFS 客户端就可以与 NFS 服务器端进行数据传输了。
因此,在启动 NFS Server 之前,首先要启动 RPC 服务(Centos6/7 环境下为rpcbind 服务),否则 NFS Server 就无法向 RPC 服务注册了。另外,如果 RPC 服务重新启动,原来已经注册好的 NFS 端口数据就会丟失,因此,此时 RPC 服务管理的 NFS 程序也需要重新启动以重新向 RPC 注册。要特别注意,修改 NFS 配置文件后是不需要重启 NFS 的,直接在命令行执行 systemctl reload nfs 或 exportfs-r 即可使修改的/etc/exports 生效。
总之,NFS客户端向服务端存取文件时,数据流程大致如下图:
从上面流程可知,NFS客户端和服务端都需要先启动RPC服务,NFS服务必须在RPC启动后启动,客户端无需启动NFS服务,但需要RPC服务。
三、 NFS 权限控制
四、 NFS 挂载选项
1、控制读写
rw、ro
2、控制文件权限
root_squash
no_root_squash
all_squash
no_all_squash
3、控制写模式
sync
async
4、控制用户
anonuid
anongid
统一用户:
1、创建用户
# groupadd www -g 666
# useradd www -u 666 -g 666 -M -r -s /sbin/nologin
2、修改挂载点权限
# chown -R www.www /web/
3、使用
五、参考
NFS设置固定端口,添加防火墙规则
https://www.jianshu.com/p/9fb004b30f1e
NFS 安全加固
https://www.jianshu.com/p/12bbe84112d4
NFS服务的用户身份映射
https://blog.51cto.com/yttitan/2406403
NFS客户端挂载目录后无写入权限的解决方案
https://www.jianshu.com/p/736ff7c15cd6
NFS网络共享存储快速入门:NFS原理
https://mp.weixin.qq.com/s/OwgMV7sTRHENAGI-0w8bMA
那一夜无眠之我被国内存储厂商给坑了
https://mp.weixin.qq.com/s/woSLVMLloxZY2ldvqQ2Ftw
完全解读NFS
https://mp.weixin.qq.com/s/ZGJjz8IRkZvqRFlO84TT7w
Linux之NFS
https://mp.weixin.qq.com/s/SHd6musOQxQeFXLr2dk8iA
NFS实战(含NFS常用权限配置参数)
https://mp.weixin.qq.com/s/JF-cdYCACZeFyCSXSLFYGA