一、前言

NFS(Network File System,网络文件系统),主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS 客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将 NFS 服务器端共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的 NFS 服务器的目录。

NFS 网络文件系统很像 Windows 系统网络驱动器映射,这也和 Linux 系统里的 samba 服务类似。只不过一般情况下,Windows 网络共享服务或 samba 服务用于办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享。

在企业集群架构的工作场景中,NFS 网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到 NFS 共享里,例如:BBS 产品的图片,附件,头像(注意网站 BBS 程序不要放 NFS 共享里),然后前端所有的节点访问这些静态资源时都会读取 NFS 存储上的资源。NFS 是当前互联网系统架构中最常用的数据存储服务之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用 NFS 外,还可能会使用更为复杂的分布式文件系统,比如 Moosefs(mfs),GlusterFS,FastDFS 等。

举例来说,A 用户上传图片到 Web1 服务器,然后让 B 用户访问这张图片,结果B用户访问的请求分发到了 Web2,因为 Web2 上没有这张图片,这就导致它无法看到 A 用户上传的图片,如果此时有一个共享存储,A 用户上传图片的请求无论是分发到 Web1 还是 Web2上,最终都会存储到共享存储上,而在 B 用户访问图片时,无论请求分发到 Web1 还是 Web2 上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通 PC 服务器配置 NFS 网络文件系统实现。

企业生产集群没有 NFS 共享存储访问示意图,如下:

企业生产集群有 NFS 共享存储访问示意图,如下:

NFS 系统原理示意图,如下:

在 NFS 服务器端设置好一个共享目录 /test 后,其他有权限访问 NFS 服务器端的客户端都可以将这个共享目录 /test 挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),图中两个 NFS 客户端本地挂载点分别为 /mnt 和 /tmp,不同客户端的挂载点可以不相同。

客户端正确挂载完毕后,就可以通过 NFS 客户端的挂载点所在的 /mnt 或 /tmp 目录查看到 NFS 服务器端 /test 共享出来的目录下的所有数据。在客户端上查看时,NFS 服务端的 /test 目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据 NFS 服务器端授予的 NFS 共享权限以及共享目录的本地系统权限,只要在指定的 NFS 客户端上操作挂载 /mnt 或 /tmp 的目录,就可以将数据轻松的存取到 NFS 服务器端上的 /test 目录中了。

以下准备两台 Linux 主机用来配置 NFS 服务:

NFS 服务端:主机名为 masternode,IP 地址为 192.168.150.140

NFS 客户端:主机名为 backupnode,IP 地址为 192.168.150.139

二、服务端配置 NFS

在 CentOS 上使用 NFS 服务需要安装两个包(ufs-utils 和 rpcbind),不过当使用 yum 工具安装 nfs-utils 时会一同安装 rpcbind,在 CentOS 6 之前是需要安装  portmap,从 CentOS 开始,就改为安装 rpcbind 了,如下:

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

首先编辑配置文件,该文件默认为空,如下:

[root@masternode ~]# vim /etc/exports
/data/nfs_share 192.168.150.0/(rw,sync,all_squash,anonuid=,anongid=)

添加了一行内容,该行内容分为三部分。第一部分是本地要共享出去的目录,第二部分是允许访问的主机(可以是一个 IP,或者是一个 IP 网段),第三部分就是小括号里面的一些权限。注意:地址和权限之间没有空格。关于第三部分有以下权限:

rw:表示读/写。

ro:表示只读。

sync:同步模式,表示内存中的数据实时写入磁盘。

async:非同步模式,表示内存中的数据定期写入磁盘。

no_root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员。

root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户。

all_squash:无论 NFS 客户端使用什么账号访问,均映射为 NFS 服务器的匿名用户。

anonuid/anongid:要和 root_squash 以及 all_squash 选项一同使用,用于指定使用 NFS 的用户被限定后的 uid 和 gid。

编辑好配置文件后创建好相关目录并启动 NFS 服务,还有将其设置为开机启动,如下:

[root@masternode ~]# systemctl start rpcbind
[root@masternode ~]# systemctl start nfs
[root@masternode ~]# systemctl enable rpcbind
[root@masternode ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

在启动 NFS 服务之前,需要先启动 rpcbind 服务。由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。

三、客户端挂载 NFS

同样,在客户端机器上也安装 nfs-utils 包,如下:

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

在客户端挂载 NFS 之前,我们可以使用 showmount 查看服务端共享了哪些目录,如下:

[root@backupnode ~]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_share 192.168.150.0/

其中 -e 选项表示 --exports,Show the NFS server's export list

挂载服务端共享的目录,如下:

[root@backupnode ~]# mount 192.168.150.140:/data/nfs_share /data/nfs_archive
mount.nfs: mount point /data/nfs_archive does not exist
[root@backupnode ~]# mkdir -p /data/nfs_archive
[root@backupnode ~]# mount 192.168.150.140:/data/nfs_share /data/nfs_archive
[root@backupnode ~]# df -hT /data/nfs_archive
Filesystem Type Size Used Avail Use% Mounted on
192.168.150.140:/data/nfs_share nfs4 18G .4G 17G % /data/nfs_archive

可以发现在挂载前,必须首先创建挂载点。

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxr-xr-x root root Sep : /data/nfs_archive
[root@backupnode ~]# cd /data/nfs_archive
[root@backupnode nfs_archive]# touch /data/nfs_archive/test1.txt
touch: cannot touch ‘test1.txt’: Permission denied

在客户端的挂载点中创建文件,发现权限不足,这是因为虽然你在客户端使用的是 root 用户,但是挂载后在新的挂载点中相当于被限制为 uid 为 1000 的用户,而该用户是没有权限在 /data/nfs_archive 中创建文件的,该目录所有者为 root:root,权限为 rwxr-xr-x

所以,我们现在服务端修改共享点权限,如下:

[root@masternode ~]# chmod  /data/nfs_share
[root@masternode ~]# ls -ld /data/nfs_share
drwxrwxrwx root root Sep : /data/nfs_share

然后再在客户端中创建测试文件,如下:

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxrwxrwx root root Sep : /data/nfs_archive
[root@backupnode nfs_archive]# touch /data/nfs_archive/test1.txt
[root@backupnode nfs_archive]# ls -l
total
-rw-r--r-- Sep : test1.txt
[root@backupnode nfs_archive]# useradd ryan
[root@backupnode nfs_archive]# id ryan
uid=(ryan) gid=(ryan) groups=(ryan)
[root@backupnode nfs_archive]# ls -l
total
-rw-r--r-- ryan ryan Sep : test1.txt

可以发现,当在服务端修改共享点的权限后,在客户端也会相应的自动更新对应挂载点的权限。

四、exportfs 命令

当在服务端改变 /etc/exports 配置文件后,使用 exportfs 命令挂载不需要重启 NFS 服务,如下:

[root@masternode ~]# vim /etc/exports
/data/nfs_share 192.168.150.0/(rw,sync,all_squash,anonuid=,anongid=)
/data/nfs_common_share *(rw,sync,no_root_squash) [root@backupnode nfs_archive]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_share 192.168.150.0/

在服务端添加新的共享点之后,在客户端使用 showmount 查询不到。

然后在服务端使用 exportfs 命令后再查看,如下:

[root@masternode ~]# exportfs -arv
exporting 192.168.150.0/:/data/nfs_share
exporting *:/data/nfs_common_share [root@backupnode nfs_archive]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_common_share *
/data/nfs_share 192.168.150.0/

其中 exportfs 常用选项有:

-a:表示全部挂载或者卸载。

-r:表示重新挂载。

-u:表示卸载某一个目录。

-v:表示显示共享的目录。

五、启动挂载和自动挂载

我们将挂载信息写入到 /etc/fstab 中,这样远程共享资源就会自动随服务器开机而进行挂载,加入如下信息:

[root@backupnode ~]# vim /etc/fstab
192.168.150.140:/data/nfs_share /data/nfs_archive nfs defaults,nolock

但是,将挂载信息填入 /etc/fstab 之后,无论该资源是否使用,系统在每次开机时都会自动将其挂载,如果资源挂载后长期不使用,也会造成服务器硬件资源的浪费。为了解决这个问题,我们可以安装 autofs 自动挂载服务,该程序是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

Linux 笔记 - 第二十一章 配置 NFS 服务的更多相关文章

  1. Linux 笔记 - 第二十三章 MySQL 主从复制配置

    一.前言 MySQL Replication,也被称为主从复制.AB 复制.简单来说就是 A 和 B 两台服务器做主从后,在 A 服务器上写入数据,B 服务器上也会跟着写入输入,两者之间的数据是实时同 ...

  2. 《Java编程思想》笔记 第二十一章 并发

    1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...

  3. Linux 笔记 - 第十一章 正则表达式

    博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...

  4. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...

  6. Flask 教程 第二十一章:用户通知

    本文翻译自The Flask Mega-Tutorial Part XXI: User Notifications 这是Flask Mega-Tutorial系列的第二十一章,我将添加一个私有消息功能 ...

  7. RHEL5.8配置NFS服务

    机器配置:4C+16GB 操作系统:RedHat Enterprise Linux 5.8 NFS基础 NFS(Network File System)是Linux系统之间使用最为广泛的文件共享协议, ...

  8. Gradle 1.12用户指南翻译——第二十一章. Gradle 插件

    昨天晚上只顾着和女朋友看<匆匆那年>电视剧的最后几集,所以说好的Android文档<Gradle 插件用户指南>第五章自然也没翻译多少.所以今天也发不了第五章的翻译了,就发几个 ...

  9. [转]Ubuntu下配置NFS服务

    [转]Ubuntu下配置NFS服务  http://blog.163.com/liu8821031%40126/blog/static/111782570200921021253516/ Table ...

随机推荐

  1. 深入分析Java的编译期与运行期

    不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的 ...

  2. 理解Go协程与并发

    协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...

  3. pycharm---文件名颜色所代表的含义

    绿色,已经加入版本控制暂未提交: 红色,未加入版本控制: 蓝色,加入版本控制,已提交,有改动: 白色,加入版本控制,已提交,无改动: 灰色:版本控制已忽略文件.

  4. python之“装饰器”

    在python里装饰器 其定义:装饰器就是一个函数,用来装饰其他函数,就是给其他函数添加功能. 装饰器有两个特点: 1.装饰器不修改被装饰函数的源码: 2.装饰器不锈钢被装饰函数的调用方式. 在编程中 ...

  5. 纯css、js 的H5页面对接echarts

    做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:做可视化界面,但是需要兼容ie8,需要用纯css.js 的H5页面对接echarts,下面为效果图(带定时器循环显示tooltip). 实现方 ...

  6. SpringBoot:高并发下浏览量入库设计

    一.背景 文章浏览量统计,low的做法是:用户每次浏览,前端会发送一个GET请求获取一篇文章详情时,会把这篇文章的浏览量+1,存进数据库里. 1.1 这么做,有几个问题: 在GET请求的业务逻辑里进行 ...

  7. spring boot整合mybatis框架及增删改查(jsp视图)

    工具:idea.SQLyog 版本:springboot1.5.9版本.mysql5.1.62 第一步:新建项目 第二步:整合依赖(pom.xml) <dependencies> < ...

  8. 终于跑通分布式事务框架tcc-transaction的示例项目

    1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...

  9. 再谈C#装箱和拆箱操作

    1. 使用非泛型集合时引发的装箱和拆箱操作 看下面的一段代码: 1 2 3 4 5 6 7 8 var array = new ArrayList(); array.Add(1); array.Add ...

  10. 美团张志桐:美团 HTTP 服务治理实践

    2019 年 7 月 6 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·上海站,美团基础架构部技术专家张志桐在活动上做了<美团 HTTP ...