【云备份|| 日志 day5】文件热点管理模块

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【云备份|| 日志 day5】文件热点管理模块

image.png

云备份day5

热点管理模块

热点管理模块

服务器端的热点文件管理是对上传的非热点文件进行压缩存储,节省磁盘空间。

而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内,比如如果一个文件一天都没有被访问过我们就认为这是一个非热点文件,其实就是当前系统时间,与文件最后一次访问时间之间的时间差是否在一天之内的判断。

而我们需要对上传的文件每隔一段时间进行热点检测,相当于遍历上传文件的存储文件夹,找出所有的文件,然后通过对逐个文件进行时间差的判断,来逐个进行热点处理。

基于这个思想,我们需要将上传的文件存储位置与压缩后压缩文件的存储位置分开。这样在遍历上传文件夹的时候不至于将压缩过的文件又进行非热点处理了。

关键点:

1. 上传文件有自己的上传存储位置,非热点文件的压缩存储有自己的存储位置

2. 遍历上传存储位置文件夹,获取所有文件信息。

3. 获取每个文件最后一次访问时间,进而完成是否热点文件的判断。

4. 对非热点文件进行压缩存储,删除原来的未压缩文件

服务端热点管理模块实现-热点管理类的设计

//因为数据管理是要在多个模块中访问的,因此将其作为全局数据定义,在此处声明使用即可
extern DataManager *_data;
class HotManager{
private:
  std::string _back_dir;
  std::string _pack_dir;
  std::string _arc_suffix;
  std::string _url_prefix;
  time_t _hot_time;
public:
HotManager();
  bool HotJudge(const std::string &file);
  bool RunModule();
};


代码:

class HotManager{
    private:
      std::string _back_dir;
      std::string _pack_dir;
      std::string _pack_suffix;
      int _hot_time;
    private:
      //非热点文件-返回真;热点文件-返回假
      bool HotJudge(const std::string &filename){
        FileUtil fu(filename);
        time_t last_atime = fu.LastATime();
        time_t cur_time = time(NULL);
        if (cur_time - last_atime > _hot_time){
          return true;
        }
        return false;
      }
    public:
      HotManager() {
        Config *config = Config::GetInstance();
        _back_dir = config->GetBackDir();
        _pack_dir = config->GetPackDir();
        _pack_suffix = config->GetPackFileSuffix();
        _hot_time = config->GetHotTime();
        FileUtil tmp1(_back_dir);
        FileUtil tmp2(_pack_dir);
        tmp1.CreateDirectory();
        tmp2.CreateDirectory();
      }
      bool RunModule() {
        while(1){
          //1. 遍历备份目录,获取所有文件名
          FileUtil fu(_back_dir);
          std::vector<std::string> arry;
          fu.ScanDirectory(&arry);
          //2. 遍历判断文件是否是非热点文件
          for (auto &a : arry) {
            if (HotJudge(a) == false){
              continue;//热点文件则不需要特别处理
            }
            //3. 获取文件的备份信息
            BackupInfo bi;
            if (_data->GetOneByRealPath(a, &bi) == false){
              //现在有一个文件存在,但是没有备份信息
              bi.NewBackupInfo(a);//设置一个新的备份信息出来
            }
            //3. 对非热点文件进行压缩处理
            FileUtil tmp(a);
            tmp.Compress(bi.pack_path);
            //4. 删除源文件,修改备份信息
            tmp.Remove();
            bi.pack_flag = true;
            _data->Update(bi);
          }
          usleep(1000);//避免空目录循环遍历,消耗cpu资源过高
        }
        return true;
      }
  };


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
161 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
2月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
3月前
|
监控 Linux 应用服务中间件
系统监控:使用日志文件 journalctl的使用
本文介绍了如何使用`journalctl`命令来监控和查看Linux系统的日志文件,包括查看特定行数、过滤日志级别、实时跟踪日志、按时间段查询日志以及日志轮换和压缩的配置。
114 2
系统监控:使用日志文件 journalctl的使用
|
3月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
3月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
48 1
|
3月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
3月前
|
SQL 数据库
为什么SQL日志文件很大,该如何处理?
为什么SQL日志文件很大,该如何处理?
|
4月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子