Day42-企业级网络存储NFS01
- 1. 什么是NFS?
- 2. 为什么要用网络共享存储?
- 3. 共享存储的种类
- 4. NFS工作原理
- 5. 环境准备
- 6. NFS软件列表
- 7. 安装
- 8. 配置nfs
- 9. 项目实践作业:
- 10. ()权限 对应参数
- 11. 在生产中配置NFS的重要技巧:
- 12. 项目实践2:
1. 什么是NFS?
全称 network file system 网络文件系统
通过【网络】存储和组织文件的一种方法或机制。
- 什么是文件系统?
ext4,xfs就是文件系统,存储和组织文件的一种方法或机制,就是一个软件。本地文件系统。
数据组织结构,目录,子目录,文件。 - 网络存储
通过【网络】存储和组织文件的一种方法或机制。
2. 为什么要用网络共享存储?
前端所有的应用服务器接收到用户上传的图片、文件、视频,都会统一的放到后端的存储上。
为什么要共享?所有节点服务器都需要将内容存到存储上,取的统一来取。
3. 共享存储的种类
传统存储:
早期简存储系统就是NFS,NFS性能不太高。单点,大规模高并发的访问。5000万PV/日PV
中小型企业,阿里云服务的NAS服务
大型存储厂商:EMC、Netapp 几十万。
艺龙旅行网 存储用的EMC 传统企业。
硬件存储:传统企业:稳定、2台 双主机头 几十块硬盘 RAID10。
BAT 曾经用硬件,超贵、
阿里云 去IOE Ibm Orace EMC
分布式存储:为高并发、大数据量而生
大型企业会用分布式存储FastDFS、Ceph、GlsterFS、Mfs
对象存储:
阿里云OSS对象存储。
块存储:
4. NFS工作原理
NFS网络文件系统
启动NFS服务,而且还有启动很多端口。
NFS功能,需要很多服务。每个服务都有端口,而且经常变化。
如何让客户端找到这些端口呢?就需要一个经纪人(rpc服务)
NFS服务:
1、NFS服务(有很多进程和端口),把自己的端口告诉RPC。
2、RPC服务(对外固定端口111)
客户端请求NFS服务,先找RPC 111,查到NFS的端口,发给客户。
原理见图:
5. 环境准备
服务器系统 | 服务器角色 | 内外网IP |
---|---|---|
CentOS 7.9 x86_64 | NFS服务器端(nfs01) | eth0:10.0.0.31 eth1:172.16.1.31 ====>主角 |
CentOS 7.9 x86_64 | NFS客户端1(web01) | eth0:10.0.0.7 eth1:172.16.1.7 |
CentOS 7.9 x86_64 | NFS客户端2(backup) | eth0:10.0.0.41 eth1:172.16.1.41 |
[root@nfs01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@nfs01 ~]# uname -r
3.10.0-1160.31.1.el7.x86_64
[root@nfs01 ~]# uname -m
x86_64
[root@nfs01 ~]# uname -n
nfs01
[root@nfs01 ~]# uname -a
Linux nfs01 3.10.0-1160.31.1.el7.x86_64 #1 SMP Thu Jun 10 13:32:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
6. NFS软件列表
要部署NFS服务,需要安装下面的软件包:
- nfs-utils :NFS服务的主程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
- rpcbind :CentOS6/7下面RPC主程序。NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。
7. 安装
服务器端和客户端都要安装:
rpm -qa nfs-utils rpcbind
yum install nfs-utils rpcbind -y
rpm -qa nfs-utils rpcbind [root@nfs01 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.61.el7.x86_64
rpcbind-0.2.0-47.el7.x86_64
启动RPC
[root@nfs01 ~]# systemctl start rpcbind.service
[root@nfs01 ~]# systemctl enable rpcbind.service
[root@nfs01 ~]# systemctl list-unit-files|grep rpcbind.service
看看有没有注册的端口
[root@nfs01 ~]# rpcinfo -p 127.0.0.1program vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper
启动NFS
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
[root@nfs01 ~]# systemctl list-unit-files|grep nfs.service
看看有没有注册的端口
[root@nfs01 ~]# rpcinfo -p 127.0.0.1program vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper100024 1 udp 44521 status100024 1 tcp 59204 status100005 1 udp 20048 mountd100005 1 tcp 20048 mountd100005 2 udp 20048 mountd100005 2 tcp 20048 mountd100005 3 udp 20048 mountd100005 3 tcp 20048 mountd100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl100003 3 udp 2049 nfs100003 4 udp 2049 nfs100227 3 udp 2049 nfs_acl100021 1 udp 55758 nlockmgr100021 3 udp 55758 nlockmgr100021 4 udp 55758 nlockmgr100021 1 tcp 30472 nlockmgr100021 3 tcp 30472 nlockmgr100021 4 tcp 30472 nlockmgr[root@nfs01 ~]# netstat -lntup|egrep "rpc|nfs"
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 9516/rpc.mountd
tcp 0 0 0.0.0.0:59204 0.0.0.0:* LISTEN 9463/rpc.statd
tcp6 0 0 :::20048 :::* LISTEN 9516/rpc.mountd
tcp6 0 0 :::14450 :::* LISTEN 9463/rpc.statd
udp 0 0 0.0.0.0:44521 0.0.0.0:* 9463/rpc.statd
udp 0 0 0.0.0.0:20048 0.0.0.0:* 9516/rpc.mountd
udp 0 0 0.0.0.0:695 0.0.0.0:* 9424/rpcbind
udp 0 0 127.0.0.1:735 0.0.0.0:* 9463/rpc.statd
udp6 0 0 :::20048 :::* 9516/rpc.mountd
udp6 0 0 :::695 :::* 9424/rpcbind
udp6 0 0 :::4835 :::* 9463/rpc.statd [root@nfs01 ~]# ps -ef|egrep "rpc|nfs"
rpc 50335 1 0 16:54 ? 00:00:00 /sbin/rpcbind -w
rpcuser 51012 1 0 16:56 ? 00:00:00 /usr/sbin/rpc.statd #<==检查文件一致性
root 51019 2 0 16:56 ? 00:00:00 [rpciod]
root 51027 1 0 16:56 ? 00:00:00 /usr/sbin/rpc.idmapd #<==名称映射进程
root 51037 1 0 16:56 ? 00:00:00 /usr/sbin/rpc.mountd #<==权限管理验证
root 51043 2 0 16:56 ? 00:00:00 [nfsd4_callbacks]
root 51049 2 0 16:56 ? 00:00:00 [nfsd] #<==NFS主进程,管理登入ID身份判别等
...省略若干...
root 51056 2 0 16:56 ? 00:00:00 [nfsd]
root 52178 1162 0 16:59 pts/0 00:00:00 grep -E --color=auto rpc|nfs
8. 配置nfs
NFS配置文件 /etc/exports
[root@nfs01 ~]# man exports
EXAMPLE
sample /etc/exports file/ master(rw) trusty(rw,no_root_squash)/projects proj*.local.domain(rw)/usr *.local.domain(ro) @trusted(rw)/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)/pub *(ro,insecure,all_squash)/srv/www -sync,rw server @trusted @external(ro)/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)/build buildhost[0-9].local.domain(rw)【待共享的目录】 允许访问的主机(权限) 允许访问的主机(权限)
- 待共享的目录 存东西的目录 取东西的目录例如:/data
- 访问的主机,
172.16.1.7(web01) 单个主机
172.16.1.0/24 网段
172.16.1.* 网段
master 主机名(DNS A解析 轮询) - ()权限
rw 可读写 read write
ro 只读 read only
sync 写到磁盘才算完成,安全、慢
async 异步写到远程缓冲区,快、不安全
实践:
[root@nfs01 ~]# tail -1 /etc/exports
/data 172.16.1.0/24(rw,sync)[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 root root 51 4月 16 10:24 /data
重启NFS
[root@nfs01 ~]# systemctl reload nfs #《==生产场景必须要实现平滑重启。
[root@nfs01 ~]# exportfs -r
上述二者等价,选一个即可。
NFS默认用户【nfsnobody】
[root@nfs01 ~]# grep nfsno /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin#如果没有就创建
[root@nfs01 ~]# groupadd -g 65534 nfsnobody
[root@nfs01 ~]# useradd nfsnobody -u 65534 -g nfsnobody -s /sbin/nologin -M
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
#授权
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 nfsnobody nfsnobody 51 4月 16 10:24 /data[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24 #《==看到共享的目录了
服务单本地测试挂载:
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@nfs01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 19G 1.8G 18G 10% /mnt
[root@nfs01 ~]# touch /mnt/oldboy.txt
[root@nfs01 ~]# ls /mnt/
oldboy.txt
换到web01挂载
1)安装
yum install nfs-utils rpcbind -y
rpm -qa nfs-utils rpcbind
##安装nfs-utils的目的是为了获得showmount命令。
2)启动
[root@web01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl enable rpcbind[root@web01 ~]# netstat -lntup|grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2467/rpcbind
tcp6 0 0 :::111 :::* LISTEN 2467/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 2467/rpcbind
udp6 0 0 :::111 :::* 2467/rpcbind
3)查看NFS服务器提供的共享目录
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered程序 没有 注册
说明:RPC服务开启了,但是NFS没有告诉RPC开启的服务端口。
解决:重启NFS。
4)挂载测试
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 19G 1.8G 18G 10% /mnt
[root@web01 ~]# touch /mnt/oldgirl.txt
[root@web01 ~]# ls /mnt/
oldboy.txt oldgirl.txt
练习:
backup作为客户端挂载NFS。
5)NFS报错总结
第一个报错及分析解决:
[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
解答:No route to host错误是往往是防火墙。
第二个报错及分析解决:
[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered
解答:NFS启动时候rpcbind服务没有开启
6)NFS客户端开机自启动挂载
方法1:/etc/rc.local
把挂载的命令放入/etc/rc.local中,以实现开机自动挂载。命令如下:
[root@web01 mnt]# ls -l /etc/rc.d/rc.local
-rw-r--r--. 1 root root 473 2月 3 00:34 /etc/rc.d/rc.local
[root@web01 mnt]# chmod +x /etc/rc.d/rc.local
[root@web01 mnt]# ls -l /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 2月 3 00:34 /etc/rc.d/rc.local
[root@web01 mnt]# echo "#mount by oldboy" >>/etc/rc.local
[root@web01 mnt]# echo "/bin/mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
[root@web01 mnt]# tail -2 /etc/rc.local
#mount by oldboy
/bin/mount -t nfs 172.16.1.31:/data /mnt
方法2:放入/etc/fstab(坑)
为什么fstab无法实现nfs挂载?
回顾:开机启动流程:
1、加载/etc/fstab
2、加载防火墙在前。
3、加载网卡
NFS网络文件系统,通过网络挂载,网络没起如何挂载?
又想在fstab里实现挂载、就用一个服务,延迟启动。
延迟满足:小孩给棉花糖的故事,学会延迟满足是成就自己的优秀思维。
C6:netfs服务
C7:remote-fs.target
开启remote-fs.target开机自启动:
[root@nfs01 /data1]# systemctl enable remote-fs.target
[root@nfs01 /data1]# systemctl status remote-fs.target
9. 项目实践作业:
web01 web02客户端实现挂载到nfs
NFS下面共享/data ,允许web01、web02客户端(挂载点/data)挂载后可读写.
当从web01上传图片,web02服务上可以删除,web02上传图片,web01服务上可以删除。
NFS下面共享/data1,允许 web01、web02客户端10.0.0.0/24网段只读(data1)
分别实现开机自动挂载
10. ()权限 对应参数
rw 可读写 read writero 只读 read onlysync 写到磁盘才算完成,安全 慢async 异步写到远程缓冲区,快 不安全all_squash※ 不管客户端什么用户,到服务端都是nfsnobodyanonuid=匿名用户的UIDanongid=匿名用户的GID
11. 在生产中配置NFS的重要技巧:
- 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限
a. all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。
b.就是anonuid,anongid指定的UID和GID的用户。 - 所有的客户端和服务端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)
[root@nfs01 mnt]# cat /etc/exports
#ddddddd
/data 172.16.1.0/24(rw,sync)
[root@nfs01 mnt]# cat /var/lib/nfs/etab
/data 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)anonuid=65534,anongid=65534[root@nfs01 ~]# cat /etc/exports
#oldboy shared dir at time
#/data 172.16.1.0/24(rw,sync) 10.0.0.0/24(ro)
/data 172.16.1.0/24(rw,sync)
/data1 10.0.0.0/24(ro)
更改默认NFS默认用户
12. 项目实践2:
NFS共享的匿名用户用www,使得客户端上传的图片都是www用户,而不是匿名的nfsnobody。
web01,web02客户端实现挂载到nfs
NFS下面共享/data ,允许web01,web02客户端对/data可读写
web01上传图片,web02上可以删除web01上传的图片。
NFS下面共享/data1,允许 web01,web02客户端10.0.0.0/24 网段只读(data1)
实现开机自动挂载
1)所有主机(web01,web02,nfs01)上创建www用户,指定uid 1111:
#批量操作(xshell)
useradd -u 1111 www -s /sbin/nologin -M
id www
2)服务端NFS 01特殊配置
[root@nfs01 ~]# tail -2 /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=1111,anongid=1111)
/data1 10.0.0.0/24(ro)
3)创建共享目录并授权
[root@nfs01 ~]# mkdir -p /data /data1
[root@nfs01 ~]# chown -R www.www /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 www www 173 7月 1 11:51 /data
4)服务端NFS重新加载
[root@nfs01 ~]# systemctl reload nfs #平滑重启
4)每个客户端(web01,web02)
#NFS客户端软件安装
yum install rpcbind nfs-utils -y#启动
systemctl start rpcbind
systemctl enable rpcbind#检查挂载
showmount -e 172.16.1.31[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1 10.0.0.0/24
/data 172.16.1.0/24#创建挂载点目录,并挂载
[root@web01 ~]# mkdir /data
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /data
[root@web01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
172.16.1.31:/data 17G 2.3G 15G 14% /data[root@web01 ~]# touch /data/oldboy.txt
[root@web01 ~]# ls -l /data
总用量 0
-rw-r--r-- 1 www www 0 7月 1 16:45 oldboy.txt
到此为止,web01配置好了。#######web02的配置
useradd -u 1111 www -s /sbin/nologin -M
id wwwyum install rpcbind nfs-utils -y
#启动
systemctl start rpcbind
systemctl status rpcbindsystemctl enable rpcbind
systemctl list-unit-files|grep rpcbindroot@web02 ~]# mkdir /data
[root@web02 ~]# mount -t nfs 172.16.1.31:/data /data
[root@web02 ~]# df -h|grep data
172.16.1.31:/data 17G 2.3G 15G 14% /data
[root@web02 ~]# touch /data/oldboy_web02.txt
[root@web02 ~]# ls /data/ -l
总用量 0
-rw-r--r-- 1 www www 0 7月 1 16:45 oldboy.txt
-rw-r--r-- 1 www www 0 7月 1 16:46 oldboy_web02.txt
[root@web02 ~]# rm -f /data/oldboy.txt
[root@web02 ~]# ls /data/ -l
总用量 0
-rw-r--r-- 1 www www 0 7月 1 16:46 oldboy_web02.txt
[root@web01 ~]# rm -f /data/oldboy_web02.txt [root@nfs01 ~]# ls /data/ -l
总用量 0
-rw-r--r-- 1 www www 0 7月 1 16:48 oldboy_web01.txt
-rw-r--r-- 1 www www 0 7月 1 16:48 oldboy_web02.txt# NFS下面共享/data1,允许 web01,web02客户端10.0.0.0/24 网段只读(data1)
[root@web01 ~]# mkdir /data1
[root@web01 ~]# mount -t nfs 10.0.0.31:/data1 /data1
[root@web01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda3 43G 2.5G 41G 6% /
/dev/sda1 1014M 161M 854M 16% /boot
172.16.1.31:/data 43G 2.5G 41G 6% /mnt
tmpfs 394M 0 394M 0% /run/user/0
10.0.0.31:/data1 43G 2.5G 41G 6% /data1
#客户端无法创建
[root@web01 ~]# touch /data1/oldboy_web01.txt
touch: 无法创建"/data1/oldboy_web01.txt": 只读文件系统
#服务端创建
[root@nfs01 data1]# touch /data1/oldboy_web01.txt
[root@nfs01 data1]# ll
总用量 0
-rw-r--r-- 1 root root 0 2024-02-20 10:50 oldboy_web01.txt
# 客户端无法删除
[root@web01 ~]# ll -l /data1/
总用量 0
-rw-r--r-- 1 root root 0 2024-02-20 10:50 oldboy_web01.txt
[root@web01 ~]# rm -rf /data1/oldboy_web01.txt
rm: 无法删除"/data1/oldboy_web01.txt": 只读文件系统
只读ro地方了解。
NFS共享权限有两部分控制:
1.配置文件里的rw,ro来控制
2.本地目录和文件权限。
当多个NFS客户端访问服务器端读写文件时,需要具有以下几个权限:
1.NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限。
/data 172.16.1.0/24(rw,sync)
2.NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限。
[root@nfs01 /]# ls -ld /data
drwxr-xr-x 2 www www 54 7月 1 16:48 /data
3.web01,web02将来不是人为用root去放文件。
nginx服务进程用户改成www,访问/data ===>172.16.1.31:/data
exportfs功能:
这个命令可以设置和vim /etc/exports一样的设置。
[root@nfs01 /]# exportfs -o rw,async 172.16.1.0/24:/opt #==(/opt 172.16.1.0/24(rw,sync))
[root@nfs01 /]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/opt 172.16.1.0/24
重新加载NFS
exportfs -rv == systemctl reload nfs
NFS服务端宕机前后实践
查看挂载
cat /proc/mounts
有的时候,NFS服务端宕机状态,NFS客户端容易夯住(敲命令没反应)。
df -h 没用。
NFS强耦合的软件。服务端出去问题,NFS客户端容易夯住。
autofs(访问的时候帮你自动挂载,当你停止访问60秒,自动给你卸载)
服务端重启后
umount /data /data1 -l
mount -a
/etc/rc.local里面的命令。