题目重点:从上传会话和原子发布清单定义API,分离数据与元数据,核对分块重试、持久ACK与跨故障域恢复。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版对象由bucket/key定位,内容更新创建generation;支持大文件multipart和range download,不涉及跨对象事务。
- 成功ACK表示元数据及所引用块达到明确故障域持久条件;机房灾难是否要求零RPO需澄清。
- 小对象可单块,大对象分块尺寸是配置与实测取舍;不冒充题目规定某个固定MB。
解题路线
- API先列createUpload、putPart(uploadId,partNo,checksum)、completeUpload、abort、get/head及range。上传会话绑定对象目标与权限,分块可乱序重试;相同partNo重复提交需校验内容指纹,不能静默接受不一致字节。
- 数据块先暂存并验证checksum,complete核对分块清单、长度、权限与expected generation,再原子发布manifest。complete重试返回同generation;客户端断线后listParts续传,未完成上传可延后GC。
- 读先取已发布manifest,按range定位块并拼接,返回版本与完整性信息。缓存只引用不可变generation,避免同一次下载混新旧块;下载客户端校验与数据节点校验职责分开。
- 副本分布按节点、机架、AZ或机房定义;多份落同故障域不能证明容灾。比较复制与纠删码的读修复、空间和恢复带宽,决定何时ACK以及是否异步跨区复制。
- 机房故障先判定权威metadata、存活data和副本清单,再切路由与权限/epoch,后台重建冗余并限速。跨区异步副本允许非零RPO,向用户说明已确认写是否可能暂不可见/丢失,不能同时承诺最低延迟与无限容灾。
- 运营指标覆盖上传完成率、校验失败、孤儿块、manifest延迟、冗余健康及修复预计字节。保留恢复演练和删除/tombstone协议,使数据恢复不复活已删除对象。
手动走一遍
训练例三个part分别到达,part2 ACK丢失。客户端用同uploadId重发part2,服务器核指纹并返回原结果。complete成功但响应丢失,重试得到同generation。机房A失效时读取B/C中的块,metadata指向已发布版本;不足的冗余由后台重建,而非重新要求用户上传。
规模与取舍
对象S字节、块P字节约ceil(S/P)个part,传输O(S),manifest O(S/P)。复制k份写放大约k倍,纠删码另计编码/修复成本。训练容量例100次/秒、平均10MB写入约1GB/s,三副本约3GB/s载荷,题目未明确此参数。
易错点与追问
容易失分的边界
- 仅存数据副本没有metadata备份。
- complete只检查part数量,不检查编号/内容/总长度。
- ACK后manifest未落盘,恢复看不见对象。
- 把多节点复制当跨机房容灾。
- 失效切换没有防旧主重新发布。
继续深挖
- 客户端上传一年未complete,如何GC又支持恢复?
- 单个超大对象下载热点怎样分流?
- 跨区异步复制的RPO/RTO怎样验证?
- 对象覆盖和删除同一时间发生,哪一个generation可发布?
