NFS共享存储
1.NFS基本概述
什么是NFS
# NFS是Network File System的缩写及网络文件系统,NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS一般用于文件服务器
企业中文件服务器(共享存储)
NFS
GFS(glusterfs):高可用的
FastDFS
HDFS:大数据会使用
Ceph
为什么要使用共享存储
# 1.实现多台服务器之间数据共享
# 2.实现多台服务器之间数据一致
2.NFS应用场景
集群没有共享存储
1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。
集群有共享存储
1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了
3.NFS工作原理
本地文件工作原理
1.当用户执行mkdir命令,该命令会调用shell解释器翻译给内核
2.内核解析完成后会驱动对应的硬件设备,完成相应的操作
NFS工作原理
1.用户进程访问NFS客户端,使用不同的函数对数据化进行处理(如:照片写入)
2.NFS客户端通过TCP/IP的方式传递给NFS服务器通过RPCbind服务器
3.NFS服务端接受到请求后,会先调用Portmap进程进行端口映射
4.Rpc.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务器
5.Rpc.mount进程判断客户端是否有对应的权限进行验证
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件
上传图片后,在本地保存不保存?
不保存,但是本地的指定目录中可以看到,它已经在远端的data目录里了
4.NFS实战
环境准备
主机名 |
角色 |
外网IP |
内网IP |
nfs |
NFS的服务端 |
10.0.0.31 |
172.16.1.3 |
web01 |
NFS的客户端 |
10.0.0.7 |
10.0.0.8 |
web02 |
NFS的客户端 |
10.0.0.8 |
172.16.1.8 |
NFS服务部署(服务端操作)
[root@nfs ~]# yum install -y nfs-utils
修改配置文件书写方式
配置语法: |
/data |
172.16.1.0/24 |
(rw,sync,all_squash) |
语法含义: |
NFS共享目录 |
NFS客户端地址 |
(参数1,参数2........) |
各参数含义
NFS共享参数 |
参数作用 |
rw |
读写权限 |
ro |
只读权限 |
all_squash |
无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 |
sync |
同时将数据写入到内存与硬盘中,保证不丢失数据 |
# 修改配置文件[root@nfs ~]# vim /etc/exports/nfs_data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# mkdir /nfs_data
[root@nfs ~]# chown www.www /nfs_data
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
[root@nfs ~]# ps -ef|grep [n]fsroot 6816 2 0 Jul07 ? 00:00:00 [nfsd4_callbacks]root 6824 2 0 Jul07 ? 00:00:00 [nfsd]root 6826 2 0 Jul07 ? 00:00:00 [nfsd]root 6827 2 0 Jul07 ? 00:00:00 [nfsd]root 6830 2 0 Jul07 ? 00:00:00 [nfsd]root 6831 2 0 Jul07 ? 00:00:00 [nfsd]root 6832 2 0 Jul07 ? 00:00:00 [nfsd]root 6833 2 0 Jul07 ? 00:00:00 [nfsd]root 6834 2 0 Jul07 ? 00:00:00 [nfsd]
[root@nfs ~]# netstat -lntup|grep 111tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 6326/rpcbind tcp6 0 0 :::111 :::* LISTEN 6326/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 6326/rpcbind udp6 0 0 :::111 :::* 6326/rpcbind
客户端操作
[root@web01 ~]# yum install -y nfs-utils
[root@web01 ~]# showmount -e 172.16.1.31Export list for 172.16.1.31:/nfs_data 172.16.1.0/24
[root@web01 ~]# mkdir /user_pic
[root@web01 ~]# mount -t nfs 172.16.1.31:/nfs_data /user_pic
5.企业实战
NFS客户端部署web站点
## 安装网站服务[root@web01 ~]# yum install -y httpd php[root@web02 ~]# yum install -y httpd php## 查找http服务的站点目录[root@web01 ~]# rpm -ql httpd/var/www/html## 关闭selinux[root@web01 html]# setenforce 0 sed -i 's#SELINUX=enforcing#SELINUX=disabled#p' /etc/selinux/config [root@web01 html]# vim /etc/selinux/configSELINUX=disabled## 关闭Firewalld防火墙[root@nfs ~]# systemctl disable firewalld[root@nfs ~]# systemctl stop firewalld## 部署代码上传代码rz## 解压代码[root@web01 html]# unzip kaoshi.zip## 修改了php代码,改了里面上传目录[root@web02 html]# vim upload_file.php$wen="/var/www/html/pic";## 修改目录的权限[root@web02 html]# chown apache.apache /var/www/html/## 启动服务[root@web01 html]# systemctl start httpd## 将用户上传文件的路径做成共享存储[root@web02 html]# mount -t nfs 172.16.1.31:/data /var/www/html/pic## 查看挂载[root@web01 html]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 19G 1.4G 18G 8% /devtmpfs 476M 0 476M 0% /devtmpfs 487M 0 487M 0% /dev/shmtmpfs 487M 7.7M 479M 2% /runtmpfs 487M 0 487M 0% /sys/fs/cgroup/dev/sda1 497M 120M 378M 25% /boottmpfs 98M 0 98M 0% /run/user/0172.16.1.31:/data 19G 1.4G 18G 8% /var/www/html/pic
如何将nfs的客户端做成开机自动挂载
## 编辑开机挂载的配置文件(不建议)[root@web01 ~]# vim /etc/fstab172.16.1.31:/data /var/www/html/pic nfs defaults 0 0 注意:如果NFS服务端出现问题,客户端一直挂载不上,可能会导致系统起不来
nfs卸载
[root@web01 ~]# umount /var/www/html/pic
增加挂载的安全性
在企业工作场景,通常情况NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行 suid、exec 等 权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。例如: 很多木马 篡改站点文件都是由上传入口上传的程序到存储目录。然后执行的。
#通过mount -o指定挂载参数,禁止使用suid,exec,增加安全性能[root@nfs-client ~]# mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data /mnt
验证nfs的ro权限
[root@nfs ~]# vim /etc/exports/data 172.16.1.0/24(rw,sync,all_squash)/pic 10.0.0.0/24(ro,sync,all_squash)# 挂载[root@web01 ~]# mount -t nfs 10.0.0.31:/pic /mnt# 查看是否挂载[root@web01 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 19G 1.4G 18G 8% /devtmpfs 476M 0 476M 0% /devtmpfs 487M 0 487M 0% /dev/shmtmpfs 487M 7.7M 479M 2% /runtmpfs 487M 0 487M 0% /sys/fs/cgroup/dev/sda1 497M 120M 378M 25% /boottmpfs 98M 0 98M 0% /run/user/010.0.0.31:/pic 19G 1.4G 18G 8% /mnt# 创建文件报错[root@web01 ~]# touch /mnt/filetouch: cannot touch ‘/mnt/file’: Read-only file system# 查看etab配置文件是否生效[root@nfs ~]# cat /var/lib/nfs/etab/pic 10.0.0.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,all_squash)/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)
企业中一定要统一用户权限
## 统一用户,一定要保证uid和gid一样[root@nfs ~]# groupadd www -g 666[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M[root@backup ~]# groupadd www -g 666[root@backup ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M[root@web01 ~]# groupadd www -g 666[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M[root@web02 mnt]# groupadd www -g 666[root@web02 mnt]# useradd www -u 666 -g 666 -s /sbin/nologin -M# 1.统一apache服务用户[root@web02 ~]# vim /etc/httpd/conf/httpd.conf## 修改前66 User apache67 Group apache## 修改后66 User www67 Group www# 2.统一nfs服务用户[root@nfs ~]# vim /etc/exports/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)# 3.rsync服务的用户[root@backup ~]# vim /etc/rsyncd.conf# 服务启动的用户uid = www# 服务启动的用户组gid = www
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)如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用