数据职责与对象生命周期

数据职责

Cloud Blox 将业务事实、短期协调、分析数据和文件内容分别存放,避免所有负载集中在同一数据设施。

MySQL:业务事实

MySQL 保存需要事务和长期一致性的内容,包括:

  • 用户、角色、菜单和设备会话;
  • 存储桶、对象、通道、区域和访问配置;
  • 异步任务及其执行状态;
  • 分片上传会话和客户端幂等操作;
  • 回收站、对象变更和同步游标;
  • 套餐、资源包、余额、账单和计量快照;
  • 通知、支付、备份和计划任务记录。

涉及对象与任务、账单与扣费、客户端操作与修订号的关键变更,以 MySQL 中的持久状态作为恢复依据。

Redis:队列与协调

Redis 负责短期、可重建或高并发的状态:

  • 异步任务传递;
  • 分布式任务锁和租约;
  • Token 失效与短期安全状态;
  • 元数据和文件缓存索引;
  • 跨节点缓存失效通知;
  • 区域队列和节点标识。

Redis 不是对象或账单的最终事实来源。任务传递中断后,应能够从 MySQL 中的持久状态继续补偿。

ClickHouse:日志与分析

ClickHouse 保存高吞吐、以查询分析为主的数据:

  • 存储桶访问日志;
  • 存储通道和副本操作日志;
  • 计费事件;
  • 节点 CPU、内存、磁盘、负载和网络历史指标。

ClickHouse 故障时,基础对象服务可以降级,但日志查询、历史监控和计量完整性需要单独告警。

文件内容

文件内容可能位于:

  • 异步上传临时目录;
  • 本地存储通道;
  • 外部存储通道;
  • 主通道访问缓存;
  • 媒体处理结果缓存;
  • 回源缓存;
  • 副本通道;
  • 桌面客户端本地目录或离线沙箱。

上传生命周期

sequenceDiagram
    participant Client as 浏览器 / S3 / WebDAV / 桌面客户端
    participant App as Cloud Blox
    participant DB as MySQL
    participant Queue as Redis 队列
    participant Worker as 异步任务消费者
    participant Store as 存储通道

    Client->>App: 上传文件或分片
    App->>App: 权限、大小、类型与区域校验
    App->>App: 写入本地临时文件
    App->>DB: 保存待完成对象与任务意图
    App->>Queue: 投递上传或审核任务
    App-->>Client: 返回已接收
    Queue->>Worker: 消费任务
    Worker->>Store: 流式上传到目标通道
    Worker->>DB: 更新物理引用与对象状态
    Worker->>App: 触发缓存失效、日志与计量

上传入口

  • 管理控制台使用秒传检查和 TUS 断点续传。
  • S3 支持标准对象上传和分片上传。
  • WebDAV 将写入请求接入统一上传流程。
  • 桌面客户端使用持久化分片会话和稳定操作标识。

可靠接收

请求首先落到本地临时目录。对象元数据和待执行任务在业务数据库中形成可恢复的上传意图,随后再投递到任务队列。即使即时投递失败,后台扫描也可以继续补偿。

内容审核

启用内容审核时,文件先进入审核任务。相同内容可复用已有审核结论;确认违规的内容被拦截,通过后再进入最终存储通道。

最终存储

异步消费者根据存储桶、区域、通道状态和重试记录选择目标通道。上传成功后,对象从等待状态转为可用状态,并建立对象与物理文件之间的引用关系。

读取生命周期

资源读取会根据请求入口、区域、缓存和存储状态选择来源:

  1. 完成协议鉴权、存储桶权限、防盗链和欠费检查。
  2. 若存储桶位于其他区域,优先使用代理缓存或转发到目标区域。
  3. 对正在异步上传的对象,允许从临时文件提供读取。
  4. 尝试主通道访问缓存。
  5. 从在线主通道读取。
  6. 主通道不可用时尝试副本。
  7. 数据库中不存在对象时,根据规则尝试回源并缓存。
  8. 带媒体参数的请求生成处理结果,并使用独立媒体缓存。
  9. 写入访问日志、通道日志和计量事件。

S3 的对象读取可以复用资源访问能力,因此缓存、媒体处理和来源降级语义保持一致。

删除与回收站

软删除

管理端常规删除将文件移入回收站,不立即删除物理内容。用户可在保留期内恢复对象和必要的父目录。

永久删除

永久删除或 S3 删除会形成持久的物理清理任务:

  1. 阻止对象继续正常访问;
  2. 取消与该对象冲突的待执行任务;
  3. 清理本地与跨节点缓存;
  4. 递减物理文件引用;
  5. 仅在没有其他对象引用时删除主通道物理文件;
  6. 清理关联副本和备份记录;
  7. 保存执行结果,支持失败重试。

引用计数使秒传、复制和覆盖场景可以共享同一物理内容,避免提前删除仍被其他对象使用的文件。

覆盖、复制与移动

  • 覆盖上传:新对象替换原路径,旧物理引用通过可靠删除任务回收。
  • 秒传:内容哈希命中已有物理文件时只增加引用,不重复上传内容。
  • 复制:相同物理内容可复用引用;跨通道时需要实际复制数据。
  • 移动或重命名:优先修改对象路径和修订信息,不无故搬运物理内容。

桌面同步数据流

桌面同步同时维护服务端和本地状态:

  • 服务端为对象变更分配单调修订号,并保存删除墓碑;
  • 客户端按游标拉取增量变化;
  • 客户端本地数据库保存文件快照、同步游标、传输任务和冲突;
  • 每次写操作携带稳定操作标识,网络重试不会重复产生副作用;
  • 写操作携带基础修订号,远端已变化时返回冲突;
  • 本地和远端同时修改时进入冲突中心,由用户选择保留策略。

桌面端上传和下载均由原生层流式处理,文件内容不经过 WebView 消息通道。

计量与账单数据流

计费能力受发行版控制。启用后,数据流为:

flowchart LR
    Request[上传 / 下载 / 请求 / 处理 / 审核] --> Outbox[可靠计费事件]
    Outbox --> CH[(ClickHouse 事件)]
    CH --> Snapshot[小时用量快照]
    Metadata[(MySQL 容量元数据)] --> Snapshot
    Snapshot --> Settlement[日结算]
    Plan[套餐与阶梯价格] --> Settlement
    Pack[资源包] --> Settlement
    Settlement --> Bill[账单]
    Settlement --> Wallet[余额与流水]

当前计量维度包括:

  • 容量;
  • 上传流量;
  • 出口流量;
  • 回源流量;
  • 请求次数;
  • 图片、视频和音频处理;
  • 图片审核;
  • 视频审核时长;
  • 音频审核时长。

计费事件先写入可靠事件区,再投递到 ClickHouse。小时快照只使用完整小时,日结算只使用完整快照运行;结算、资源包抵扣、账单、余额和流水需要保持事务一致。

一致性模型

  • 用户、对象、任务、账单和客户端修订以 MySQL 为强一致边界。
  • MySQL 与 Redis、ClickHouse、存储通道之间采用可恢复的最终一致性。
  • 缓存和分析数据允许短暂滞后,但不得反向覆盖业务事实。
  • 所有跨系统链路都需要可观测的积压、重试和恢复状态。

异步恢复机制详见异步任务与可靠性,备份与恢复要求详见部署与运维架构。