# Distributed shared cloud disk **Repository Path**: sunset77/distributed-shared-cloud-disk ## Basic Information - **Project Name**: Distributed shared cloud disk - **Description**: 实现了一个分布式的共享云盘,云盘有注册登录、上传(含秒传)和下载文件、查看文件、分享文件等功能。 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2021-06-16 - **Last Updated**: 2022-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Distributed shared cloud disk(分布式共享云盘) [1. 项目简介](#1-项目简介) - [1.1 项目背景](#11-项目背景) - [1.2 项目演示](#12-项目演示) [2. 主要应用技术](#2-主要应用技术) [3. 项目架构和部分功能](#3-项目架构和部分功能) - [3.1 项目架构图](#31-项目架构图) - [3.2 注册和登录](#32-注册和登录) - [3.3 上传和下载](#33-上传和下载) [4. 项目部署_单机](#4-项目部署_单机) - [4.1 环境](#41-环境) - [4.2 编译运行](#42-编译运行) [5. 项目部署_多机](#5-项目部署_多机) ## 1. 项目简介 ### 1.1 项目背景 本项目属于实验室项目,主要是利用了几台闲散的计算机,实现了一个分布式的共享云盘,供同学们上传和下载资料。云盘有注册登录、上传(含秒传)和下载文件、查看文件、分享文件等功能。个人主要负责的是后端对于用户注册登录,以及上传和下载文件时的处理。 ### 1.2 项目演示 - 注册和登录 注册和登录

图1 注册和登录演示

- 上传 上传

图2 上传演示

- 下载 下载

图3 下载演示

## 2. 主要应用技术 这里主要列举个人负责部分涉及到的技术。 - C/C++ - FastDFS 分布式文件系统 - MySQL 和 Redis 数据库 - Nginx 服务器 - FastCGI 接口 ## 3. 项目架构和部分功能 ### 3.1 项目架构图 基本框架图

图4 分布式共享云盘基本架构图

项目的基本架构图如上图1所示。首先,客户端(QT程序)向Nginx服务器发起HTTP请求(注册、登录、上传、下载等),由于都是动态请求,Nginx无法直接响应,于是转发给相应的FastCGI进程进行处理。FastCGI通过读写数据库、和FastDFS进行交互等操作,完成用户请求,再将结果发送给Nginx,最终以HTTP的形式返回给用户。 本项目里,对FastDFS的storage做了集群,共有两个组,每个组里各有两个storage,同组中的storage是互相备份的关系,组与组之间不需要通信,每组最小的容量加起来就是storage的总容量。 ### 3.2 注册和登录 注册和登录的过程比较简单,参考图1,只需要操作数据库即可,这里不详细展开了,有兴趣的话可以看下源码。 ### 3.3 上传和下载 #### 3.3.1 上传文件 上传文件的大概过程也可参考图1,主要为: 1. 客户端首先发起秒传请求,秒传成功则修改数据库相关信息,失败转2; 2. 客户端发起上传请求,Nginx服务器收到后,交给FastCGI进程处理; 3. FastCGI将用户文件临时保存到本地,然后将文件存入FastDFS,之后删除临时文件; 4. FastCGI根据storage节点返回file_id信息生成url,存入MySQL数据库; 5. FastCGI向前端反馈上传成功或失败的信息; > **FastCGI将文件上传到FastDFS的具体过程如下:** > > 1)FastCGI向tracker查询可用的storage; > > 2)tracker返回可用storage的信息(ip和端口); > > 3)FastCGI向storage上传文件; > > 4)storage将文件写入磁盘,生成该文件的file_id并返回; #### 3.3.2 下载文件 文件的下载流程也可以像文件上传一样,但是过程要更加复杂。主要是Nginx服务器在接收到用户的下载请求后,需要先将文件从FastDFS下载到本地,然后再一点一点的往回传,编程上相较于上传时更加复杂。并且,由于Nginx服务器和storage节点往往部署在不同的主机上,文件需要进行跨机中转,消耗了更多时间,出错的风险也随之上升。 因此,需要对文件的下载操作进行优化。一个可行的办法是,在storage所在的服务器上安装FastDFS插件和Nginx,插件需要和Nginx进行交叉编译,成为Nginx的一部分。这样,客户端只需要先向服务器获取可用storage的信息,然后就可以直接向storage服务器上的Nginx发起下载请求,文件的传输过程也变得简单了许多,直接由服务器上的Nginx转发给用户,避免了跨机中转带来的弊端。 另外,为了进一步优化下载过程,在客户端和storage服务器上的Nginx之间,设置一个反向代理服务器。然后,所有的下载请求就可以向反向代理服务器发起,避免了客户端在下载之前需要获取storage IP的操作。同时,反向代理服务器还可以对同组中的节点实现负载均衡,这样在每次请求到来时,就能够在组中寻找较为空闲的storage响应下载请求。反向代理服务器的引入,不仅进一步简化了下载流程,还通过负载均衡充分利用了服务器资源,可谓一举两得。具体框架如下图2所示。 > 在这里,反向代理服务器的职责与tracker大致相同,两者的主要工作如下: > > (1)tracker是获取可用storage的信息并返回,具体过程为:tracker分析file_id获取group,而从group获取storage有两种方法:1)轮询方式,可以下载当前文件的任意一storage server;2)从源storage server下载。 > > (2)反向代理服务器是接收客户端的下载请求,然后转发给storage服务器上的nginx,具体过程为:反向代理服务器分析file_id获取group(这点和tracker一样),而从group获取storage时,tacker只有两种方法,nginx却可以通过负载均衡(常见的有6种不同的策略)将下载请求转发给较为空闲的storage,充分利用storage资源。 下载框架图

图5 对每个storage所在服务器上的Nginx进行反向代理

## 4. 项目部署_单机 ### 4.1 环境 - 操作系统 ubuntu 16.04 ```bash # uname -a 查看详细信息 $ uname -a # 输出:Linux ubuntu 4.15.0-142-generic #146~16.04.1-Ubuntu SMP Tue Apr 13 09:27:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux ``` - 安装相关库 ```bash 1) fastdfs-5.10(依赖:libfastcommon-1.36) 2) redis-4.0.8 3) mysql-5.7.33 4) nginx-1.10.1(依赖:openssl-1.0.1; pcre-8.40; zlib-1.2.11) 5) fcgi-2.4.1 & spawn-fcgi-1.6.4 & fastdfs-nginx-module_v1.16 ``` ### 4.2 编译运行 - 编译 ```bash # 打开文件夹 $ cd ~/distributed-shared-cloud-disk # 编译 $ make ``` - 修改配置文件 1)修改/conf/cfg.json中的IP和端口等信息; 2)修改FastDFS配置文件,保证已经可以正常使用; - 运行 启动进程之前,需要先关闭服务器的防火墙。 ```bash # 启动各项进程 $ ./start.sh ``` 进程启动

图6 进程启动过程

## 5. 项目部署_多机 多机部署的方式和单机部署类似,具体步骤为: (1)将图1的Nginx服务器与图2的Nginx反向代理服务器部署在一台性能较高的主机上(只需要装一个Nginx即可),然后将FastDFS的tracker也部署在这台主机上。 (2)将两个组中的4个storage分别部署在4台主机,每台主机上都需要部署Nginx。 (3)修改Nginx和FastDFS的相关配置文件,完成最终部署。