架构师的工具箱,NFS做文件共享如此简单

323 阅读3分钟

[声明:本内容完全来源于个人经验总结,如有雷同,纯属抄袭]

一、问题场景

1、一个用户后端服务,使用nginx做负载均衡,部署了两台服务器(分别为A、B),它们都可以上传头像。

2、用户第一次请求A服务器上传,头像保存在A服务器的磁盘上,如图A-1所示。

3、第二次用户访问的时候,请求从B服务器加载头像,因为B服务器的磁盘上没有文件,因此访问不到,这也是典型的有状态服务的问题,如图A-2所示。

image-20210622153808465.png

图A-1

image-20210622153821808.png

图A-2

二、解决思路

解决思路1:两个存储上的文件始终都是一致的、全量的。

解决思路2:存放文件和获取文件都是同一个存储节点。

如果采用第一种思路,则把A、B服务器的磁盘数据相互同步就可以了,但是这样效率太低,还具有延迟,同时会引发同步风暴,例如现在有10个服务节点,10个节点之间都要相互同步就变为了灾难。

如果采用第二种思路,则可以有以下4种做法:

1、把头像转为base64编码,直接存储在数据库里面,但是这样太占用数据库存储,并且不方便迁移和备份。

2、修改Nginx的转发策略,让所有的文件上传和文件加载请求都转发到同一台服务器上,但是这样单节点压力过大,丧失了负载均衡和高可用的目的。

3、共享一个存储节点,A、B服务器的磁盘目录都映射到一个存储设备上。

4、共享一个存储服务,这种思想就是把共享存储设备换为共享存储服务,例如OSS对象存储服务。

三、实施方案

在讲解方案之前,你一定要知道NAS和NFS是什么,以下内容来源与百度百科。

NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。目前国际著名的NAS企业有Netapp、EMC、OUO等。

NFS(Network File System)网络文件系统,是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

显然第3、4方案是更好的选择,而方案3更有助于降低成本。

我们使用方案3来共享一个存储节点,如下图所示,使用NFS可以将A、B服务器本地磁盘的某个目录,挂载到NAS存储中。

image-20210622153838249.png

此时A、B服务上传文件时都在操作自己的本机磁盘目录,但是数据会实时同步到NAS存储当中,内网环境下延迟基本可以忽略。

这种方式的好处是,对操作系统透明,对开发人员透明化,程序无需做任何改动。

开发人员完全不知道还有个NFS存在,完全是在操作本地文件,就达到了文件共享的目的。

除此之外NFS还有很多妙用,下次我们再来聊一聊。