数据职责与对象生命周期
数据职责
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 将写入请求接入统一上传流程。
- 桌面客户端使用持久化分片会话和稳定操作标识。
可靠接收
请求首先落到本地临时目录。对象元数据和待执行任务在业务数据库中形成可恢复的上传意图,随后再投递到任务队列。即使即时投递失败,后台扫描也可以继续补偿。
内容审核
启用内容审核时,文件先进入审核任务。相同内容可复用已有审核结论;确认违规的内容被拦截,通过后再进入最终存储通道。
最终存储
异步消费者根据存储桶、区域、通道状态和重试记录选择目标通道。上传成功后,对象从等待状态转为可用状态,并建立对象与物理文件之间的引用关系。
读取生命周期
资源读取会根据请求入口、区域、缓存和存储状态选择来源:
- 完成协议鉴权、存储桶权限、防盗链和欠费检查。
- 若存储桶位于其他区域,优先使用代理缓存或转发到目标区域。
- 对正在异步上传的对象,允许从临时文件提供读取。
- 尝试主通道访问缓存。
- 从在线主通道读取。
- 主通道不可用时尝试副本。
- 数据库中不存在对象时,根据规则尝试回源并缓存。
- 带媒体参数的请求生成处理结果,并使用独立媒体缓存。
- 写入访问日志、通道日志和计量事件。
S3 的对象读取可以复用资源访问能力,因此缓存、媒体处理和来源降级语义保持一致。
删除与回收站
软删除
管理端常规删除将文件移入回收站,不立即删除物理内容。用户可在保留期内恢复对象和必要的父目录。
永久删除
永久删除或 S3 删除会形成持久的物理清理任务:
- 阻止对象继续正常访问;
- 取消与该对象冲突的待执行任务;
- 清理本地与跨节点缓存;
- 递减物理文件引用;
- 仅在没有其他对象引用时删除主通道物理文件;
- 清理关联副本和备份记录;
- 保存执行结果,支持失败重试。
引用计数使秒传、复制和覆盖场景可以共享同一物理内容,避免提前删除仍被其他对象使用的文件。
覆盖、复制与移动
- 覆盖上传:新对象替换原路径,旧物理引用通过可靠删除任务回收。
- 秒传:内容哈希命中已有物理文件时只增加引用,不重复上传内容。
- 复制:相同物理内容可复用引用;跨通道时需要实际复制数据。
- 移动或重命名:优先修改对象路径和修订信息,不无故搬运物理内容。
桌面同步数据流
桌面同步同时维护服务端和本地状态:
- 服务端为对象变更分配单调修订号,并保存删除墓碑;
- 客户端按游标拉取增量变化;
- 客户端本地数据库保存文件快照、同步游标、传输任务和冲突;
- 每次写操作携带稳定操作标识,网络重试不会重复产生副作用;
- 写操作携带基础修订号,远端已变化时返回冲突;
- 本地和远端同时修改时进入冲突中心,由用户选择保留策略。
桌面端上传和下载均由原生层流式处理,文件内容不经过 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、存储通道之间采用可恢复的最终一致性。
- 缓存和分析数据允许短暂滞后,但不得反向覆盖业务事实。
- 所有跨系统链路都需要可观测的积压、重试和恢复状态。