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

在企业生产集群架构中,NFS作为所有前端Web服务的共享存储,存储的内容一般包括网站用户上传的图片,附件,头像等,注意,网站的程序代码不要放NFS共享里,因为网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到Web节点提供访问比共享到NFS里访问效率更高。
1.2企业生产集群为什么需要共享存储角色。
这里通过图解给大家展示以下集群架构需要共享存储服务的理由。例如:A用户上传图片到Web1服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,因为Web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到Web1还是Web2上,最终都会存储到共享存储上,而在B用户访问图片时,无论请求分发到Web1还是Web2上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。
当及集群中没有NFS共享存储时,用户访问图片的情况如下图所示。

上图是企业生产集群没有NFS共享存储访问的示意图。下图是企业生产集群有NFS共享存储的情况

1.3NFS的工作流程原理


当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程大致如下:
- 首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
 - NFS服务端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)
 - 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
 - NFS客户端把数据存取成功后,返回给前端访问程序,告知给用户存取结果,作为网站用户,就完成了一次存取操作。
 - 因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务(rpcbind服务)才能获取到NFS服务的各项功能对应的端口号(port number),PID,NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务(rpcbind服务)询问才能找到正确的端口。也就是说,NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpcbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。
 
注意: NFS的RPC服务,在CentOS5.X下名称为portmap,在CentOS6.x下名称为rpcbind
1.4要部署NFS服务,需要安装下面的软件包:
- nfs-utils: NFS服务的主程序,包括rpc.nfsd,rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
 - rpcbind: CentOS6.X下面RPC的主程序。NFS可以视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。
 
1.5NFS参数

1.6exports配置文件相关参数应用领域的详细解释 (NFS精华重点)
1.6.1(rw,sync) :可读可写,同步传输
1.6.2(ro,async):只读,异步传输。
详细说明:
- rw或者ro,主要控制的是所有客户端用户(包含root)的读写权限。如果设置成ro,就算root也只有读权限。它是NFS权限设置的第一道总闸阀门。
 - sync:同步传输,实时进行。
 - async:异步传输:攒一会在传输。
 
1.6.3root_squash:将root账户在共享目录里的身份降低为匿名者(默认nfsnobody)身份
1.6.4no_root_squash:不降低root账户在共享目录的身份,身份还是root
1.6.5all_squash:将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份
详细说明:
- 匿名者身份默认情况下就是NFS服务器端的虚拟账户角色,也就是nfsnobody。这是最低的身份,所有NFS客户端共享目录的访问者都被附加了这个身份,这也就意味者,如果文件的属主属组是nfsnobody的话,所有访问者对该文件都拥有全部所有权。
 - 所谓身份并不是访问权限,而是用户在共享目录里创建的文件的属主和属组。
 - 一旦身份被降低那么在共享目录里创建的文件的属主和属组就是变成了默认情况下的nfsnobody。这也就意味着,权限系统对你所创建的文件不做任何保护(任何访问者都可以查看,修改,删除)
 
所谓root_squash:
- 使用这个参数意味着root在共享目录里创建的任何文件都不受保护,任何人(所有用户)都可以读取,修改,删除)。
 - 而非root用户则不降低权限,在共享目录里创建的文件的属主和属组统一为nobody(身份隐藏了),这种情况下,所有普通用户之间只能互相查看文件,并不能任意修改和删除并且你还无法知道是谁创建的文件,每个普通用户只能修改或删除自己创建的文件。
 - root用户虽然被降低了身份,但是并没有降低他的管理者权限,也就是说它仍旧能对所有共享目录里的所有文件进行查看,修改,删除操作。
 - 如果这类参数默认为空的话,那么NFS将默认使用这个参数。
 
所谓no_root_squash:
- 使用这个参数意味着不对root进行降低身份的操作,也就是说root在共享目录里创建的文件的属主属组仍旧为root(不能被普通用户修改和删除)。
 - 非root用户同root_squash一样,并不降低权限。
 
所谓all_squash:
- 使用这个参数意味着对所有访问NFS共享目录的用户进行降低身份的操作。也就是说,所有用户只要在共享目录里创建文件,那么文件的属主属组就是默认情况下的nfsnobody。
 - 在这个模式下,任何nfs客户端的任何访问用户都可以对共享目录里的任何文件进行查看,修改,删除操作
 
1.6.6 anonuid和anongid:指定NFS虚拟账户的uid或gid
这两个参数主要用来修改NFS默认的虚拟账户nfsnobody。可以通过指定虚拟账户的uid和gid的方式修改默认的虚拟账户的账户名称和所属组。
2.NFS实际演练
服务端:
2.1由服务端与客户端都安装nfs-utils和rpcbind两个安装包
[root@root ~]# yum -y install nfs-utils rpcbind
2.2NFS服务端配置文件路径
NFS服务的默认配置文件路径为:
/etc/exports,并且默认是空的

解析:

(ro):只可看,不能写
2.3 启动rpcbind

2.4查看rpcinfo信息
2.4.1NFS未启动状态下的rpcinfo

2.4.2NFS启动状态下的rpcinfo



2.5查看网络文件是否可挂载

2.6创建共享目录/data,并更改其属主属组为nfsnobody(加R参数)

注:
nfsnobody为NFS的程序用户

2.7由客户端挂载


2.8如果挂载不上,就打开/etc/ssh/sshd_config
[root@yangwenbo /]# vim /etc/ssh/sshd_config


2.9服务端本地实验

客户端:
3.1首先必须装nfs-utils和rpcbind两个安装包
3.2挂载对方共享目录

3.3查看自家目录/tmp

3.3本地实验上传数据

服务端:
由服务端检查本地的两个目录

3.NFS企业级优化
3.1 NFS配置文件优化
问题:
(1)NFS客户端挂载后,往共享目录写入数据时卡住了
(2)NFS服务端,重启restart服务,客户端如果写入数据卡住了。
解答:
1.nfs服务端重启之后,共享文件夹进入grace time(无敌时间)
2.客户端在服务端重启后写入数据大概要等90秒
3.nfs配置文件:/etc/sysconfig/nfs

3.2NFS客户端mount挂载深入
在NFS服务端可以通过cat /var/lib/nfs/etab 查看服务端配置参数的细节。在NFS客户端可以通过cat /proc/mounts查看mount的挂载参数细节。
3.2.1 mount挂载说明
通过如下命令在NFS客户端测试挂载获取的默认挂载参数:

NFS Client mount挂载参数列表

3.2.2mount -o参数对应的选项:
|参数|参数意义|系统默认值|

3.3NFS 客户端mount挂载优化
提问:在企业生产环境中,NFS客户端挂载有没有必须要加的参数,比如,加noexec,nosuid,nodev,bg,soft,rsize,wsize等参数。
解答:这个问题属于mount挂载优化内容(有些参数也适合其他文件系统),一般来说要适当加挂载参数,但是,最好是先做好测试,用数据来说话,才能更好的确定到底是挂载还是不挂载。
3.3.1有关系统安全挂载参数选项
在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片,附件,视频),不需要执行suid,exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。
因此在挂载的时候,用下面的命令很有必要:mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.31:/data /mnt
3.3.2mount挂载性能优化参数选项
下面介绍几个在企业生产环境下,NFS性能优化挂载的例子
3.3.2.1禁止更新目录及文件时间戳挂载,命令如下:
mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt
3.3.2.2安全加优化的挂载方式如下:
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data /mnt
3.3.2.3默认的挂载方式如下:
mount -t nfs 172.16.1.31:/data /mnt
3.3.2.4如果是本地文件系统,使用如下命令:
mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
注意:如果本地文件系统挂载时,如果加入
nodiratime会报错
3.3.3NFS网络文件系统优化挂载的参数建议
3.3.3.1在CentOS6.5 6.6 6.8等服务器端和客户端环境下,可使用如下命令参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072 172.16.1.31:/data /mnt
3.3.3.2经过实际测试,CentOS6.6 6.8默认的挂载参数性能还是不错的。
mount -t nfs 172.16.1.31:/data /mnt
注意:非性能的参数越多,速度可能会变慢
3.3.4 NFS内核优化建议
下面是优化选项说明:
- /proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608
 - /proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位) 建议:16777216
 - /proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608
 - /proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。默认设置:124928. 建议:16777216
 
3.4 NFS系统应用的优缺点说明
NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是将其作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会用到。如果是windows和Linux混合环境的集群系统,可以用samba来实现。
优点:
- 简单,容易上手,容易掌握
 - NFS 文件系统内数据是在文件系统之上的,即数据是能看得见的。
 - 部署快速,维护简单方便,且可控,满足需求的就是最好的。
 - 可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
 - 服务非常稳定
 
局限:
- 存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个需要负载均衡及高可用来弥补
 - 在大数据高并发的场合,NFS效率,性能有限(2千万/日以下PV(page view)的网站不是瓶颈,除非网站架构设计太差。)
 - 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。
 - NFS数据是明文的,NFS本身不对数据完整性做验证。
 - 多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)
 - 涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。
 
应用建议:大中小型网站(参考点2000万/日PV以下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽量把静态存储里的资源通过CDN或缓存服务器提供服务,如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。
附录1 【nfs挂载加入fstab案例】
NFS客户端实现fstab开机自启动挂载
现象:在/etc/fstab中配置了nfs开机自动挂载,结果无法开机自动挂载nfs
解答:
1.nfs客户端挂载命令放在/etc/rc.local实现自动挂载
2.开机自启动netfs服务,然后才能实现fstab的开机自动挂载nfs文件系统(linux开机时在加载网络之前就会加载/etc/fstab)
附录2 fstab误操作导致无法开机
2.1fstab文件被错误修改,导致在开机启动linux时候出现错误,提示让你恢复系统设置。
2.1.1开机时出现错误提示

2.1.2输入root用户密码后,进入到用户操作界面

2.1.3打开vim /etc/fstab 文件,我们发现fstab文件是只读的。也就是说目前只能看不能改。

2.1.4退出/etc/fstab。在命令行输入命令
mount -o remount,rw/的意思是将整个根目录已可读可写rw的方式重新挂载一边remount
2.1.5我们再打开/etc/fstab 就会发现只读模式没了

2.1.6赶紧修改fstab然后重启服务器。
2.2光盘救援模式恢复(用linux光盘修复系统)
2.2.1调整开机bios设置光盘启动,然后挂载光盘

2.2.2重启系统,进入光盘救援模式

2.2.3一路回车,不加在网络模式

2.2.4一路回车,选择第一个

2.2.5进入这个页面

2.2.6输入命令

NFS(网络文件系统)的更多相关文章
- Linux系统NFS网络文件系统
		
Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...
 - NFS 网络文件系统挂载在A8板子上
		
我承认自己是菜鸟,没什么网络知识就来搞挂载nfs网络文件系统,花费了5天的时间才把nfs网络文件系统成功挂载在A8板子上,实现了A8板子和虚拟机的文件共享.分享一下个人经验: 以下是基于nfs已经完成 ...
 - [学习嵌入式开发板]iTOP-4412实现NFS网络文件系统
		
本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统. 我们使用的软硬件环境是 ...
 - NFS(网络文件系统的搭建)
		
关于NFS的原理,我在这就不概诉了,其实非常简答的理解就是一个网络磁盘,你需要把它挂载到你的磁盘上使用而已.那接下来谈谈如和搭建NFS网络文件系统. 需要使用2台机器作此实验,我分别配置IP为192. ...
 - 三者互ping,PC,虚拟机,uboot,nfs网络文件系统搭建
		
要想实现三者互ping,韦老师虽然专门出了视频说明,但是在自己配置过程还是出现了问题,这里记录一下解决办法,虽然我也不知道原因,但是解决了出现的问题也实现了三者互ping. 首先,我的硬件设备是PC通 ...
 - Linux系统——NFS网络文件系统
		
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资 ...
 - NFS网络文件系统的配置
		
NFS网络文件系统的配置 NFS网络文件系统 NFS(network file system)网络文件系统.一种使用于分散式文件协定,有SUN公司开发.功能是通过网络让不同的机器.不同的操作系统能够分 ...
 - Linux基础学习-NFS网络文件系统实时文件共享
		
NFS网络文件系统 如果大家觉得Samba服务程序的配置太麻烦了,那么你共享文件的主机都是Linux系统,那么推荐大家在客户端部署nfs服务来共享文件.nfs(网络文件系统)服务可以将远程Linux系 ...
 - Centos6.6 安装nfs网络文件系统
		
一.介绍 nfs网络文件系统的,大部分用在内网文件共享,比如,对集群上传文件做共享,经常用在图片部分,当然数据量大了还是要做分离,做为专门的接口比较好,介绍一下基本安装环境: 1)Cnetos6.6 ...
 - linux初学者-NFS网络文件系统篇
		
linux初学者-NFS网络文件系统篇 在上一篇的SAMBA篇中介绍了linux系统和windows系统之间共用的网络文件系统CIFS,主要用于客户端是windows的情况.在linux系统之间,所用 ...
 
随机推荐
- Redis的常用命令及数据类型
			
Redis支持的五种数据类型 字符串 (string) 字符串列表 (list) 散列 (hash) 字符串集合 (set) 有序字符串集合 (sorted-set) key(键) keys * 获取 ...
 - Nginx的应用之虚拟主机
			
开始前请确保selinux关闭,否则当配置完虚拟主机后,尽管权限或者网站目录都正确,访问的结果也是403 nginx的虚拟主机有三种方式: 一.基于域名的虚拟主机 (1)创建对应的web站点目录以及程 ...
 - 关于django中的rest_framework的使用
			
rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一 路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不 ...
 - [css知识体系]flexbox模型
			
背景 flexbox 模型的产生主要是为给布局.对齐和容器内的空间分配提供一个更有效的方法,即使尺寸未知或是动态改变的(flex,收缩,弹性 就是为此命名). flex布局使得容器能够改变子元素的宽高 ...
 - [Js代码风格]浅析模块模式
			
1.实例解释模块模式 简明扼要的说,经典的模块模式指的定义一个立即执行的匿名函数.在函数中定义私有函数和私有变量并且返回一个包含公共变量和公共函数作为属性和方法的匿名对象. var classicMo ...
 - Windows 命令提示符
			
命令提示符(cmd): 启动:Win+R ,输入cmd回车 切换盘符:盘符名称: 进入文件夹:cd 文件夹名称 进入多级文件夹:cd 文件夹1\文件夹2\文件夹3 返回上一级:cd .. 直接回根路径 ...
 - USB转串口CH340接线方法
			
https://blog.csdn.net/wangjiaweiwei/article/details/49612207 USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装. USB转串口模块 ...
 - css3-手把手 transform 小时钟
			
学习css3ing,正在学习transfomr,突发奇想用此做个小时钟,开始吧: 准备前期工作,把时钟的表盘,时分秒针,实时时间标签 的大概样子做好,效果如图: html代码如下: <div c ...
 - js学习笔记-日期对象
			
<body> <script> var d = new Date() console.log(d) var arr = ['星期日', '星期一', '星期二', '星期三', ...
 - php str_shuffle()函数 语法
			
php str_shuffle()函数 语法 str_shuffle()函数怎么用? php str_shuffle()函数用于随机的打乱字符串中所有字符,语法是str_shuffle(string) ...