1 对象存储回答什么问题:海量非结构化与按对象读写
电商保存商品图片,手机应用接收用户照片,业务系统每天生成日志,备份服务保留历史副本。这些数据的共同点是:应用通常按完整资源上传和读取,不需要把它们组织成数据库表,也不要求把远端空间直接当成本地磁盘。对象存储提供按名称保存和获取数据的服务,适合图库、备份、日志归集与数据湖中的原始文件。它可以容纳大量资源,但容量扩展并不替应用决定权限、保留期限和访问成本。
对象可以理解为“数据 + 元数据 + 键”。数据是图片、压缩包或日志内容;元数据描述内容类型、缓存行为等属性;键是应用寻找对象的名称。例如键 products/2026/sku-318/main.webp 对应某张商品主图,元数据中的 Content-Type: image/webp 帮助浏览器解释响应。键本身不证明内容真实,后缀写成 .webp 的上传内容仍可能是其他格式,业务需要另行校验。
通过 HTTP 接口,应用用 PUT 上传指定键的对象,用 GET 读取对象,用 HEAD 获取属性,用 DELETE 请求删除。大对象还可能通过分片上传完成;分片是传输机制,不意味着应用获得了任意改写内部字节的磁盘接口。通常修改图片中的内容,需要生成新图片并上传整个对象,或者使用服务商提供的特定处理能力。GET 支持范围读取时可以只下载部分字节,但这仍不等于随机写入。
回看块存储,应用面对的是可寻址的数据块,文件系统或数据库能够在上面执行随机小 IO、更新页和维护事务日志。文件存储则提供共享的文件与目录接口,常见需求是多台机器通过文件协议访问同一份目录树,并依赖相应的文件操作语义。对象存储提供对象键和 HTTP 请求,不能直接承诺 POSIX 文件语义。选型应先看应用需要什么接口,再看容量与价格。
例如商品库有 500 万张图片,应用每次根据商品编号获取整张图,按对象访问很自然。数据库每秒修改大量 8 KB 页面,则更接近块存储的工作方式。多台计算节点需要共同打开目录中的文件、使用已有文件工具处理数据,则要评估文件存储。日志进入数据湖时,可以先按日期聚合成对象,计算引擎再批量读取;如果每条日志都单独上传,容量可能不大,请求次数和管理成本却会显著增加。

2 桶、对象、键与地域:命名空间怎么划
桶是对象的管理容器,常用于设置地域、访问策略、生命周期和日志记录等规则。应用定位对象时,需要知道服务入口、桶和键;开启版本控制后,还可能指定版本标识。桶名的唯一性范围与命名限制由厂商规定,有的要求在指定范围内全局唯一,有的采用账户或其他命名范围。不要把某家产品的规则推广到所有对象存储,也不要把桶名当成秘密保存。
键看起来像路径,但通常是字符串命名空间。products/318/main.webp 中的 / 常用作分隔符,控制台据此展示文件夹效果,并不必然存在可独立操作的真实目录。向空桶上传这个键,不需要先逐层创建目录。所谓列出某个“目录”,经常是按前缀筛选键,并通过分隔符分组;所谓移动目录,也可能实际执行大量复制和删除,需要核对产品能力与计费。
前缀设计应围绕实际访问和管理任务。商品图可以采用 products/{商品编号}/{内容版本}.webp,上传暂存区采用 incoming/{用户编号}/{随机标识},日志采用 logs/{日期}/{业务}/...。这样能让应用直接构造键,也便于限定授权范围和生命周期。若后台每次找图片都先遍历整个桶,即使键名整齐,也没有真正建立高效索引;商品编号到图片键的映射通常应保存在业务数据库中。
同一个业务是否拆成多个桶,取决于规则边界。生产与测试需要不同权限和账单归属,可以分桶;同一生产环境中的不同商品可以通过前缀管理。若归档规则、合规要求或管理责任完全不同,强行塞入同一个桶会使策略难以审核。反过来,为每个用户创建桶也可能遇到配额和运维问题。桶负责较粗的治理边界,键和业务索引负责更细的资源组织。
地域决定数据存放位置及访问路径,会影响延迟、出流量、可用产品能力和合规。假设上传服务和数据库在地域 A,桶在地域 B,每次校验图片都需要跨地域访问,链路延迟与传输费用就可能进入关键路径。跨区副本也不会自动改变客户端访问入口;应用仍需明确读哪个地域、失败时如何切换。正式选型应把用户位置、计算位置、允许的数据地域与灾备目标放在同一张设计表中。
3 一致性与覆盖写入:读到的是哪一版
一致性回答的是:写入已成功后,后续读取、列举或覆盖操作能够观察到什么。不同厂商、不同产品时期和不同接口的保证可能不同。教学中常用“最终一致”描述某些更新需要传播后才能被所有相关读取观察到,用“强一致读取”描述成功写入后,后续相应读取可观察到该更新。不能因为对象存储是分布式服务,就断言它一定最终一致,也不能把某个接口的保证扩展到所有缓存与复制链路。
查产品文档时,应分别核对新建对象、覆盖同名对象、删除、HEAD、GET 和 LIST 的保证,以及保证的地域范围。部分主流服务目前对对象读写与列表提供强一致性,但跨地域复制和 CDN 缓存通常有独立语义。应用观察到旧图片,可能是边缘节点仍缓存旧响应,不能立即归因于存储端读取滞后。确认读取入口是排查一致性的起点。
可以设计可验证的检查:在测试桶中上传内容 A,等待 PUT 返回成功;绕过 CDN,向同一地域源站 GET 并校验内容摘要;覆盖为内容 B,再执行 HEAD、GET 和带限定前缀的 LIST,记录状态、时间、版本标识和请求 ID。随后删除并再次检查。测试结果只说明这些请求在该环境中的观察,正式依赖仍应来自当前产品文档与服务承诺,有限次数的成功不能证明所有并发情况。
即使源站提供强一致性,2 个写入者同时覆盖同一个键,仍可能出现业务层面的丢失更新。例如运营人员甲和乙都基于旧图修改,甲先上传,乙后上传,最终名称只指向乙的内容。强一致性帮助读取确定当前结果,却不会替业务合并图片。可使用唯一内容键,把“当前主图”的指针更新放入业务数据库事务;若使用条件写入,则应核对服务支持的条件与冲突返回方式。
版本控制让同一键的多次写入保留为可区分的版本,便于找回误覆盖内容,但旧版本也占用存储。删除当前对象时,开启版本控制的产品可能创建删除标记,旧版本并未立即消失;清理历史数据需要配置适合非当前版本的规则。版本控制、跨区复制和备份分别处理不同风险,不能互相替代。验收时应真实演练覆盖后恢复,并检查旧版本的权限和生命周期。
4 访问控制:桶策略、ACL、预签名 URL
对象能被谁读写,应从默认私有和最小权限开始设计。权限判断涉及主体、动作、资源与条件:哪个服务身份,可以对哪个桶的哪些键执行 GET 或 PUT,是否要求使用指定网络、加密方式或其他约束。桶策略通常用于表达资源侧规则,身份策略用于限定调用身份的能力;ACL 是另一类授权机制,其支持情况及与策略的关系因产品而异。有的环境会关闭 ACL,应按实际授权模型配置。
不要靠“上传者是谁”推断“所有人都能下载”。写权限和读权限是不同动作,列桶与读对象也可能分别授权。某些授权体系中显式拒绝会覆盖允许,还可能受组织规则、网络入口策略等约束。因此排查时既要找允许,也要找拒绝,并确认策略中的资源范围是否匹配目标键。权限模拟可以帮助定位,但应核对模拟器覆盖哪些策略层,最终仍需用真实身份验证。
浏览器直接上传时,常见做法是由后端验证用户身份和业务额度,再为指定对象生成短时有效的预签名 URL。浏览器使用这个 URL 向对象存储发送约定请求,无须获得永久访问密钥。预签名把签名者已有的相关能力临时委托给持有链接的人,不能凭空增加签名者权限;链接泄露时,在有效条件范围内也可能被其他人使用,因此不应进入公开日志或页面分析参数。
假设用户要上传头像,后端选择 incoming/u-42/随机值,限定 PUT 方法,设置 10 分钟有效期,并根据产品能力约束内容类型等字段。客户端必须按签名约定发送请求,改用 GET、改变已签名的请求头或改写查询参数都可能失败。上传大小、真实文件类型、恶意内容与用户配额仍需业务校验;不能假定普通预签名 PUT 在所有产品中都能直接强制限制大小。
永久 AK 和对应秘密不得写进前端代码、移动端安装包或公开仓库。需要更复杂的客户端权限时,可评估短期凭证,但其范围与有效期同样要限制。公共读必须有明确理由,例如已发布的公共商品图;即便如此,也优先把私有源站通过受控 CDN 身份提供访问,并按业务需要限制边缘访问。静态公开页面不等于整个桶都应公开,用户原图、草稿与审核失败文件应有独立边界。

5 存储类别与生命周期:热冷归档怎么搬
存储类别把数据访问频率与成本结构联系起来。标准类通常适合频繁访问和要求直接读取的数据;低频类往往降低容量单价,同时增加取回费用、最短计费保留期限或其他约束;归档类适合长期保留且很少访问的数据,但部分归档类别需要先恢复,取回可能等待较长时间。具体类别、恢复速度与计费方式随产品变化,不能只看容量单价就判断最便宜。
生命周期规则根据对象年龄、前缀、标签等条件自动迁移或清理数据。可以为备份示例设置:创建后 30 天转入低频,180 天转入归档,保留到业务批准的期限后删除。这是教学规则,不能直接套到商品在售图片上;在售 1 年的主图仍可能每天被大量访问。若规则按创建年龄执行,持续被访问也未必阻止迁移,是否有按最近访问时间处理的能力需另查文档。
假设每天产生 100 GB 备份,保留 365 天,粗略稳定状态下,最近 30 天约 3 TB 处于标准类,接下来的 150 天约 15 TB 处于低频,剩余 185 天约 18.5 TB 处于归档。这里只按每日新增量相乘,不包含版本、压缩、删除延迟及实际月份差异。这个计算先把容量按年龄拆开,再分别乘单价,比把全部 36.5 TB 都按归档价估算更接近规则实际效果。
恢复需求可能改变选择。如果业务要求误删后 5 分钟内恢复,而所选归档恢复需要数小时,就算长期容量费很低也不满足目标。恢复还可能产生数据取回费、请求费和临时恢复副本的容量费;恢复出来后下载到外部,又可能另计出流量。应把“从申请恢复到业务重新可用”的完整耗时纳入演练,并使用有代表性的恢复批量测试吞吐。
删除也有细节:对象进入某类别后很快删除或转出,可能仍要支付最短保留期限对应费用。未完成分片、历史版本和删除标记可能需要专门规则处理,不能假设当前对象过期就清空所有账单。上线生命周期前,可先限定测试前缀,确认匹配对象与迁移结果,再扩大范围;保留要求和法律冻结存在时,应核对是否允许删除,避免规则与治理目标冲突。

6 成本驱动:存储量、请求次数、出流量
对象存储账单至少要分开看容量、请求与传输。容量通常按实际占用和存放时间计量;请求按操作类型及次数计价;出流量受目的地、地域和访问路径影响。还可能有数据取回、生命周期转换、复制、日志、加速等费用。小文件业务容易低估请求次数,图片与视频业务容易低估出流量,备份业务则容易漏掉旧版本与恢复成本。
下面全部使用教学假单价,单位为人民币,不代表任何厂商报价,也不包含税费、优惠或免费额度。为便于心算,约定 1 TB = 1000 GB。标准容量单价设为 0.12 元/GB·月,GET 请求设为每 1 万次 0.01 元,外网下行设为 0.50 元/GB。假定整月平均存储量为 10 TB,月 GET 为 2×10^7 次,外网下载为 2 TB,且这些数据适用上述单价。
容量费是 10000 × 0.12 = 1200 元。请求费是 20000000 ÷ 10000 × 0.01 = 20 元。出流量费是 2000 × 0.50 = 1000 元。已列项目合计 1200 + 20 + 1000 = 2220 元/月。这里假定平均容量保持 10 TB,若月中才上传全部数据,实际应按产品计量周期折算;PUT、LIST、复制和恢复均未纳入,不能把 2220 元当作最终采购预算。
这个例子中,GET 数量很大,但请求费只占约 0.9%;出流量占约 45.0%,已经接近容量费。若出网增长到 6 TB,其余不变,出流量费成为 3000 元,合计 4220 元。若仅把 GET 从 2000 万次翻倍到 4000 万次,合计为 2240 元。优化重点应由账单结构决定,不能看到请求数量大就认定请求费是主因。
也不能由此得出“请求总是不贵”。设某应用只有少量容量,却反复用 LIST 扫描数百万个键,或者产生海量极小对象,按不同操作单价计费后,请求可能成为主要支出。LIST 分页意味着扫描全部对象需要多次请求,应用任务每次重扫都会重复消耗。应按操作分别统计数量、重试率与单位业务消耗,再用真实地区和类别的价格替换教学参数。
CDN 可以减少源站访问与回源流量,但 CDN 自身也计费,边缘向用户传输的字节不会凭空消失。评估时应同时列出缓存命中率、回源字节、边缘出流量和请求费,避免只看到对象存储账单下降就宣布总成本下降。压缩图片、提供合理分辨率与正确缓存策略,往往能同时降低用户等待时间和整体传输量。

7 常见坑:把对象存储当块盘、公钥桶、忽略跨区复制成本
对象存储不能直接 format 成磁盘。某些工具能把桶挂载成目录,方便已有程序接入,但文件接口是适配出来的,重命名、锁、追加和随机写等行为可能与本地文件系统不同。把数据库数据目录放上去之前,必须有明确的兼容性依据;不能因为能执行 ls 或保存文件,就推断适合事务数据库。需要随机小 IO 时,应回到块存储等满足接口要求的方案。
另一个坑是把目录外观当成免费索引。假设有 100 万个对象,某接口每页最多返回 1000 项,完整扫描至少需要 1000 次 LIST。若后台每分钟扫描 1 次,按 30 天算便是至少 4320 万次 LIST,尚未计算重试与额外前缀查询。分页上限应以实际接口为准,但计算方法可迁移:总项数除以每页数量,再乘扫描频率。让业务直接读取已知键,比不断遍历更可控。
“公钥桶”不是这里准确的权限术语,通常实际想说的是公共访问桶;它与公钥加密不是同一概念。把整个桶改为公共读,可能同时暴露用户原图、待审图片和历史资源。把全站公开当作修复 403 的快捷方式,会绕过原本的身份边界。应确认公开对象的业务范围,并分别验证匿名访问应该成功和应该失败的样本,公开写入尤其不能随意启用。
跨区复制也不是勾选后就没有后续工作。除了目标区域的副本容量,还要核对复制请求、跨区流量、加密密钥调用以及历史对象补复制等计费。版本与删除是否复制、复制延迟如何观察、失败如何告警,都要明确。假设每天新增 100 GB,单月新增数据约 3 TB,源与目标各保存 1 份时,新增占用就涉及约 6 TB,传输费用则要按实际复制链路另算。
复制提供副本,不自动提供应用切换能力。如果应用配置仍指向源地域,目标有完整数据也无法直接改善该请求的延迟。复制还可能传播误覆盖或删除,具体行为依规则而定;灾备设计需要版本、保留与切换演练配合。账单上应给复制相关资源统一标记,才能区分业务下载、灾备传输和运维误操作造成的流量。
8 案例:静态站点与用户上传图片
某商店使用静态页面展示商品,用户登录后可上传评价图片。页面构建产物和已发布商品图适合通过 CDN 分发,上传原图则需要审核。设计可以使用商品图桶管理发布资源,另用私有桶或明确隔离的前缀保存暂存内容。静态站点托管、HTTPS 和私有回源是否能组合使用,要查具体产品;不能把某种网站入口天然视为支持所有鉴权方式。
上传流程从业务后端开始。后端校验用户身份、商品归属、频率与配额,生成不可猜测且不会覆盖他人内容的键,然后返回短时预签名 PUT URL。浏览器直传后,把对象标识提交给后端。后端确认对象存在,核验大小、类型和内容安全,生成缩略图,记录业务状态。只有通过审核的图片才进入发布映射;上传成功只是文件到达,不代表可以公开展示。
前端显示图片时,从业务接口取得发布后的资源地址。CDN 用受限身份向私有源站读取允许的前缀;若图片本身也要求登录后可见,则边缘访问还需独立鉴权,私有源站只限制回源,并不自动限制终端用户。对可公开商品图使用带内容版本的键,例如 published/sku-318/摘要.webp,有助于设置较长缓存;替换图片时更新业务指针,减少同名缓存失效的不确定性。
若浏览器上传被拦截,还应检查跨域资源共享配置。CORS 决定浏览器是否允许页面使用跨域响应,不等于授予对象访问权限;允许某站点发起 PUT,仍需要有效签名与授权。配置时限定需要的来源、方法与请求头,并通过浏览器实际预检验证。命令行上传成功而网页失败,是检查浏览器跨域链路的线索,不能据此直接放宽桶权限。
验收要覆盖边界:默认私有下,匿名直接读取原图应失败;上传身份只能写入后端指定的暂存范围,不能覆盖已发布商品图;CDN 能读取发布前缀,却不能读取待审内容。生命周期应先验证暂存文件清理、历史版本处理及发布资源保留规则。最后抽取 1 天账单,对照上传数、GET 数、CDN 命中率、回源与用户下载字节,解释主要费用,并据实际波动设置告警。
9 排查案例:上传成功但下载 403/慢/费
工单描述:“用户上午上传成功,下午打开图片报 403;有的图片能打开,但很慢,月底流量费也上涨。”先固定一个失败样本:完整对象键、请求方法、入口域名、请求时间与时区、响应错误码、请求 ID、相关身份和版本标识。分享记录时遮蔽签名与凭证。不要立即重传或改桶公开,否则可能覆盖证据,还会把权限问题与内容问题混在一起。
路径 A 查身份与策略。上传使用的预签名 URL 只授权 PUT,复制它当下载链接执行 GET,本来就可能失败;后端应为需要的读取方式另行授权。确认实际访问身份是否有目标对象的读权限,资源是否漏了前缀,桶策略、身份策略和其他限制中是否存在拒绝。用权限模拟定位候选原因,再以同一身份、同一键向源站发起最小 GET,并关联请求 ID;若经 CDN 才失败,还需检查回源身份与边缘规则。
路径 B 查时间与签名。假设链接 09:00 签发、有效期 10 分钟,09:20 下载失败符合预期;若签名依赖的临时凭证更早到期,链接也可能提前失效。检查签发机器时钟、服务记录时间、URL 是否完整,以及代理是否改动签名字段或编码。修复后生成新链接复测,不要通过无限延长有效期掩盖时钟问题。已经泄露的链接能否提前失效,取决于产品机制,应按可用控制处置。
路径 C 查桶加密与 KMS。写入和读取可能使用不同身份,读取者即使有对象 GET 权限,也可能缺少解密所需的密钥权限。核对对象实际采用的密钥、调用身份、密钥策略与密钥状态,并查对应审计事件。这里不应通过关闭加密来验证业务能否长期运行,而应修复必要的解密授权,再确认没有扩大到无关密钥。某些服务会隐藏细节,403 本身不足以单独证明 KMS 是原因。
权限恢复后,分别测源站和 CDN 的首字节时间、总耗时、响应大小与缓存命中信息。若应用在地域 A、桶在地域 B,跨区拉取可能解释源站慢与传输费;若图片都是首次访问或缓存键被无意义参数拆散,CDN 命中率也会偏低。对大量小文件,查看是否在下载前先扫描整个桶。请求次数上涨而下载字节不涨,常提示 LIST、重试或轮询需要检查。
费用结论必须落到账单行:按地域、操作、存储类别和传输方向拆分,再与访问日志和监控中的同一时间段对应。比如外网下载从 2 TB 升至 6 TB,要解释新增的 4 TB 来自访问量、图片变大、盗链还是缓存变化,而非只说“流量涨了”。修复验收包括有效用户读取成功、越权用户仍被拒绝、延迟回落、对应费用驱动量下降;账单有延迟时先看用量,再等账期确认金额。

放进方案里
方案先写访问语义:数据库随机更新页时考虑块存储;多台主机共享目录、依赖文件协议时考虑文件存储;图片、备份和日志按完整资源上传下载时考虑对象存储。随后说明对象存储承载哪些数据,哪些留在数据库或其他存储中。把桶、地域、前缀、对象键生成规则和业务索引列清楚,让读写路径能够从用户请求追踪到具体对象。
安全默认私有。记录后端、上传客户端、处理任务和 CDN 各自能执行的动作及资源范围;公共资源必须说明公开理由,并与用户原图隔离。预签名交接应明确签发接口、用户校验、键的归属、HTTP 方法、有效期、必要请求头及失败后重新申请方式。客户端不得持有永久秘密,上传完成后还要经过服务端确认与内容校验,才能进入可展示状态。
生命周期表应写明标准、低频、归档的适用对象和迁移条件,单独覆盖历史版本及未完成分片。把恢复时限、取回费用、最短保留期限和删除责任人写进评审项,并给出可执行的恢复演练。需要跨区复制时,同时交代目标地域、复制范围、延迟监控、失败告警与应用切换步骤,使数据副本与业务恢复目标对应。
成本看板至少呈现平均容量、分类请求、外网及跨区字节、CDN 回源、旧版本占用和归档取回量。估算中列出单位、单价来源与假设,用 10 TB、2000 万次 GET、2 TB 出网的分项方法替换成实际负载,并预留增长场景。上线验收抽查私有访问、前缀越权、链接过期、生命周期及账单样本,保存请求 ID 和处理记录,使后续故障能沿原设计追查。
10 小结:走向文件存储(C8)与 CDN 衔接
对象存储把资源组织为桶中的对象,以键定位,通过 HTTP 接口访问。使用时要同时确定命名、版本、权限、存储类别和访问路径;容量、请求与传输共同决定成本。可以用本课案例自查:为什么 PUT 成功不代表 GET 有权?为什么降低容量单价可能增加恢复成本?为什么加了 CDN 仍要检查总账单?
下一课 C8 文件存储将讨论共享目录与文件协议,帮助判断应用是否需要文件操作语义。CDN 则衔接对象的分发路径,改善用户访问体验;它的缓存、鉴权与计费仍需要单独设计。