NFS=Network File System=网络文件系统。
主要功能是经过网络(通常是局域网)让不一样的主机系统之间能够共享文件或目录。
NFS客户端(通常为应用服务器,例如web)能够经过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端本身的磁盘分区或者目录同样,而实际上倒是远端的NFS服务器的目录。
分布式文件系统:Moosefs(mfs)、GlusterFS、FastDFS(推荐)
NFS属于本地文件存储服务。
NFS主要用于存储web服务器上用户上传的数据信息,图片 附件 头像 视频 音频。
前端
(1)能够实现数据统一共享存储
(2)节省架构服务运营成本
node
优势:配置 安装简单
缺点:没有认证功能 分布式存储/ftp/samba
没法支持高并发存储 日PV 2000万
没法实现高可用 分布式存储/keepalived
mysql
(1)FTP服务部署
(2)samba服务部署(可让Windows与linux同时访问)
linux
能够实现数据共享,数据统一一致,节省架构服务运营成本
web
(1)在nfs服务端建立共享目录
(2)经过mount 网络挂载,将NFS服务端共享目录挂载到NFS客户端本地目录上。
(3)NFS客户端挂载目录上建立、删除、查看数据操做,等价于在服务端进行建立、删除、查看数据操做。
sql
由于NFS的各项功能都须要向RPC服务(rpcbind服务)注册,因此只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能经过向RPC服务询问才能找到正确的端□。也就是说,NFS须要有RPC服务的协助才能成功对外提供服务。
windows
当访问程序经过NFS客户端向NFS服务器存取文件时,其请求数据流程大体以下:
(1)首先用户访间网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会经过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询间请求.
(2)NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务。l
(3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
(4)NFS客户端把数据存取成功后,返回给前端访间程序,告知用户存取结果,做为网站用户,就完成了一次存取操做。
后端
RPC 远程过程调用程序。先启动PRC服务,而后在启动NFS。
centos
yum install -y nfs-utils rpcbind rpm -qa nfs-utils rpm -qa rpcbind
vim /etc/exports #进入配置文件 /data 172.16.1.0/24(rw,sync) #写入命令 # /data 能够进行共享存储目录 # 172.16.1.0/24(rw,sync) 容许存储数据网段信息(存储目录权限配置 存储数据方式配置)
sync=同步方式存储数据:用户有数据存储 ---- 存储服务器(磁盘中) 存储安全性高
async=异步方式存储数据:用户有数据存储 ---- 内存 --- 存储服务器(磁盘中) 存储效率高
mkdir /data chown nfsnobody.nfsnobody /data
systemctl start rpcbind systemctl reload rpcbind #重启rpcbind 平滑重启 systemctl enable rpcbind systemctl start nfs systemctl reload nfs #重启nfs systemctl enable nfs ### restart:将全部链接会话都会直接断开 ### reload: 只会将没有数据传输连接断开,从新创建链接,让用户访问感觉更好
yum install -y nfs-utils
mount -t nfs 172.16.1.31:/data /mnt
客户端建立文件: [root@web01 mnt]#ls [root@web01 mnt]#touch test.txt [root@web01 mnt]#ls test.txt 服务端同步文件: [root@nfs01 data]#ls [root@nfs01 data]#ls test.txt 服务端与客户端文件同步,则测试成功。
ro | 只读配置,使存储目录权限位只读,使开发人员只能看 | |
---|---|---|
rw | 读写权限 | |
sync | 同步存储数据 | |
async | 异步存储数据 | |
all_squash | 不论什么用户包括root,都映射为指定nfsnobody用户 | |
no_all_squash | 对普通用户不作映射,无权限。root用户映射为nfsnobody | |
root_squash | 将root用户映射为指定nfsnobody用户,普通用户无权限 | |
no_root_squash | 将root用户不作映射,普通用户无权限 | |
anonuid | 指定uid,指定映射成什么用户 | |
anongid | 指定gid,指定映射成什么用户 |
在企业中,通常选用no_all_squash,root_squash。
第一步:服务端修改服务配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash) systemctl reload nfs
第二步:客户端上传数据测试
[root@web01 mnt]#touch test.txt [root@web01 mnt]#ll test.txt -rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 20:57 test.txt
第一步:服务端修改服务配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,no_all_squash) systemctl reload nfs
第二步:客户端上传数据测试
[root@web01 mnt]# touch aaa.txt [root@web01 mnt]# ll -rw-rw-r-- 1 1017 1017 0 Jul 16 12:08 aaa.txt ### 用户传输数据身份没有变化,看用户uid信息
第一步:服务端修改服务配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,root_squash) systemctl reload nfs
第二步:客户端上传数据测试
[root@web01 mnt]# touch bbb.txt [root@web01 mnt]# ll -rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 12:19 bbb.txt ### root用户会映射为指定的nfsnobody用户
第一步:服务端修改服务配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,no_root_squash) systemctl reload nfs
第二步:客户端上传数据测试
[root@web01 mnt]# touch ccc.txt [root@web01 mnt]# ll -rw-r--r-- 1 root root 0 Jul 16 12:22 ccc.txt ### 将root用户不作映射
要求服务端:
/data/w 可读可写权限,全部用户都作映射, 采用同步传输数据
/data/r 只能读取数据,只有root用户组映射,采用异步传输数据
要求客户端:
backup /data/w --挂载点 /data/w 能够存储数据
web01 /data/r --挂载点 /data/r 不能存储数据
解决服务端:
(1)编写配置文件
vi /etc/exports /data/w 172.16.1.0/24(rw,sync,all_squash) /data/r 172.16.1.0/24(ro,async,root_squash)
(2)建立共享存储目录
web01: mkdir /data/r chown nfsnobody.nfsnobody /data/r backup: mkdir /data/w chown nfsnobody.nfsnobody /data/w
(3)重启存储服务
systemctl reload nfs
解决客户端:
(1)建立挂载点目录
web01:mkdir /data/r backup:mkdir /data/w
(2)进行挂载
web01 mount -t nfs 172.16.1.31:/data/r /data/r backup mount -t nfs 172.16.1.31:/data/w /data/w
(3)验证成功
[root@web01 r]#touch hh.txt touch: cannot touch ‘hh.txt’: Read-only file system ### 只读权限,因此出现这种状况才是正常 [root@backup w]#touch kk.txt ### 读写权限,因此能建立 [root@backup w]#ls kk.txt
(1)服务端配置文件参数 exports文件里ro/rw参数
(2)服务端自己目录权限
(3)服务端共享目录权限存在继承关系 例如:/data,/data/r
PS:建议设置共享目录时,不要存在父级与子级关系
(4)客户端挂载参数是否为 ro
ls: cannot open directory .: Stale file handle (文件句柄错误)
出现缘由: 当父级和子级目录同时进行挂载时,一旦父级目录取消共享,可是客户端仍是处于挂载状态
问题解决: 将和父级目录有关的全部挂载点所有卸载,从新挂载
Cannot register service: RPC: Unable to receive;
出现缘由: 服务启动顺序不正确
问题解决: 关闭全部服务,按顺序进行启动
出现挂载卡死状况
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出现缘由: 服务端开启防火墙,阻止客户端访问
问题解决: 关闭防火墙
服务端采用restart状况,会有一个90s延迟;形成客户端挂载好共享目录,90s内没法存储数据
出现缘由:
cat /etc/sysconfig/nfs|grep 90
#NFSD_V4_GRACE=90
#NFSD_V4_LEASE=90
未注册状况
[root@nfs01 ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
已经进行注册
[root@nfs01 ~]# rpcinfo -p localhost program vers proto port service 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 服务关闭在开启,有些端口会发生改变 100021 1 udp 60318 nlockmgr 100021 3 udp 60318 nlockmgr 100021 4 udp 60318 nlockmgr 100021 1 tcp 32828 nlockmgr 100021 3 tcp 32828 nlockmgr 100021 4 tcp 32828 nlockmgr
命令:showmount -e 172.16.1.31 NFS没有安装,不能使用showmount
[root@nfs01 data]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /data/r 172.16.1.0/24 /data/w 172.16.1.0/24
/etc/exports #配置文件 /var/lib/nfs/etab #记录nfs服务默认配置参数信息 rpcinfo -p 172.16.1.31 #检查nfs是否向rpc注册 showmount -e 172.16.1.31 #检查nfs服务是否存在共享目录 /usr/sbin/exportfs #能够平滑重启nfs服务,能够临时设置共享存储目录 平滑重启服务:exportfs -rv 临时建立目录:exportfs -o rw,sync 192.168.232.0/24:/data01
mount -t nfs 172.16.1.31:/data /mnt
方法一:vi /etc/rc.local mount -t nfs 172.16.1.31:/data /mnt 方法二:vi /etc/fstab文件 172.16.1.31:/data /mnt nfs defaults 0 0
centos6
启动系统 -- 加载fstab -- 启动network网络服务 -- netfs(在系统启动完毕以后,再次加载fstab)
centos7
启动系统 -- 加载fstab -- 启动network网络服务 -- remote-fs.target(在系统启动完毕以后,再次加载fstab)
出现缘由:在客户端上配置自动nfs服务挂载 --- 耦合度过高
解决问题:
(1)取消自动挂载
(2)启动顺序 先开启后端服务(nfs mysql backup 缓存服务) 在开启前端服务(web服务 负载均衡服务)
rw | 让挂载点目录具备可读可写权限 相反ro | |
---|---|---|
suid=setuid | 让挂载点目录中的文件特殊权限位生效 相反nosuid 安全 | |
dev | 让挂载点目录存储设备文件保持属性不变 | |
exec | 让挂载点目录中的执行文件能够执行 相反noexec | |
auto(mount -a) | 让挂载点目录实现快速自动挂载 相反noauto | |
nouser | 让普通用户是否能够卸载和挂载目录 相反user | |
async | 数据异步存储概念,相反sync同步存储 | |
noatime | 访问文件时不更新文件的inode时间戳,高并发环境下,推荐显示应用该选项,能够提升系统I/O性能。性能优化 | |
nodiratime | 不更新文件系统上的directory inode时间戳,高并发环境,推荐显式应用该选项,能够提升系统I/O性能。性能优化 | |
remount | 在不进行卸载挂载点时,直接从新挂载修改挂载参数 文件系统只读:mount -o remount,rw / 解决 |
|
rsize=262144 | 设置一个缓存区 262144字节 设置大小和内存有关 用户 (读取) --- web01 /data 2M --- nfs /data 10M 压力大 |
|
wsize=262144 | 设置一个缓冲区 262144字节 用户(存储) --- web01 /data 10M --- nfs /data 10M 压力大 |
|
hard | 当服务端处于关闭状态,客户端会处于一直挂载 | |
soft | 当服务端处于关闭状态,不会一直挂载 | |
proto=tcp | 挂载协议 |
客户端重要文件:/proc/mounts --- 查看到mount挂载命令默认参数信息
强行进行卸载:umount -lf
(1)更新yum源
(2)利用rpm安装软件 得到rpcbind软件包
vim /etc/yum.conf cachedir=/var/cache/yum/$basearch/$releasever --- 下载软件保存路径 keepcache=1 --- 下载软件保留下来,不要被删除 rpm -ivh rpcbind-0.2.0-47.el7.x86_64.rpm.rpm --- 安装rpcbind