数据生命周期管理

凌晨两点的告警短信

那是”光影”上线第 3 个月的一个凌晨,手机疯狂震动:

Inbox
From: 阿里云监控
To:
Time: 凌晨 02:15
Subject: [告警] OSS 存储容量超过阈值
  • 当前容量:1.89 TB / 告警阈值:1.50 TB
  • 增长率:+12 GB/天
  • 预计 30 天后达到 2.25 TB
  • 请及时处理!

12 GB/天?我仔细查了一下,发现存储增长的主要来源并不是用户上传的新图片——而是垃圾文件

87% 的存储增长是垃圾文件。 这不是存储的问题,是管理的问题。

我需要一套完整的生命周期管理机制。

生命周期管理的全景图

一个图片从诞生到消亡,应该经历这样的生命周期:

                     ┌──────────────┐
                     │   用户上传    │
                     └──────┬───────┘

                     ┌──────▼───────┐
                     │   临时存储    │ ← 分片上传的临时空间
                     │   (temp/)    │
                     └──────┬───────┘
                            │ 上传完成
                     ┌──────▼───────┐
                     │   内容审核    │ ← 鉴黄、OCR、版权
                     └──────┬───────┘
                            │ 审核通过
                 ┌──────────▼──────────┐
                 │   标准存储(热)     │ ← 新图片,频繁访问
                 │   originals/        │
                 │   thumbs/           │
                 └──────────┬──────────┘
                            │ 30 天无人访问
                 ┌──────────▼──────────┐
                 │   低频存储(温)     │ ← 偶尔有人翻看
                 │   originals/        │
                 └──────────┬──────────┘
                            │ 90 天无人访问
                 ┌──────────▼──────────┐
                 │   归档存储(冷)     │ ← 几乎没人看
                 │   originals/        │
                 └──────────┬──────────┘
                            │ 2 年以上无人访问
                 ┌──────────▼──────────┐
                 │      删除           │ ← 释放存储空间
                 └────────────────────┘

     临时文件的生命周期(独立路径):
     ┌──────────┐     7 天
     │ temp/    │ ──────────→ 删除
     └──────────┘

     缩略图的生命周期:
     ┌──────────┐     随原图删除
     │ thumbs/  │ ──────────→ 一起删除
     └──────────┘

生命周期规则配置

OSS 原生生命周期规则

阿里云 OSS 提供了内置的生命周期管理功能,可以在控制台或通过 SDK 配置:

应用层生命周期管理

OSS 原生规则只管存储层,但有些逻辑需要在应用层处理:

TypeScript 版本:面向前端的过期文件检测

前端也需要感知图片的生命周期状态,特别是对于过期/归档的图片:

存储空间监控和告警

生命周期管理的最后一环是监控。你无法管理你看不见的东西:

实施效果

生命周期管理上线后,我把配置写入代码仓库,用 Terraform 管理: