项目介绍
本项目是一款分布式云存储软件,旨在提供强大的文件存储和共享功能。
因为要运行高并发量的访问,所以进行了服务器的集群,也就是要有多台web服务器,每台web服务器中部署相同的程序,为了让这几台web服务器的负载是均衡的,搭建了一个反向代理服务器,在反向代理服务器所对应的配置文件中平衡地给多个web分配任务
每台web服务器上部署了nginx,nginx可以解析http请求,nginx只能部署静态页面,可以在安装目录下将静态页面放到相应的地方。
nginx不能处理动态的页面请求,他只能处理http协议,所以运用了fastCGI,CGI即公共网关接口,其实质是运行在web服务器上的一段代码,这段代码就是被web服务器调用,用以处理一些请求,请求完之后将数据发送给web服务器,再由web服务器发还给客户端。如果单纯的采用CGI,则效率是比较低的,这样如果上传10个文件,它就会fork出10个子进程。所以采用了fastCGI,fastCGI致力于减少Web服务器与 CGI 之间互动的开销,从而使服务器 可以同时处理更多的Web请求 。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理。
因为nginx与fastCGI之间实际上是独立的,所以运用了一个第三方工具Spawn-fcgi,用于启动fastCGI程序。
因为该应用的主要功能就是文件存储,如果直接将上传的文件存储在web服务器上会不利于文件的管理,所以需要一个文件服务器。这里选用了fastDFS作为分布式文件系统,其可以提供文件的上传和下载功能,且fastDFS是分布式的,可以将存储节点布局在多台主机上,方便扩容。
MySQL中存储上传文件的信息(包括文件md5,文件的fild_id,下载的url,文件大小、文件类型、文件名、文件的引用计数)和 文件与用户对应的信息(文件所属用户、文件md5、文件创建时间、文件名、共享状态、文件下载量)以及 用户文件数量信息、共享文件信息等。
Redis中存储一些访问频率很高的数据,如token验证等。
上传文件
浏览器/客户端 通过nginx反向代理服务器连接到web服务器上,浏览器/客户端给web服务器发送对应的upload指令,并调用对应的cgi程序(upload-cgi),在upload-cgi中又会调用fastdfs的API,连接上fastdfs中的tracker,从而得到一个storage的ip和端口,通过这个ip和端口,web服务器将文件存储在这个storage的节点上。同时将fileID和存储节点的IP存储在数据库中。
上传文件的代码逻辑
文件下载
按理说,文件下载的流程是:
浏览器将下载指令发送给web服务器,web服务器无法处理该动态请求,所以将下载指令发给fastcgi,下载相关的cgi程序就去连接fastDFS的tracker,并进行询问“我要下载的文件在哪一个存储节点上面”,tracker经过查询后,将存储节点的IP和端口返回,然后下载相关的cgi程序再去与存储节点(storage)相连接,存储节点再将数据回发给web服务器,然后web服务器再将数据发给浏览器,浏览器才能显示下载的内容,是一个非常麻烦的过程。
1、浏览器访问web服务器
2、web服务器调用cgi程序
3、cgi程序访问tracker
4、tracker会提供storage的ip和端口
5、cgi程序去访问storage,下载数据
6、web服务器需要再次将数据发给浏览器
改进的下载流程
文件上传的时候,将文件的url保存到数据库中
浏览器访问web服务器,查询web服务器中的数据库
直接通过数据库中存储url 来访问storage上的文件
需要在storage上部署一个nginx服务器
下载文件的代码逻辑