Linux-NFS服务

1、NFS基本概述

1.1、什么是NFS

NFS是Network File System的缩写及网络文件系统。[通常我们称NFS为共享存储]

1.2、NFS能干什么?

NFS的主要功能是通过局域网络让不同主机系统之间可以共享目录。

1.3、为什么要使用NFS?

1.3.1、没有使用共享存储-NFS

在网站集群架构中如果没有共享存储的情况如下:
1)A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2)B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。

1.3.2、使用共享存储-NFS

1)A用户上传图片无论被负载均衡调度至WEB1还是WEB2,最终数据都被写入至共享存储
2)B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

1.4、使用NFS共享存储能解决集群架构的什么问题?

解决多台web静态资源的共享(所有客户端都挂载服务端,看到的数据都一样)
解决多台web静态资源一致性(如果客户端A删除NFS服务上的test文件,客户端B上也会看不见test文件)
解决多台web磁盘空间的浪费

1.5、企业使用NFS注意事项

1、由于用户请求静态资源每次都需要web连接NFS服务获取,那么势必会带来- -定的网络开销、以及网络延时、所以增加NFS服务并不能给网站带来访问速度的提升。
2、如果希望对上传的图片、附件等静资源进行加速,建议将静态资源统-存放至NFS服务端。这样便于后期统-推送至CDN,以此来实现资源的加速

1.6、NFS实现原理

1.6.1、NFS原理图

1.6.2、原理说明

本地文件操作方式
1、当用户执行mkdir命令,BashShell无法完成该命令操作,会将其翻译给内核。
2、Kernel内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。
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服务

2、NFS服务端

2.1、环境准备

2.1.1、演示机器的准备

NFS服务端 CentOS 7.9.2009  192.168.10.24
NFS客户端 CentOS 7.9.2009  192.168.10.25

2.1.2、关闭防火墙和SELinux

# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld

# 关闭SELinux
sed -ri 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 

2.2、安装

yum install nfs-utils -y

2.3、配置

# 配置共享目录
[root@nfs-server ~]# vi /etc/exports
/data 192.168.10.0/24(rw,sync,all_squash)

# 创建目录并且授权所有者
chown -R nfsnobody.nfsnobody /data

2.4、启动NFS服务

systemctl enable rpcbind nfs-server
systemctl start rpcbind nfs-server

3、NFS客户端

3.1、安装

yum install nfs-utils -y

3.2、查询服务端可挂载的目录

[root@nginx02 ~]# showmount -e 192.168.10.24
Export list for 192.168.10.24:
/data 192.168.10.0/24

3.3、挂载

3.3.1、手动挂载

mkdir /nfsdir
mount -t nfs 192.168.10.24:/data /nfsdir
df -h | grep nfsdir

3.3.2、测试文件增删查

echo "nfs-client" > /nfsdir/test.txt
cat /nfsdir/test.txt
rm -f /nfsdir/test.txt 

3.3.3、指定特殊权限的挂载

# 禁止使用suid,exec
mount -t nfs -o nosuid,noexec,nodev 192.168.10.24:/data /nfsdir

# 禁止更新目录及文件时间戳挂载
mount -t nfs -o noatime,nodiratime 192.168.10.24:/data /nfsdir

3.4、卸载

3.4.1、正常卸载

umount /nfsdir

3.4.2、强制卸载

umount -lf /nfsdir

3.5、配置开机自动挂载

[root@nginx02 ~]# vi /etc/fstab 
192.168.10.24:/data /nfsdir nfs defaults 0 0

4、NFS配置详解

4.1、参数介绍

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,必须存在系统

4.2、验证ro权限

4.2.1、修改服务端的配置

# 配置如下
cat /etc/exports
/data 192.168.10.0/24(ro,sync,all_squash)

# 重启服务
systemctl restart nfs-server

4.2.2、挂载验证

[root@nginx02 /]# mount -t nfs 192.168.10.24:/data /nfsdir

[root@nginx02 /]# touch /nfsdir/test.txt 
touch: cannot touch ‘/nfsdir/test.txt’: Read-only file system

4.3、验证all_squash、anonuid、anongid权限

4.3.1、修改服务端的配置

# cat /etc/exports
/data 192.168.10.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

4.3.2、服务端和客户端都创建用户和组

groupadd -g 666 www
useradd -u 666 -g 666 www
id www

4.3.3、服务端给目录授权所有者

chown www.www -R /data
systemctl restart nfs-server

4.3.4、挂载验证

mount -t nfs 192.168.10.24:/data /nfsdir
echo "ok" > /nfsdir/ok.txt

# ll /nfsdir/ok.txt 
-rw-r--r-- 1 www www 3 Mar  9 22:58 /nfsdir/ok.txt

5、NFS存储总结

NFS存储优点
1、NFS简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
2、NFS的数据都在文件系统之上,所有数据都是能看得见。
NFS存储局限 1、存在单点故障,如果构建高可用维护麻烦web->nfs( )->backup
2、NFS数据都是明文,并不对数据做任何校验,也没有密码验证(强烈建议内网使用)。
NFS 应用建议 1、生产场景应将静态数据(jpg/png/mp4/avi等)尽可能放置CDN场景进行环境,以此来减少后端存储压力 2、如果没有缓存或架构、代码等,本身历史遗留问题太大,在多存储也没意义。

 

posted @ 2023-03-09 23:00  小粉优化大师  阅读(104)  评论(0编辑  收藏  举报