上回我们说到,可以通过程序将图片存放到某个盘符下,然后通过配置Nginx,达到高并发访问的目的,但现在我提一个问题:
如果你把图片存入到某个盘符,这个盘满了怎么办?
怎么可能满呢?好几百G呢?在互联网项目中好几百G的图片算个啥?还不是过段时间就满的事儿?
咱不说访问,就说说存储:满了怎么办?加盘?再满了呢?你加了盘怎么访问之前的数据?
所以:没招了,那今天我们提供一种解决方案:通过FastDFS(分布式文件存储系统),听名字就老高大上了。
首先它好在哪儿?---分布式
分布式就意味着:节点是可以随意添加和减少的,是可以有容错容灾功能滴(比如盘符坏了几个,某个机房着火了,机器没了),天灾人祸的,谁也说不好。
那什么是文件系统呢?你的电脑就用了文件系统,不信你看!
算了,图片粘了好几遍都上传不了,就不让你们看了,你可以打开我的电脑,然后右键某个盘符,你看是不是有个文件系统:NTFS
一、什么是FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
二、FastDFS架构
这个图大家一看,貌似也不明白,其实我们每个访问的客户端都是Client,后台FastDFS由两部分组成,第一部分叫做Tracker,另一部分叫做Storager,根据名字基本也明白他们的作用了,举个栗子!
你去一个古老的图书馆借书,这个图书馆有很多的藏书,都是几层楼那么高的那种。
那你要找一本你想要的书估计的猴年马月了,怎么办呢?图书馆一般的做法是:
先去查找你要的书属于哪个分类,大分类下有小分类,再分,再分。。。。。最后就可以找到你要的那本书了,像这么一个查询系统,就是Tracker,然后让Tracker去找你要的内容。
图中是一个Tracker集群,一旦有很多人过来还书或者借书,需要使用很多Tracker来完成。
Storager就好比是图中的一个个书架,书太多了就再追加一组,每一组都有一主一备(主备里面的内容是相同的,一台挂了,另一台赶紧顶上),不同的组之间内容是不同的,如果相同那还要那么多机器作甚啊。
知道这些以后就可以看看书面的内容了,本来不想粘贴的:
FastDFS架构包括Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。
三、文件上传流程
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
group1/M00/00/00/wKgZgVl2Lx6AJGGNAAHY4S_5XfM096_big.jpg
组名:
文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:
storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:
storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:
与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
其实说白一下:group1/M00/00/00/ 这些不就是我们图书馆的大小分类吗?
wKgZgVl2Lx6AJGGNAAHY4S_5XfM096_big.jpg 不就是我们的上传的文件名字吗?
有那么多分组是考虑到数据多了好区分,好管理,图片名字搞那么长无非是不想让名字有重复。
老师?我们上传一个图片还需要做这么多工作?No!
这些内容都是FastDFS自动生成的,无需我们管理,文件上传成功后,会返回一个链接,该链接如下:
四、文件下载流程
tracker根据请求的文件路径即文件ID来快速定义文件。
group1/M00/00/00/wKgZgVl2Lx6AJGGNAAHY4S_5XfM096_big.jpg
1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
理论部分到此为止,本来是要讲如何如何搭建的,啰嗦这就到这个点儿了,如果你发现自己被骗了,请给我点个赞,这样我就知道了,想看如何搭建的朋友,请看下一篇文章,保证不罗嗦。