Linux系统——NFS网络文件系统

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一。

 

集群:多台普通服务器,多台之间共同作用,达到分散压力的作用

 

负载均衡器:将用户的访问压力平均给后方的多个Web服务器,由多个Web服务器承担网民带来的访问压力

 

根据图片所示,Web服务器(服务员)有两块网卡,一块连接外网,一块连接内网

 

文字类型数据存放在MySQL数据库上+

 

图片,视频,附件(静态资源)存放在存储服务器NFS

 

Web程序中,网页目录存在static目录和upload目录

NFS连接的只是网页目录其中的子目录(通过挂载到子目录,挂载时是通过TCP协议进行通信);网页目录下要存放网页代码,而非NFS中。用户上传是上传到upload再到NFS中,用户查看网页是将数据传到static再到NFS

 

运维人员用过VPN连接到跳板机,通过跳板机批量管理ssh keyansible,监控zabbix

 

企业生产群集为什么要共享存储角色

A用户上传图片到Web1服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,因为Web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到Web1还是Web2上,最终都会存储到共享存储上,而在B用户访问图片时,无论请求分发到Web1还是Web2上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。

 

NFS系统原理

NFS服务器端/video共享目录挂载到两台NFS客户端上。

 

NFS服务端先将其本身的一个目录进行共享,eg/video目录,在客户端查看时,NFS服务端的/video目录就相当于客户端本地的磁盘分区或目录,根据NFS服务端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载/v/video或者/video的目录,就可以将数据轻松地存取到NFS服务器端上的/video目录中。

 

其他客户端通过IP与服务端进行远程挂载

 

客户端挂载NFS后,本地挂在信息查询:

# df -h

Filesystem处显示:ip地址:共享目录

 

远程挂载命令

# mount IP地址:/对方源目录 目标目录(本机)

# mount 10.0.0.7:/video  /video

 

 

RPC服务

NFSRPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务类似NFS服务端和NFS客户端之间的一个中介。

服务端需要先安装rpcbind软件包(rpc的服务端),再安装nfs-utils软件包(包括了rpc的客户端

客户端需要安装一个插件包(最小化装机模式)

 

 

 

 

NFS启动流程

1)启动RPC服务(中介)

首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。

(2)启动NFS服务(房源),向RPC服务注册启动的端口

NFS服务端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)

(3)客户端(租客)挂载,先向RPC服务请求NFS服务 (因为RPC是一个socket守护进程,监听固定端口),并与NFS daemon联机存取数据

4RPC服务把NFS提供的端口返回给客户端,此时客户端才知道是服务端哪个端口提供数据传输

5)客户端与服务端进行TCP三次握手,连接到NFS服务

 

因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务(rpcbind服务)才能获取到NFS服务的各项功能对应的端口号(port number),PIDNFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务(rpcbind服务)询问才能找到正确的端口。也就是说,NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpcbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。

 

服务端的RPC服务是一个socket进程,而客户端的RPC服务是一个命令

 

NFS server端的设置

 

# mount /dev/sr0 /media/cdrom

# yum -y install rpcbind nfs-utils

启动NFS相关服务

 

可以观察到没有服务端信息,因为NFS没启动

再查看rpc信息,提供挂载的端口已注册,可以进行挂载

配置NFS服务端(必须安装rpcbindnfs-utils软件)

(1)NFS服务端配置文件路径

(2)exports配置文件格式

(3)给共享目录更改属主属组为nfsnobody

(4)进行本地挂载测试

(5)进行文件写入测试

 

NFS服务端配置文件路径

# vim /etc/exports

 

exports配置文件格式

 

修改配置文件后,必须重启NFS服务

#showmount命令

查看网络文件能否挂载

# showmount -e   查看生效的NFS配置文件规则

查看本地共享信息

# showmount -e localhost

# showmount -e 127.0.0.1

给共享目录更改属主属组为nfsnobaby

# mkdir /data

# chown nfsnobody.nfsnobody /data

进行本地挂载测试

# mount 192.168.214.134:/data /tmp

 

若出现此类情况,对/etc/ssh/sshd_config进行修改

(1)# vim /etc/ssh/sshd_config 

 

(2# service sshd reload

 

# rm -rf /tmp/*

# mount 192.168.214.134:/data /tmp

再进行本地挂载测试!

 

本地测试成功!

 

进行文件写入测试

# showmount -e 192.168.214.134

查看这个IP地址是否有网络文件系统NFS提供挂载

服务端也需要在脚本中配置mount开机自动挂载

 

 

配置NFS客户端(必须安装nfs-utils软件)

(1)检查远端showmount

(2)客户端挂载

(3)进行文件读写及同步测试

(4)配置开机自动挂载nfs共享目录

 

检查远端showmount

# showmount -e 192.168.214.134

客户端挂载

# mount 192.168.214.134:/data /www

 

进行文件读写及同步测试

测试成功!

 

配置开机自动挂载nfs共享目录

方法一:将挂载命令放在/etc/rc.local

缺点:偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载做监控(network文件在/etc/rc.local之前启动,若在/etc/rc.local之后启动会没有网络,挂载不上)

# echo "mount -t nfs 1923168.214.134:/data /www"-t nfs可以不写)

 

方法二:将挂载命令在在/etc/fstab

/etc/fstab在开启系统时启动,此时network还未启动,所以在使用/etc/fstab挂载该命令时,必须保证netfs3模式下为启动状态,否则会出现挂载不上的情况)

# chkconfig | grep netfs

3模式下必须为开机启动状态

 

因此,nfs网络文件系统最好不要放到fstab里实现开机挂载。但如果是在开机自启动服务里设置并启动了netfs服务,放入fstab里也是可以开机挂载的。

 

 

 

 

 

NFS配置权限设置常用参数说明

rw

Read-write,表示可读写权限

ro

Read-only,表示只读权限

sync

(同步,实时)请求或吸入数据时,数据同步写入到NFS Server的硬盘后才返回

async

(异步)写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样可以提升写入速率!风险为若服务器挂掉或不正常关机,会损失缓冲区中未写入磁盘的数据

no_root_squash

访问NFS Server共享目录的用户如果是root,它对该共享目录具有root权限。

root_squash

如果访问目录的是root,则它的权限将被压缩成匿名用户(普通用户不降权)。

all_squash

不管访问共享目录的用户身份如何,它的权限都被压缩成匿名用户。

anonuid

指定共享文件夹里文件所有者的uid号:例如:(rw,squash,anonuid=12306,anongid=12306

anongid

指定共享文件夹里文件所有者的gid号:例如:(rw,squash,anonuid=12306,anongid=12306

若想将属主、属组从nfsnobody改为其他名字,需要使用参数anonuidanongid(虽被降权,但可以修改)

 

 

 

exports配置文件相关参数的说明

 

(1)rw,sync:可读可写,同步传输
2)(ro,async:只读,异步传输

3root_squash:root账户在共享目录里的身份降低为匿名者(默认nfsnobody)身份,root在共享目录里创建的任何文件都不受保护,任何人(所有用户)都可以读取,修改,删除;而非root用户则不降低权限,在共享目录里创建的文件的属主和属组统一为nobody(身份隐藏了),这种情况下,所有普通用户之间只能互相查看文件,并不能任意修改和删除并且你还无法知道是谁创建的文件,每个普通用户只能修改或删除自己创建的文件。root用户虽然被降低了身份,但是并没有降低他的管理者权限,也就是说它仍旧能对所有共享目录里的所有文件进行查看,修改,删除操作。
4no_root_squash:不降低root账户在共享目录的身份,身份还是root
5all_squash:将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份

6anonuidanongid:指定NFS虚拟账户的uidgid

 

 

NFS企业级优化

(1)NFS配置文件优化

  1. NFS客户端挂载后,往共享目录写入数据时卡住了
  2. NFS服务端,重启restart服务,客户端如果写入数据卡住了。

解决方法:

    1. NFS服务端重启之后,共享文件夹进入grace time(无敌时间)
    2. 客户端在服务端重启后写入数据大概要等90
    3. NFS配置文件:/etc/sysconfig/nfs

2NFS客户端mount挂载深入

NFS客户端可以通过cat /proc/mounts查看mount的挂载参数细节

NFS Client mount 挂载参数列表

mount参数

参数功能

默认参数

fgbg

当客户端挂载时,可以选择前台fg挂载或者后台bg挂载,后台挂载不影响前台其他操作,如果网络不稳建议bg比较妥当

fg

softhard

soft短挂载,当timeout出现时可能会造成资料丢失,不建议使用

hard

intr

当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr

proto=udp

使用UDP协议来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用pro=tcp多传输的数据会有比较好的纠错能力

proto=tcp

mount -o参数对应的选项:

|参数|参数意义|系统默认值|

suidnosuid

当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能够取消设置SUID的功能。

suid

rw;ro

可以指定文件系统是只读(ro)或可写(rw

rw

dev;nodev

是否可以保留装置文件的特殊功能?一般来说只有/dev才会有特殊的装置,因此可以选择nodev

dev

execnoexec

是否具有执行文件的权限?如果想要挂载的仅是普通资源数据区(例如:图片,附件),那么可以选择noexec

exec

usernouser

是否允许用户进行文件的挂载与卸载功能?如果要保护文件系统,最好不要提供用户进行挂载与卸载

nouser

autonoauto

这个auto指的是“mount -a”时会不会被卸载的项目,如果不需要这个分区随时被挂载,可以设置为noauto

auto

 

 

 

 

 

(1)NFS客户端mount挂在优化

挂载时常用命令

# mount -t nfs -o nosuid,noexec,nodev,rw  192.168.214.134:/data /www

 

Mount性能优化参数选项

1)禁止更新目录及文件时间戳挂载

# mount -t nfs -o noatime,nodiratime 192.168.214.134:/data /www

2)安全加优化的挂载方式

# mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072 192.168.21.4134:/data /www

3)默认的挂载方式

# mount -t nfs 192.168.214.134:/data /www

如果是本地文件系统,使用如下命令

# mount /dev/sdb1 /www -o defaults,async,noatime,data=writeback,barrier=0

 

 

NFS内核优化建议

1/proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608

2/proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位) 建议:16777216

3/proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928 建议:8388608

4/proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。默认设置:124928. 建议:16777216

 

NFS系统应用的优缺点说明

优点:

1)简单,容易上手,容易掌握

2NFS 文件系统内数据是在文件系统之上的,即数据是能看得见的。

3)部署快速,维护简单方便,且可控,满足需求的就是最好的。

4)可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。

5)服务非常稳定

 

缺点:

1)存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个需要负载均衡及高可用来弥补

2)在大数据高并发的场合,NFS效率,性能有限(2千万/日以下PV(page view)的网站不是瓶颈,除非网站架构设计太差。)

3)客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。

4NFS数据是明文的,NFS本身不对数据完整性做验证。

5)多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)

6)涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。

 

posted @ 2018-11-06 23:25  daisy118  阅读(386)  评论(0编辑  收藏  举报