1 NFS 简介
1.1 什么是 NFS
NFS=Network File System = 网络文件系统.
主要功能是通过网络 (一般是局域网) 让不同的主机系统之间可以共享文件或目录.
NFS 客户端 (一般为应用服务器, 例如 web) 可以通过挂载 (mount) 的方式将 NFS 服务器端共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下). 从客户端本地看, NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样, 而实际上却是远端的 NFS 服务器的目录.
分布式文件系统: Moosefs(mfs),GlusterFS,FastDFS(推荐)
NFS 属于本地文件存储服务.
NFS 主要用于存储 Web 服务器上用户上传的数据信息, 图片 附件 头像 视频 音频.
1.2 NFS 存储服务价值
(1)可以实现数据统一共享存储
(2)节省架构服务运营成本
1.3 NFS 存储服务的优缺点
优点: 配置 安装简单
缺点: 没有认证功能 分布式存储 / ftp/samba
无法支持高并发存储 日 PV 2000 万
无法实现高可用 分布式存储 / keepalived
1.4 实现 Windows 与 Linux 文件数据共享
(1)FTP 服务部署
(2)samba 服务部署(可以让 Windows 与 Linux 同时访问)
1.5 NFS 网络文件共享系统由来
可以实现数据共享, 数据统一一致, 节省架构服务运营成本
1.6 NFS 网络文件系统工作方式(存储原理)
(1)在 nfs 服务端创建共享目录
(2)通过 mount 网络挂载, 将 NFS 服务端共享目录挂载到 NFS 客户端本地目录上.
(3)NFS 客户端挂载目录上创建, 删除, 查看数据操作, 等价于在服务端进行创建, 删除, 查看数据操作.
1.7 NFS 存储文件系统中两个重要服务
1 RPC 服务 2 NFS 服务
1.7.1 RPC 服务工作原理
因为 NFS 的各项功能都需要向 RPC 服务 (rpcbind 服务) 注册, 所以只有 RPC 服务才能获取到 NFS 服务的各项功能对应的端口号(port number),PID,NFS 在主机所监听的 IP 等信息, 而 NFS 客户端也只能通过向 RPC 服务询问才能找到正确的端□. 也就是说, NFS 需要有 RPC 服务的协助才能成功对外提供服务.
1.7.2 NFS 工作流程
1.7.3 NFS 详细访问流程
当访问程序通过 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 客户端把数据存取成功后, 返回给前端访间程序, 告知用户存取结果, 作为网站用户, 就完成了一次存取操作.
2 NFS 存储服务部署
RPC 远程过程调用程序. 先启动 PRC 服务, 然后在启动 NFS.
2.1 服务端部署
2.1.1 安装软件程序
- yum install -y nfs-utils rpcbind
- rpm -qa nfs-utils
- rpm -qa rpcbind
2.1.2 编写配置文件
- VIM /etc/exports #进入配置文件
- /data 172.16.1.0/24(rw,sync) #写入命令
- # /data 可以进行共享存储目录
- # 172.16.1.0/24(rw,sync) 允许存储数据网段信息(存储目录权限配置 存储数据方式配置)
sync = 同步方式存储数据: 用户有数据存储 ---- 存储服务器(磁盘中) 存储安全性高
async = 异步方式存储数据: 用户有数据存储 ---- 内存 --- 存储服务器(磁盘中) 存储效率高
2.1.3 创建目录, 对目录进行授权
- mkdir /data
- chown nfsnobody.nfsnobody /data
2.1.4 启动服务程序
- systemctl start rpcbind
- systemctl reload rpcbind #重启 rpcbind 平滑重启
- systemctl enable rpcbind
- systemctl start nfs
- systemctl reload nfs #重启 nfs
- systemctl enable nfs
- ### restart: 将所有连接会话都会直接断开
- ### reload: 只会将没有数据传输链接断开, 重新建立连接, 让用户访问感受更好
2.2 客户端部署
2.2.1 安装相关软件
yum install -y nfs-utils
2.2.2 进行存储目录挂载
mount -t nfs 172.16.1.31:/data /mnt
2.2.3 进行测试
客户端创建文件:
- [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
服务端与客户端文件同步, 则测试成功.
3 存储服务配置文件编写格式
3.1 配置文件 exports 参数
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.
3.1.1 all_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
3.1.2 no_all_squash 映射实践
第一步: 服务端修改服务配置文件
- 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 信息
3.1.3 root_squash 映射实践
第一步: 服务端修改服务配置文件
- 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 用户
3.1.4 no_root_squash 映射实践
第一步: 服务端修改服务配置文件
- 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 用户不做映射
3.2 NFS 客户端映射原理图
3.2.1 映射原理练习题
要求服务端:
/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
3.3 影响 NFS 服务存储权限原因
(1)服务端配置文件参数 exports 文件里 ro/rw 参数
(2)服务端本身目录权限
(3)服务端共享目录权限存在继承关系 例如:/data,/data/r
PS: 建议设置共享目录时, 不要存在父级与子级关系
(4)客户端挂载参数是否为 ro
4 NFS 挂载常见问题
4.1 异常问题一
ls: cannot open directory .: Stale file handle (文件句柄错误)
出现原因: 当父级和子级目录同时进行挂载时, 一旦父级目录取消共享, 但是客户端还是处于挂载状态
问题解决: 将和父级目录有关的所有挂载点全部卸载, 重新挂载
4.2 异常问题二
Cannot register service: RPC: Unable to receive;
出现原因: 服务启动顺序不正确
问题解决: 关闭所有服务, 按顺序进行启动
4.3 异常问题三
出现挂载卡死情况
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出现原因: 服务端开启防火墙, 阻止客户端访问
问题解决: 关闭防火墙
4.4 异常问题四
服务端采用 restart 情况, 会有一个 90s 延迟; 造成客户端挂载好共享目录, 90s 内无法存储数据
出现原因:
- cat /etc/sysconfig/nfs|grep 90
- #NFSD_V4_GRACE=90
- #NFSD_V4_LEASE=90
4.5 NFS 存储排错原理
4.5.1 检查服务端服务是否启动
4.5.2 检查 NFS 服务是否向 RPC 服务注册
未注册情况
- [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
4.5.3 检查 NFS 服务是否存在共享目录
命令: 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
4.6 NFS 服务相关重要文件命令
- /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
4.7 NFS 服务客户端挂载
4.7.1 如何进行挂载
mount -t nfs 172.16.1.31:/data /mnt
4.7.2 如何开机挂载
方法一: 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)
4.7.3 启动 nfs 服务客户端很慢
出现原因: 在客户端上配置自动 nfs 服务挂载 --- 耦合度太高
解决问题:
(1)取消自动挂载
(2)启动顺序 先开启后端服务(nfs MySQL backup 缓存服务) 在开启前端服务(Web 服务 负载均衡服务)
4.7.4 挂载参数说明
rw | 让挂载点目录具有可读可写权限 & nbsp; 相反 ro | |
---|---|---|
suid=setuid | 让挂载点目录中的文件特殊权限位生效 相反 nosuid 安全 | |
dev | 让挂载点目录存储设备文件保持属性不变 | |
exec | 让挂载点目录中的执行文件可以执行 & nbsp; 相反 noexec | |
auto(mount -a) | 让挂载点目录实现快速自动挂载 & nbsp; 相反 noauto | |
nouser | 让普通用户是否可以卸载和挂载目录 & nbsp; 相反 user | |
async | 数据异步存储概念,相反 sync 同步存储 | |
noatime | 访问文件时不更新文件的 inode 时间戳,高并发环境下,推荐显示应用该选项,可以提高系统 I/O 性能。性能优化 | |
nodiratime | 不更新文件系统上的 directory inode 时间戳,高并发环境,推荐显式应用该选项,可以提高系统 I/O 性能。性能优化 | |
remount | 在不进行卸载挂载点时,直接重新挂载修改挂载参数 < br ztid="387" ow="0" oh="0"> 文件系统只读:mount -o remount,rw / 解决 | |
rsize=262144 | 设置一个缓存区 262144 字节 设置大小和内存有关 用户 (读取) --- web01 /data 2M --- nfs /data 10M 压力大 | |
wsize=262144 | 设置一个缓冲区 262144 字节 < br ztid="397" ow="0" oh="0"> 用户(存储) --- web01 /data 10M --- nfs /data 10M 压力大 | |
hard | 当服务端处于关闭状态,客户端会处于一直挂载 | |
soft | 当服务端处于关闭状态,不会一直挂载 & nbsp; | |
proto=tcp | 挂载协议 |
客户端重要文件:/proc/mounts --- 查看到 mount 挂载命令默认参数信息
强行进行卸载: umount -lf
4 补充: 下载软件出现异常
(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
来源: https://www.cnblogs.com/basa/p/11217871.html