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)

大家都在看

  • 网络安全中常用浏览器插件、拓展

    引言 现在的火狐、Edge( Chromium内核)、Chrome等浏览器带有插件、拓展(Plugin)的功能。这些插件中有的可以过滤广告,有的提供便捷的翻译,有的提供JavaSc…

    Linux 2023年6月6日
    093
  • 实验一-密码引擎-商用密码算法实现2-交叉测试(选做)

    任务详情 把自己实现的商用密码算法SM2,SM3,SM4与OpenSSL交叉验证 自己实现的SM3算法的结果与OpenSSL的结果比对是否一致 自己实现的SM4算法加密的,Open…

    Linux 2023年6月8日
    0110
  • Python函数的必选参数、默认参数、可变参数、关键字参数和命名关键字参数

    必选参数 def function(args_name): print (args_name) function("参数调用") ~$ 参数调用 跟在函数名口号…

    Linux 2023年6月7日
    073
  • SpringBoot——自定义Redis缓存Cache

    SpringBoot自带Cache存在问题: 1.生成Key过于简单,容易冲突 默认为cacheNames + ":" + Key2.无法设置过期时间,默认时间…

    Linux 2023年5月28日
    0101
  • 使用 ssmtp 於 shell 透過 Gmail 寄信

    有很多程式於 bash shell 執行, 執行完要自動寄信出去, 但是最近都被 Google 退信, 最好的方法是透過 Gmail 直接寄信. 本來是要另外寫隻 script 來…

    Linux 2023年5月28日
    089
  • Postman环境变量的使用

    前言 请注意,Postman新版有ui上的改动,本文使用的Postman 版本8.4.0 for Mac, ui有调整,但是功能无改变。 Postman是一款接口调测的软件,服务端…

    Linux 2023年6月14日
    0102
  • 华为云服务器数据库配置远程连接

    华为云服务器数据库配置远程连接 起因 暑期购买了华为云的一台服务器进行开发 在上面部署了MySQL数据库,由于app中修改用户信息存在未修复的bug,经常会出现登录密码为空,导致账…

    Linux 2023年6月13日
    0135
  • bare Git 仓库是什么?

    背景 今天,坐我旁边的同事问我一些关于服务器上命令的问题。其中有一个用了特殊参数的 git init 的命令,我也不认识,遂去 Google… bare Git 仓库 …

    Linux 2023年6月7日
    092
  • 《拉钩课程 — 重学数据结构与算法》学习笔记

    一、代码效率优化方法论 1、数据结构,从名字上来看是数据的结构,也就是数据的组织方式。 2、复杂度是衡量代码运行效率的重要度量因素。 3、复杂度是一个关于输入数据量 n 的函数。假…

    Linux 2023年6月16日
    0109
  • 【原创】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    0109
  • Redis AOF重写

    AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流逝一定会越来越大;影响包括但不限于:对于Redis服务器,计算机的存储压力;AOF还原出数…

    Linux 2023年5月28日
    0103
  • 线程

    一、线程概念的引入 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区…

    Linux 2023年6月14日
    093
  • Centos7 找回root密码

    在开机界面,按”e”进入编辑界面 按”e”进图下图界面后,找到开头为”linux16″行,在行后面加入 &#…

    Linux 2023年5月27日
    0141
  • Linux之Nginx入门

    一、Nginx介绍 Nginx是一个开源且高性能、可靠的http web服务、代理服务。 开源:直接获取源代码 高性能:支持海量并发 可靠:服务稳定 高性能,高并发 Nginx支持…

    Linux 2023年5月27日
    0102
  • OpenStack-iaas之“先点”云平台安装

    1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务。2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)…

    Linux 2023年6月13日
    091
  • Error: Unable to access jarfile 运行jar包报错

    1、可能是执行路径有误 错误 修改后,需使用绝对路径 2、决解1后,还报以下错误,就是你的安装的JDK与jar包中的JDK不是同一版本。idea中有自带的JDK与我们安装的JDK版…

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