Linux之NFS

  • A+
所属分类:linux技术
摘要

共享存储,文件服务器NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph


一、什么是NFS

共享存储,文件服务器

1.1 基本概述

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph

2.2 为什么使用NFS

  • 实现多台服务器之间数据共享
  • 实现多台服务器之间数据一致

二、NFS应用

2.1 没有NFS时

  1. A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上;
  2. B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片;

Linux之NFS

2.2 如果有NFS

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

Linux之NFS

2.3 NFS原理

Linux之NFS

  1. 用户访问NFS客户端,将请求转化为函数;
  2. NFS通过TCP/IP连接服务端;
  3. NFS服务端接收请求,会先调用portmap进程进行端口映射;
  4. Rpc.nfsd进程用于判断NFS客户端能否连接服务端;
  5. Rpc.mount进程用于判断客户端对服务端的操作权限;
  6. 如果通过权限验证,可以对服务端进行操作,修改或读取;

rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;

rpc.mount:主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务器所提供的文件前,还必须通过文件使用权限的验证,它会读取NFS的配置文件:/etc/exports来对比客户端权限。

portmap:主要功能是进行端口映射工作。

三、NFS实践

3.1 环境准备

主机 IP 角色
web01 172.16.1.7 NFS客户端
NFS 172.16.1.31 NFS服务端

3.2 服务端(172.16.1.31)

  1. 关闭防火墙和selinux

    [root@nfs ~]# setenforce 0 [root@nfs ~]# systemctl disable --now firewalld 
  2. 安装NFS和rpcbind

    [root@nfs ~]# yum install nfs-utils rpcbind -y 

    注意:

    Centos6 需要安装rpcbind
    Centos7 默认已经安装好了rpcbind,并且默认是开机自启

  3. 创建共享目录

    [root@nfs ~]# mkdir /data 
  4. 配置NFS

    #NFS默认的配置文件是:/etc/exports   #配置NFS [root@nfs ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash) 
    语法 /data 172.16.1.0/24 (rw,sync,all_squash)
    含义 NFS服务端共享的目录 NFS允许连接的客户端IP网段 允许操作的权限
  5. 启动服务(Centos7中启动)

    [root@nfs ~]# systemctl start nfs-server rpcbind 
  6. 验证NFS配置

    showmount -e [服务端的地址,默认是本机地址] eg: [root@nfs ~]# showmount -e Export list for nfs: /web/nfsv1 172.16.1.0/20  cat /var/lib/nfs/etab eg: [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) 
  7. 给挂载点授权

    [root@nfs ~]# chown -R nfsnobody.nfsnobody /data 

3.3 客户端(172.16.1.7)

  1. 关闭防火墙和selinux

    [root@nfs ~]# setenforce 0 [root@nfs ~]# systemctl disable --now firewalld 
  2. 安装NFS服务

    [root@web01 ~]# yum install -y rpcbind nfs-utils 
  3. 查看挂载点

    [root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 
  4. 创建挂载目录

    [root@web01 opt]# mkdir /backup 
  5. 挂载NFS

    [root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup/   #验证挂载 [root@web01 ~]# df -h Filesystem         Size  Used Avail Use% Mounted on /dev/sda3           18G  1.6G   17G   9% / devtmpfs           476M     0  476M   0% /dev tmpfs              487M     0  487M   0% /dev/shm tmpfs              487M   14M  473M   3% /run tmpfs              487M     0  487M   0% /sys/fs/cgroup /dev/sda1         1014M  127M  888M  13% /boot tmpfs               98M     0   98M   0% /run/user/0 172.16.1.31:/data   18G  1.6G   17G   9% /backup 
  6. 测试NFS文件同步功能

    #创建测试 [root@web01 backup]# touch 123.txt [root@web01 backup]# ll total 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 Nov 20 09:26 123.txt   #服务端查看 [root@nfs ~]# ll /data/ total 0 -rw-r--r-- 1 nfsnobody nfsnobody 0 Nov 20 09:26 123.txt 

四、NFS挂载与卸载

NFS客户端的配置步骤也十分简单。先使用showmount命令,查询NFS服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址(权限)”。

NFS挂载:客户端的目录仅仅是服务端共享目录的一个入口,可以简单理解为软连接,真正的数据全都是存储在服务端的目录,客户端写入的数据也是在服务端存储的

4.1 注意事项

  • 挂载目录后,原来文件下的内容不会丢失,仅仅是被遮盖住,取消挂载后仍然存在;
  • 取消挂载时不要在挂载的目录下面操作,否则会提示忙碌,切换到其他目录再进行卸载;
  • 挂载时如果在挂载的目录下,还是可以看到挂载前目录下的文件,需要重新进入目录才会显示挂载后目录的内容;

4.2 挂载

  1. 客户端安装

    • rpcbind:为了连接服务端的进程
    • nfs-utils:为了使用showmount命令
  2. 客户端查看挂载点

    [root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 
  3. 挂载命令

    [root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup mount           #挂载命令 -t              #指定挂载的文件类型 nfs             #nfs文件类型 172.16.1.31      #服务端的IP地址 :/data          #服务端提供的可挂载目录 /backup         #本地要挂载到服务端的目录   #挂载后查看挂载 [root@web01 ~]# df -h | grep /backup 172.16.1.31:/data   18G  1.6G   17G   9% /backup 

4.3 卸载

#卸载的两种方式 [root@web01 ~]# umount /backup  [root@web01 ~]# umount 172.16.1.31:/data   #强制取消挂载 [root@web01 ~]# umount -lf /backup 

4.4 开机挂载(客户端)

#编辑fstab文件 [root@web01 ~]# vim /etc/fstab 172.16.1.31:/data /backup nfs defaults 0 0   #验证fstab是否写正确 [root@web01 ~]# mount -a 

五、NFS配置详解

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的用户GID,必须存在系统 (常用)

六、NFS案例

  1. 环境准备

    主机 IP 身份
    web01 172.16.1.7 NFS客户端
    web02 172.16.1.8 NFS客户端
    NFS 172.16.1.31 NFS服务端
  2. web端安装http和php

    [root@web01 ~]# yum install httpd php php-devel -y [root@web02 ~]# yum install httpd php php-devel -y 
  3. 上传代码(web02照做)

    [root@web01 ~]# rz [root@web01 ~]# ll -rw-r--r--  1 root root    26995 Aug 23 10:35 kaoshi.zip 
  4. 解压代码(web02照做)

    #找到httpd服务的站点目录 [root@web01 ~]# rpm -ql httpd | grep html /var/www/html  #解压代码至站点目录(根目录) [root@web01 ~]# unzip kaoshi.zip -d /var/www/html/ 
  5. 授权(web02照做)

    [root@web01 ~]# chown -R www.www /var/www/html 
  6. 关闭selinux和防火墙(web02照做)

    [root@web01 ~]# setenforce 0 [root@web01 ~]# systemctl disable --now firewalld 
  7. 修改web软件的用户(web02照做)

    将文件内User和Group指定为www: [root@web01 html]# vim /etc/httpd/conf/httpd.conf User www Group www 
  8. 启动web软件(web02照做)

    [root@web01 html]# systemctl start httpd 
  9. 访问页面测试

    • 访问

      浏览器输入以下网址: http://172.16.1.7/ http://172.16.1.8/ 
    • 测试上传图片

      Linux之NFS

      验证:

      上传成功后访问:http://172.16.1.7/upload/1_linux.jpg

    • 测试共享(没有挂载)

      在172.16.1.7服务器上传 1_test_nfs.gif 在172.16.1.8服务器上传 2_nfs.jpg   #访问 http://172.16.1.7/upload/1_test_nfs.gif    访问成功 http://172.16.1.8/upload/1_test_nfs.gif    访问失败 http://172.16.1.8/upload/2_nfs.jpg        访问成功 http://172.16.1.7/upload/2_nfs.jpg        访问失败   #在没有挂载的情况下,文件无法实现共享,在哪台机器上传就只能在哪台机器访问 
  10. 挂载

    • 服务端

      1、修改NFS配置文件: [root@nfs nfs1]# vim /etc/exports /data  172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)  2、重新授权挂载点 [root@nfs ~]# chown -R www.www /data  3、重启NFS [root@nfs nfs1]# systemctl restart nfs-server rpcbind 
    • web端挂载目录

      1、找到需要挂载的目录 /var/www/html/upload   2、挂载 [root@web01 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload [root@web02 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload 

      注:服务端修改配置后,客户端需要重新挂载一次,需要先卸载之前的挂载点,再重新执行上述命令

    • 再次测试文件共享

      #浏览器上访问: http://172.16.1.7/upload/1_test_nfs.gif    访问成功 http://172.16.1.8/upload/1_test_nfs.gif    访问成功 http://172.16.1.8/upload/2_nfs.jpg        访问成功 http://172.16.1.7/upload/2_nfs.jpg        访问成功 

七、统一用户

7.1 服务器创建统一用户(前面已做)

[root@web01 ~]# groupadd www -g 666 [root@web01 ~]# useradd www -u 666 -g 666   [root@web02 ~]# groupadd www -g 666 [root@web02 ~]# useradd www -u 666 -g 666   [root@nfs ~]# groupadd www -g 666 [root@nfs ~]# useradd www -u 666 -g 666   [root@backup ~]# groupadd www -g 666 [root@backup ~]# useradd www -u 666 -g 666 

7.2 需要修改用户的服务

  • httpd
  • nfs
  • rsync

7.3 修改httpd的用户(前面已做)

#找到配置文件 [root@web01 ~]# rpm -qc httpd /etc/httpd/conf/httpd.conf   #修改配置文件 [root@web01 ~]# vim /etc/httpd/conf/httpd.conf User www Group www   #重启服务 [root@web01 ~]# systemctl restart httpd   #确认启动用户 [root@web01 ~]# ps -ef | grep httpd root       7768      1  1 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND www        7769   7768  0 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND www        7770   7768  0 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND www        7771   7768  0 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND www        7772   7768  0 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND www        7773   7768  0 11:49 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND 

7.4 修改nfs服务的用户(前面已做)

[root@nfs ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)   #授权/data目录 [root@nfs ~]# chown -R www.www /data/   #重启服务 [root@nfs ~]# systemctl restart nfs   #验证启动用户 [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,rw,secure,root_squash,all_squash) 

7.5 修改rsync用户

#修改配置 [root@backup ~]# vim /etc/rsyncd.conf uid = www gid = www   #重启服务 [root@backup ~]# systemctl restart rsyncd   #目录重新授权 [root@backup ~]# chown -R www.www /backup/ 

7.6 测试架构

  • 两台web服务器(或更多)
  • 一台nfs服务器挂载web服务器的文件目录
  • 一台backup服务器实时同步nfs挂载目录下的内容

八、NFS小结

8.1 NFS存储优点

  • NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
  • NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见的

8.2 NFS存储局限

  • 存在单点故障, 如果构建高可用维护麻烦 web -> nfs -> backup
  • NFS数据明文, 并不对数据做任何校验
  • 客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)

8.3 .NFS应用建议

  • 生产场景应将静态数据尽可能往前端推, 减少后端存储压力
  • 必须将存储里的静态资源通过CDN缓存 jpgpngmp4avicssjs
  • 如果没有缓存或架构本身历史遗留问题太大, 再多存储也无用