实时备份系统:
项目简介
包括一个Windows下的客户端和Linux下的服务端,Windows下的客户端负责将需要上传的文件进行上传,然后Linux下的服务端接收上传的文件并且进行热点判断,将非热点的文件进行压缩存储,并且在浏览器端还包括了文件的查看和下载功能
项目描述
项目的简单描述:
1.在Windows下的客户端:
首先每次客户端启动的时候应该初始化加载原有的数据,然后在一个固定的目录中查找是否当前有需要备份的文件,查找的方法是根据文件的ETag信息(文件的etag信息在本项目中计算的就是文件的大小以及最后一次访问时间的集合),若etag信息与原来的etag信息不相等,就说明文件可能是刚刚经过修改或者是文件刚刚新建,这种文件就会被客户端根据httplib搭建HTTP客户端上传给服务端,并且每次上传之后,都更新客户端这边的文件存储信息。
2.在Linux下的服务端:
首先根据httplib搭建HTTP服务端,然后获取客户端的请求方法,若Windows下的客户端在上传文件,那么服务端收到的就是PUT请求方法,然后将上传的文件首先进行非热点判断,如果文件的最后一次访问时间与当前时间的差值小于5s,就将这个文件当做一个非热点文件,我们会将非热点文件首先压缩,然后删除它的源文件,然后将此时的所有文件都加入数据管理模块,放入数据库中进行持久化存储。
3.在浏览器的客户端:
在浏览器的客户端可以向服务端发出Get请求,并且搭配List和Download进行备份文件的查看和点击下载
项目设计
项目的模块设计:
Windows下的客户端:
1.数据管理模块:
客户端数据管理模块:
class DataManager
{
public:
DataManager(const std::string &filename):_stire_file(filename){}
bool Insert(const std::string &key,const std::string &val);//备份文件之后插入/更新数据信息
bool GetEtag(const std::string &key,std::string *val);//获取文件原有etag信息进行比对
bool InitLoad();//初始化加载
bool Storage();//每次更新数据之后持久化存储
private:
std::string m_Save_file;//持久化存储文件
std::unordered_map<std::string, std::string> m_SaveFile_list;//保存文件的信息和ETag信息
}
2.目录监控模块:
class DirListen
{
public:
bool Start();//程序的主控流程
bool GetList(std::vector<std::string> *list);//获取需要备份的文件列表
static bool GetNowETag(const std::string &filename,std::string *etag);//计算一个文件的etag信息
private:
std::string m_listen_dir;//检测的目录,每次都从这个目录里面的文件开始查找文件
std::string m_srv_ip;
uint16_t m_srv_port;
}
Linux下的服务端:
1.文件工具类:
包括对文件读取和写入
2.文件压缩模块:
class CompressUtil//压缩模块
{
public:
static bool Compress(const std::string& src,const std::string& dst);
static bool UnCompress(const std::string&src,const std::string& dst);
};
3.数据管理模块:
class DataManager
{
public:
//判断文件是否存在
bool Exists(const std::string &name);
//判断文件是否已经压缩
bool IsCompress(const std::string &name);
//获取未压缩文件列表
bool NonCompressList(std::vector<std::string> *list);
//插入/更新数据
bool Insert(const std::string &src,const std::string& dst);
//更新数据库
bool Update(const std::string &src,const std::string& dst);
//获取所有文件名称
bool GetAllName(std::vector<std::string> *list);
//获取当前的系统日期和时间
std::string GetTime();
//获取被压缩的文件
bool GetgzName(const std::string &src,std::string *dst);
private:
//std::string _back_file;//持久化数据存储文件名称
//std::unordered_map<std::string,std::string> _file_list;
MYSQL mysql;
pthread_rwlock_t _rwlock;
};
4.非热点压缩模块:
class NonHotCompress
{
public:
bool Start();//总体向外提供的功能接口,开始压缩模块
private:
//判断一个文件是否是一个热点文件
bool FileIsHot(const std::string &name);
private:
std::string _gz_dir;//压缩后文件的存储路径
std::string _bu_dir;//压缩前文件的所在路径
};
5.网络通信模块:
class Server
{
public:
bool Start();//启动网络通信模块接口
private:
static void Upload(const httplib::Request& req,httplib::Response& rsp);
static void List(const httplib::Request& req,httplib::Response& rsp);
static void Download(const httplib::Request& req,httplib::Response& rsp);
private:
std::string _file_dir;//文件上传备份路径
httplib::Server _server;
};
};
项目源码
实时备份系统
:
https://github.com/LJComeo/Real-time-backup-system