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)

大家都在看

  • 设计模式——行为型设计模式

    行为型设计模式 针对对象之间的交互 解释器模式 java中用的很。JVM编译的时候就是对我们写的代码进行了解释操作;数据库SQL语句亦是如此 解释器:对语言进行解释,根据不同语义来…

    Linux 2023年6月7日
    0101
  • 二、Java分布式(第二章)—-Demo

    这一章简单搭建一个分布式服务: 1、Dubbo简介:Dubbo 是一个分布式服务框架,是阿里巴巴开源项目。 Dubbo 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA…

    Linux 2023年6月7日
    0107
  • mit6.824 笔记 一

    分布式是复杂的系统再考虑分布式系统前应该尽可能尝试其他方法。 人们使用大量的相互协作的计算机驱动力是: 人们需要获得更高的计算性能。可以这么理解这一点,(大量的计算机意味着)大量的…

    Linux 2023年6月7日
    094
  • Git、TortoiseGit中文安装教程,如何注册Gitee账号进行代码提交,上传代码后主页贡献度没显示绿点(详解)

    今天给大家分享的是 Git 软件和 TortoiseGit 图形化软件的详细安装教程以及如何在 gitee 上进行代码提交。 首先我也是个刚接触 gitee 的一个小白用户,这些都…

    Linux 2023年6月6日
    084
  • 每天一个 HTTP 状态码 200

    200 OK 表示请求成功,一切安好… 200 OK 话不多说,这个状态码应该是最最最常用的了,无人不知,无人不晓;就是表示请求成功的意思, 你若安好,便是晴天。 摘自…

    Linux 2023年6月7日
    093
  • 安装Redis

    1、下载redis 2、解压缩、安装 安装完之后,可以执行以下make test,执行make test之前需要先安装tcl 3、配置 redis服务后台启动 找到: 修改为: 4…

    Linux 2023年5月28日
    082
  • [ Calibre ] 利用 Calibre LVS 检查网表正确性的最小 rule

    利用 Calibre LVS 检查网表正确性的最小 rule https://www.cnblogs.com/yeungchie/ 顶层验证前先检查网表,再跑完整流程。 check…

    Linux 2023年6月7日
    084
  • bash 中 echo & printf

    首先列一下今天收获的消息 sh是: Bourne Shell(/usr/bin/sh或/bin/sh) bash是: Bourne Again Shell(/bin/bash) p…

    Linux 2023年6月6日
    084
  • Keytool配置 Tomcat的HTTPS双向认证

    keytool 简介 Keytool 是一个 Java数据证书的管理工具, Keytool将密钥(key)和证书(certificates)存在一个称为 keystore的文件中。…

    Linux 2023年6月6日
    0122
  • [转]万智牌规则和异能详解

    下面这些都是之前的旧文档了,直到我发现了一个神奇的网站。建议大家有任何疑问,都可以到这里查看规则文档 点击网站的右上方可以搜索 最近游戏过程中发现规则和异能详解的文档很少,找起来非…

    Linux 2023年6月13日
    089
  • 一文搞懂docker容器基础:docker镜像管理,docker容器管理

    一.系统环境 二.docker 2.1 Docker 概述 2.2 Docker 平台 2.3 我可以使用 Docker 做什么? 2.3.1 快速、一致地交付您的应用程序 2.3…

    Linux 2023年6月7日
    0116
  • Jmeter性能测试场景的创建和运行

    目录 性能测试场景的分析 项目背景 Jmeter指标 性能测试场景的设计以及准备 * 性能测试的总结 性能测试场景的分析 项目背景 ​ 实际工作中,我们拿到一个项目一般来说都会是项…

    Linux 2023年6月14日
    068
  • PHP array_values()

    array_values array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。 示例: function arrayValues() { $dat…

    Linux 2023年6月7日
    089
  • 设计模式——中介者模式

    中介者模式定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator抽象中介者角色 抽象中…

    Linux 2023年6月7日
    071
  • POJ1979(Red and Black)–FloodFill

    题目在这里 题目意思是这样的,一个人起始位置在 ‘@’ 处,他在途中能到达的地方为 ‘ . ‘ 而 ‘#’ …

    Linux 2023年6月7日
    092
  • 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库

    一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离…

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