NFS共享存储



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用户传的图片。


NFS共享存储_客户端

集群有共享存储

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


NFS共享存储_共享存储_02

3.NFS工作原理

NFS共享存储_客户端_03

本地文件工作原理

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服务部署(服务端操作)

  • 1.安装NFS
[root@nfs ~]# yum install -y nfs-utils


  • 2.修改配置文件
修改配置文件书写方式

配置语法:

/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)


  • 3.创建共享目录
[root@nfs ~]# mkdir /nfs_data


  • 4.修改目录权限
[root@nfs ~]# chown www.www /nfs_data


  • 5.启动服务
[root@nfs ~]# systemctl start nfs-server


  • 6.将nfs服务加入开机自启
[root@nfs ~]# systemctl enable nfs-server


  • 7.检查进程
[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]


  • 8.检查rpcbind端口
[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


  • 2.查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31Export list for 172.16.1.31:/nfs_data 172.16.1.0/24


  • 3.创建一个上传数据的目录
[root@web01 ~]# mkdir /user_pic


  • 4.挂载远端目录
[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)如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用