Linux之NFS

一、什么是NFS

共享存储,文件服务器

1.1 基本概述

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

2.2 为什么使用NFS

  • 多台服务器间数据共享
    [En]

    data sharing among multiple servers*

  • 实现多台服务器间数据一致性
    [En]

    achieve data consistency among multiple servers*

二、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
  1. 安装NFS和rpcbind
[root@nfs ~]# yum install nfs-utils rpcbind -y

注意: Centos6 需要安装rpcbind
Centos7 默认已经安装好了rpcbind,并且默认是开机自启
3. 创建共享目录

[root@nfs ~]# mkdir /data
  1. 配置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
  1. 验证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)
  1. 给挂载点授权
[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
  1. 安装NFS服务
[root@web01 ~]# yum install -y rpcbind nfs-utils
  1. 查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
  1. 创建挂载目录
[root@web01 opt]# mkdir /backup
  1. 挂载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
  1. 测试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 注意事项

  • 挂载目录后,原文件下的内容不会丢失,只是被覆盖,卸载后仍然存在。
    [En]

    after mounting the directory, the contents under the original file will not be lost, but will only be covered, and will still exist after unmounting.*

  • 卸载时不要在挂载的目录下操作,否则会提示您忙,卸载前会切换到另一个目录。
    [En]

    do not operate under the mounted directory when unmounting, otherwise you will be prompted to be busy and change to another directory before uninstalling.*

  • 挂载时,如果您在挂载目录下,挂载前仍可以看到该目录下的文件。需要重新进入目录才能显示挂载目录的内容。
    [En]

    when mounting, if you are under the mounted directory, you can still see the files in the directory before mounting. You need to re-enter the directory to display the contents of the mounted directory.*

4.2 挂载

  1. 客户端安装
  2. rpcbind:为了连接服务端的进程
  3. nfs-utils:为了使用showmount命令
  4. 客户端查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31Export list for 172.16.1.31:/data 172.16.1.0/24
  1. 挂载命令
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backupmount           #挂载命令-t              #指定挂载的文件类型nfs             #nfs文件类型172.16.1.31      #服务端的IP地址:/data          #服务端提供的可挂载目录/backup         #本地要挂载到服务端的目录#挂载后查看挂载[root@web01 ~]# df -h | grep /backup172.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/fstab172.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
  1. 上传代码(web02照做)
[root@web01 ~]# rz
[root@web01 ~]# ll
-rw-r--r--  1 root root    26995 Aug 23 10:35 kaoshi.zip
  1. 解压代码(web02照做)
#找到httpd服务的站点目录
[root@web01 ~]# rpm -ql httpd | grep html
/var/www/html

#解压代码至站点目录(根目录)
[root@web01 ~]# unzip kaoshi.zip -d /var/www/html/
  1. 授权(web02照做)
[root@web01 ~]# chown -R www.www /var/www/html
  1. 关闭selinux和防火墙(web02照做)
[root@web01 ~]# setenforce 0
[root@web01 ~]# systemctl disable --now firewalld
  1. 修改web软件的用户(web02照做)
将文件内User和Group指定为www:
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
User www
Group www
  1. 启动web软件(web02照做)
[root@web01 html]# systemctl start httpd
  1. 访问页面测试
  2. 访问
浏览器输入以下网址:
http://172.16.1.7/
http://172.16.1.8/

Linux之NFS
– 测试共享(没有挂载)
在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        访问失败

#在没有挂载的情况下,文件无法实现共享,在哪台机器上传就只能在哪台机器访问
  1. 挂载
  2. 服务端
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应用建议

  • 生产场景应尽量将静态数据推送到前端,以减轻后端存储压力
    [En]

    production scenarios should push static data to the front as far as possible to reduce the back-end storage pressure*

  • 必须将存储里的静态资源通过CDN缓存 jpg\png\mp4\avi\css\js
  • 如果没有缓存或者架构本身有太多的历史问题,再多的存储也没用。
    [En]

    if there is no cache or the architecture itself has too many historical problems, no matter how much storage is useless.*

Original: https://www.cnblogs.com/JZjuechen/p/15750805.html
Author: JZEason
Title: Linux之NFS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524222/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • git的 .gitignore 配置概述

    学习背景:自己在使用git时发现有时会上传很多无用的配置文件,或者在项目中已经包含一个本地的git仓库,导致上一级项目上传总是报错,所以学习采用gitignore配置忽略包含的子项…

    Linux 2023年6月13日
    077
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    Linux 2023年6月8日
    065
  • mysql-高可用架构:MHA

    mysql-高可用架构:MHA 1. MHA简介 MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序…

    Linux 2023年6月13日
    086
  • 项目的部署和环境搭建

    项目的部署和环境搭建 cd /opt (一般项目部署的文件代码都放在/opt目录下) 3.进入项目跟目录下的docker目录: cd crm _pro/docker 4.执行doc…

    Linux 2023年6月7日
    092
  • 同一台电脑生成多份ssh私钥和公钥,映射多个GitHub账号

    当我们使用 Git 进行代码版本控制时,经常出现一台电脑需要连接多个Git 账号的情况,此时需要在一台电脑上生成多份 ssh 私钥和密钥,同时映射多个 Git 账号;这里我们需要同…

    Linux 2023年6月14日
    080
  • 020 Linux 20个宝藏命令案例

    1 JDK 相关的查找命令 (1)确认是否安装 JDK (2)查找 java 命令目录的位置 (3)查找 java 命令的位置的软链地址 (4)通过软链地址查找 JDK 的安装目录…

    Linux 2023年5月27日
    087
  • Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程。那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数。 1.1 for…

    Linux 2023年6月8日
    0110
  • vue axios的二次封装

    1、axios的二次封装 BiliBili作者原地址,多多支持 npm i axios //下载axios 首先创建两个文件夹在src目录下;api和config 先在 confi…

    Linux 2023年6月7日
    080
  • Docker部署Redis

    执行以下命令,创建并启动镜像。如果本地没镜像,会自动拉取 docker run \ -itd \ –restart=always \ –name=redis \ -p 6379…

    Linux 2023年6月7日
    084
  • shell脚本并发执行

    简单的并发脚本 如果shell不能执行,或者报格式错误,记得用 Original: https://www.cnblogs.com/phpdragon/p/10511256.htm…

    Linux 2023年5月28日
    0104
  • [ Python ] 音视频剪辑

    https://www.cnblogs.com/yeungchie/ 视频 提取视频 from moviepy.editor import * 从 MP4 文件提取 video =…

    Linux 2023年6月7日
    094
  • shell xargs技巧

    find /home/tomcat8-hk/ -name ‘808*.sh’ | xargs -i sed ‘s@CATALINA_HOME=&…

    Linux 2023年5月28日
    0104
  • ansible用authorized_key模块批量推送密钥到受控主机实现免密登录

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    095
  • EXCEL中vlookup函数的使用

    =LOOKUP(“座”,INDIRECT(“A1:A”&MATCH(E3,B1:B14,))) 这个公式中还嵌套了INDIR…

    Linux 2023年6月13日
    090
  • Linux静默安装weblogic12(fmw_12.1.3.0.0_wls.jar)

    1、安装JDK环境 2、创建安装用户 3、配置JAVA环境变量 4、创建响应文件wls.rsp 响应文件中的项一定要写全,否则会报奇怪的错误。 5、创建Loc文件oraInst.l…

    Linux 2023年6月14日
    0100
  • Redis数据类型

    该文章是对Redis官方文档的翻译 字符串(Strings) 字符串是Redis值的最基础的类型。Redis字符串是二进制安全的,这意味着一个Redis字符串可以包含任何种类的数据…

    Linux 2023年5月28日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球