NFS共享存储
NFS基本概述
NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS
为什么要使用共享存储?
1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致
NFS应用场景
集群没有共享存储
1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。
集群有共享存储
1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了
NFS实现原理
本地文件的操作方式
1.当用户执行mkdir命令, 该命令会调用shell解释器翻译给内核。
2.内核解析完成后会驱动对应的硬件设备,完成相应的操作。
NFS原理
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
注意: rpc是一个远程过程调用,那么使用nfs必须有rpc服务
NFS服务安装
环境准备
服务器系统 角色 外网IP 内网IP
CentOS 7.6 NFS服务端: 10.0.0.31 172.16.1.31
CentOS 7.6 NFS客户端: 10.0.0.7 172.16.1.7
注意: 不要忘记关闭防火墙, 以免默认的防火墙策略禁止正常的NFS共享服务
服务端配置:
1)安装服务
[root@nfs ~]# yum -y install nfs-utils
2)配置服务
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
3)根据服务配置创建必要的信息数据
[root@nfs ~]# mkdir /data
[root@nfs ~]# ll -d /data
drwxr-xr-x 2 root root 6 Jun 9 10:06 /data
4)启动并加入开机自动运行
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
5)通过nfs特有的配置文件查看配置是否正确
检查/var/lib/nfs/etab 如果有内容说明配置正确
如果为空则配置有问题
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
客户端配置: 10.0.0.7
1)客户端需要安装nfs-utils 不需要启动
[root@web01 ~]# yum -y install nfs-utils
2)通过shoumount命令查看服务端共享的目录
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
3)挂载31的/data目录到本地的/mnt临时挂载点
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 1.7G 19G 9% /
devtmpfs 514M 0 514M 0% /dev
tmpfs 525M 0 525M 0% /dev/shm
tmpfs 525M 8.2M 517M 2% /run
tmpfs 525M 0 525M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 105M 0 105M 0% /run/user/0
172.16.1.31:/data 20G 1.7G 19G 9% /mnt
4)使用 因为默认NFS客户连接NFS时所有的用户被压缩为NFS的匿名用户 nfsnobody uid65534
将共享的/data目录属主属组修改为nfsnobody
服务端: 10.0.0.31
[root@nfs ~]# chown nfsnobody.nfsnobody /data
[root@nfs ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 19 Jun 9 10:23 /data
5)客户端测试
[root@web01 ~]# touch /mnt/ahui.txt
6)卸载
[root@web01 ~]# umount /mnt
强制卸载
[root@web01 ~]# umount -f /mnt
测试网络断开挂在是否存在
关闭eth1网卡
[root@nfs ~]# ifdown eth1
7)查看内存中挂载的详细信息:
[root@web01 ~]# cat /proc/mounts
...
172.16.1.31:/data /data nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.7,local_lock=none,addr=172.16.1.31 0 0
...
开启eth1网卡
[root@nfs ~]# ifup eth1
NFS配置详解
执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:
nfs共享参数 | 参数作用 |
---|---|
rw* | 读写权限 |
ro | 只读权限 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用) |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用) |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用) |
no_all_squash | 无论NFS客户端使用什么账户访问,都不进行压缩 |
sync* | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 |
anonuid* | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
anongid* | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
验证ro、rw权限实践
1)10.0.0.200 挂载31的w目录 可读写权限
[root@b13k ~]# 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
挂载:
[root@b13k ~]# mount -t nfs 172.16.1.31:/data/w /mnt
[root@b13k ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 918M 0 918M 0% /dev
tmpfs 929M 0 929M 0% /dev/shm
tmpfs 929M 9.7M 919M 2% /run
tmpfs 929M 0 929M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 186M 0 186M 0% /run/user/0
172.16.1.31:/data/w 20G 1.7G 19G 9% /mnt
测试读写权限:
[root@b13k ~]# cd /mnt/
[root@b13k mnt]# ll
total 0
[root@b13k mnt]# touch 1.txt
[root@b13k mnt]# ll
total 0
-rw-r--r-- 1 666 666 0 Jun 9 2022 1.txt
[root@b13k mnt]# rm -rf 1.txt
[root@b13k mnt]# ll
total 0
2)10.0.0.7 挂载31的r目录 可读权限 不能写入
[root@web01 ~]# 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
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/r /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 1.7G 19G 9% /
devtmpfs 514M 0 514M 0% /dev
tmpfs 525M 0 525M 0% /dev/shm
tmpfs 525M 8.2M 517M 2% /run
tmpfs 525M 0 525M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 105M 0 105M 0% /run/user/0
172.16.1.31:/data/r 20G 1.7G 19G 9% /mnt
测试: 只读
[root@web01 mnt]# ll
total 4
-rw-r--r-- 1 root root 5 Jun 9 12:13 test.txt
[root@web01 mnt]# cat test.txt
hehe
[root@web01 mnt]# touch 1.txt
touch: cannot touch ‘1.txt’: Read-only file system
[root@web01 mnt]# rm -rf test.txt
rm: cannot remove ‘test.txt’: Read-only file system
验证all_squash、anonuid、anongid权限
1)NFS服务端配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
2)服务端需要创建对应的用户
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g 666 www
[root@nfs ~]# id www
uid=666(www) gid=666(www) groups=666(www)
3)重载nfs-server
[root@nfs ~]# systemctl restart nfs-server
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,secure,root_squash,all_squash)
4)授权共享目录为www
[root@nfs ~]# chown -R www.www /data/
[root@nfs ~]# ll -d /data/
drwxr-xr-x 3 www www 53 Sep 3 02:08 /data/
5)客户端验证
[root@backup ~]# umount /mnt/
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
6)客户端查看到的文件,身份是666
[root@backup ~]# ll /mnt/
drwxr-xr-x 2 666 666 6 Sep 3 02:08 rsync_dir
-rw-r--r-- 1 666 666 0 Sep 3 02:08 rsync_file
7)客户端依旧能往/mnt目录下写文件
[root@backup mnt]# touch fff
[root@backup mnt]# mkdir 111
[root@backup mnt]# ll
drwxr-xr-x 2 666 666 6 Sep 3 03:05 111
-rw-r--r-- 1 666 666 0 Sep 3 03:05 fff
8)建议:将客户端也创建一个uid为666,gid为666,统一身份,避免后续出现权限不足的情况
[root@backup mnt]# groupadd -g 666 www
[root@backup mnt]# useradd -g 666 -u 666 www
[root@backup mnt]# id www
uid=666(www) gid=666(www) groups=666(www)
9)最后检查文件的身份
[root@backup mnt]# ll /mnt/
total 4
drwxr-xr-x 2 www www 6 Sep 3 03:05 111
-rw-r--r-- 1 www www 0 Sep 3 03:05 fff
NFS理论小结
1.NFS存储优点
1)NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
2)NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
2.NFS存储局限
1)存在单点故障, 如果构建高可用维护麻烦web->nfs()->backup
2)NFS数据明文, 并不对数据做任何校验。
3)客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)
3.NFS应用建议
1)生产场景应将静态数据尽可能往前端推, 减少后端存储压力
2)必须将存储里的静态资源通过CDN缓存jpg\png\mp4\avi\css\js
3)如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
NFS配置小结
1. 服务端和客户端都需要安装nfs-utils
服务端需要启动 客户端不需要启动 要使用rpcbind协议和服务端进行通信
包括客户单使用showmount 命令查看服务端共享的目录
2. 服务端配置
配置文件: /etc/exports
共享的目录 允许客户端哪个网段连接我(连接后的权限)
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/test 172.16.1.0/24(ro,sync,all_squash,anonuid=777,anongid=777)
all_squash 将所有的来源用户压缩成匿名用户(虚拟用户)
anonuid: 指定匿名为uid是666的用户
anongid: 指定匿名为gid是666的用户
根据配置文件创建必要的信息:
mkdir /data
创建虚拟用户 uid和 gid都为666
groupadd -g666 www
useradd -u666 -g666 -s /sbin/nologin -M www
授权/data权限为虚拟用户www
chown www.www /data
3. 客户端挂载 提前安装nfs-utils 不需要启动!!!
查看服务端共享了哪些目录:
showmount -e 172.16.1.31
4. 开机自动挂载:
/etc/fstab # 不使用这个配置文件 在加载网络配置前 系统就已经读取了/etc/fstab文件
/etc/rc.local # 使用这个配置文件
NFS案例实践
准备3台虚拟机服务器,并且请按照要求搭建配置NFS服务。
NFS服务端(A)10.0.0.31
NFS客户端(B)10.0.0.200
NFS客户端(C)10.0.0.7
1.在NFS服务端(A)上共享/data/w(可写)及/data/r(只读)
2.在NFS客户端(B/C)上进行挂载
10.0.0.200 挂载31的w目录 可读写权限
10.0.0.7 挂载31的r目录 可读权限 不能写入
客户端和服务端安装nfs-utils
yum -y install nfs-utils
服务端
第一步:服务端配置:
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/r 172.16.1.0/24(ro,sync,all_squash,anonuid=666,anongid=666)
第二步: 根据配置文件创建必要的信息:
1)创建共享目录
[root@nfs ~]# mkdir -p /data/w
[root@nfs ~]# mkdir /data/r
2)创建gid为666的www用户组
[root@nfs ~]# groupadd -g666 www
创建用户 uid 666 gid 666 不允许登陆 不创建家目录
[root@nfs ~]# useradd -u666 -g666 -s /sbin/nologin -M www
3)修改目录属主属组
[root@nfs ~]# chown -R www.www /data/
第三步: 启动服务加入开机自动运行
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
检测配置文件正确性: 有内容没问题 空则配置文件错误 如果格式不正确 则默认的参数不正确
[root@nfs ~]# cat /var/lib/nfs/etab
/data/r 172.16.1.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,ro,secure,root_squash,all_squash)
/data/w 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
客户端:
10.0.0.200 挂载31的w目录 可读写权限
[root@b13k ~]# 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
挂载:
[root@b13k ~]# mount -t nfs 172.16.1.31:/data/w /mnt
[root@b13k ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 918M 0 918M 0% /dev
tmpfs 929M 0 929M 0% /dev/shm
tmpfs 929M 9.7M 919M 2% /run
tmpfs 929M 0 929M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 186M 0 186M 0% /run/user/0
172.16.1.31:/data/w 20G 1.7G 19G 9% /mnt
测试读写权限:
[root@b13k ~]# cd /mnt/
[root@b13k mnt]# ll
total 0
[root@b13k mnt]# touch 1.txt
[root@b13k mnt]# ll
total 0
-rw-r--r-- 1 666 666 0 Jun 9 2022 1.txt
[root@b13k mnt]# rm -rf 1.txt
[root@b13k mnt]# ll
total 0
10.0.0.7 挂载31的r目录 可读权限 不能写入
[root@web01 ~]# 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
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/r /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 20G 1.7G 19G 9% /
devtmpfs 514M 0 514M 0% /dev
tmpfs 525M 0 525M 0% /dev/shm
tmpfs 525M 8.2M 517M 2% /run
tmpfs 525M 0 525M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 105M 0 105M 0% /run/user/0
172.16.1.31:/data/r 20G 1.7G 19G 9% /mnt
测试: 只读
[root@web01 mnt]# ll
total 4
-rw-r--r-- 1 root root 5 Jun 9 12:13 test.txt
[root@web01 mnt]# cat test.txt
hehe
[root@web01 mnt]# touch 1.txt
touch: cannot touch ‘1.txt’: Read-only file system
[root@web01 mnt]# rm -rf test.txt
rm: cannot remove ‘test.txt’: Read-only file system