【云备份|| 日志 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日志并进行多维度分析。
相关文章
|
9天前
|
监控 Java API
如何将不同业务模块产生的日志 分多文件记录
如何将不同业务模块产生的日志 分多文件记录
10 0
|
1天前
|
Ubuntu Java Linux
查看Linux系统中日志文件
查看Linux系统中日志文件
|
1天前
|
存储 监控 应用服务中间件
查看nginx日志文件
器性能和提高网站可用性。掌握日志文件的路径、查看方法和基本分析技能对于任何服务器管理员来说都是必备技能。
7 1
|
2天前
|
SQL Oracle NoSQL
实时计算 Flink版操作报错合集之报错“找不到对应的归档日志文件”,怎么处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7天前
|
存储 监控 Java
|
12天前
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
|
6天前
|
应用服务中间件 Linux nginx
Nginx log 日志文件较大,按日期生成 实现日志的切割
Nginx log 日志文件较大,按日期生成 实现日志的切割
28 0
|
6天前
|
C#
C# 写日志文件
C# 写日志文件
12 0
|
8天前
|
关系型数据库 MySQL Linux
Linux——日志文件按天切割
Linux——日志文件按天切割
24 0
|
12天前
|
JSON 安全 Go
[golang]使用logrus自定义日志模块
[golang]使用logrus自定义日志模块

热门文章

最新文章