在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一。
集群:多台普通服务器,多台之间共同作用,达到分散压力的作用
负载均衡器:将用户的访问压力平均给后方的多个Web服务器,由多个Web服务器承担网民带来的访问压力
根据图片所示,Web服务器(服务员)有两块网卡,一块连接外网,一块连接内网
文字类型数据存放在MySQL数据库上+
图片,视频,附件(静态资源)存放在存储服务器NFS上
Web程序中,网页目录存在static目录和upload目录
NFS连接的只是网页目录其中的子目录(通过挂载到子目录,挂载时是通过TCP协议进行通信);网页目录下要存放网页代码,而非NFS中。用户上传是上传到upload再到NFS中,用户查看网页是将数据传到static再到NFS中
运维人员用过VPN连接到跳板机,通过跳板机批量管理ssh key、ansible,监控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服务
NFS的RPC服务最主要的功能就是记录每个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联机存取数据
(4)RPC服务把NFS提供的端口返回给客户端,此时客户端才知道是服务端哪个端口提供数据传输
(5)客户端与服务端进行TCP三次握手,连接到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服务。
服务端的RPC服务是一个socket进程,而客户端的RPC服务是一个命令
NFS server端的设置
# mount /dev/sr0 /media/cdrom
# yum -y install rpcbind nfs-utils
启动NFS相关服务
可以观察到没有服务端信息,因为NFS没启动
再查看rpc信息,提供挂载的端口已注册,可以进行挂载
配置NFS服务端(必须安装rpcbind、nfs-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挂载该命令时,必须保证netfs在3模式下为启动状态,否则会出现挂载不上的情况)
# 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改为其他名字,需要使用参数anonuid、anongid(虽被降权,但可以修改)
exports配置文件相关参数的说明
(1)(rw,sync) :可读可写,同步传输
(2)(ro,async):只读,异步传输
(3)root_squash:将root账户在共享目录里的身份降低为匿名者(默认nfsnobody)身份,root在共享目录里创建的任何文件都不受保护,任何人(所有用户)都可以读取,修改,删除;而非root用户则不降低权限,在共享目录里创建的文件的属主和属组统一为nobody(身份隐藏了),这种情况下,所有普通用户之间只能互相查看文件,并不能任意修改和删除并且你还无法知道是谁创建的文件,每个普通用户只能修改或删除自己创建的文件。root用户虽然被降低了身份,但是并没有降低他的管理者权限,也就是说它仍旧能对所有共享目录里的所有文件进行查看,修改,删除操作。
(4)no_root_squash:不降低root账户在共享目录的身份,身份还是root
(5)all_squash:将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份
(6)anonuid和anongid:指定NFS虚拟账户的uid或gid
NFS企业级优化
(1)NFS配置文件优化
- NFS客户端挂载后,往共享目录写入数据时卡住了
- NFS服务端,重启restart服务,客户端如果写入数据卡住了。
解决方法:
-
- NFS服务端重启之后,共享文件夹进入grace time(无敌时间)
- 客户端在服务端重启后写入数据大概要等90秒
- NFS配置文件:/etc/sysconfig/nfs
(2)NFS客户端mount挂载深入
在NFS客户端可以通过cat /proc/mounts查看mount的挂载参数细节
NFS Client mount 挂载参数列表
mount参数 |
参数功能 |
默认参数 |
fg;bg |
当客户端挂载时,可以选择前台fg挂载或者后台bg挂载,后台挂载不影响前台其他操作,如果网络不稳建议bg比较妥当 |
fg |
soft;hard |
soft短挂载,当timeout出现时可能会造成资料丢失,不建议使用 |
hard |
intr |
当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr |
无 |
proto=udp |
使用UDP协议来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用pro=tcp多传输的数据会有比较好的纠错能力 |
proto=tcp |
mount -o参数对应的选项:
|参数|参数意义|系统默认值|
suid;nosuid |
当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能够取消设置SUID的功能。 |
suid |
rw;ro |
可以指定文件系统是只读(ro)或可写(rw) |
rw |
dev;nodev |
是否可以保留装置文件的特殊功能?一般来说只有/dev才会有特殊的装置,因此可以选择nodev |
dev |
exec;noexec |
是否具有执行文件的权限?如果想要挂载的仅是普通资源数据区(例如:图片,附件),那么可以选择noexec |
exec |
user;nouser |
是否允许用户进行文件的挂载与卸载功能?如果要保护文件系统,最好不要提供用户进行挂载与卸载 |
nouser |
auto;noauto |
这个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)简单,容易上手,容易掌握
(2)NFS 文件系统内数据是在文件系统之上的,即数据是能看得见的。
(3)部署快速,维护简单方便,且可控,满足需求的就是最好的。
(4)可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
(5)服务非常稳定
缺点:
(1)存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录。这个需要负载均衡及高可用来弥补
(2)在大数据高并发的场合,NFS效率,性能有限(2千万/日以下PV(page view)的网站不是瓶颈,除非网站架构设计太差。)
(3)客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)。
(4)NFS数据是明文的,NFS本身不对数据完整性做验证。
(5)多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)
(6)涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好。