用过网盘的人都会觉得对象存储「好像就是个大网盘」,于是照着文件夹的思路去建目录、去套层级,结果发现桶里永远是平的一片;再往下就会遇到几个绕不开的问题:桶名为什么不能改、同名文件上传后旧内容去哪了、桶里的图片怎么被别人网站直接盗用。这篇从桶与对象的最基本结构讲起,把四种存储类别、多版本控制、跨域复制、服务端加密、防盗链和权限分层一条条落地,最后用控制台完整走一遍建桶、上传、分享、删除和查看历史版本,再用 AK/SK 登录客户端。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 对象存储 OBS 的桶与对象结构、四种存储类别、多版本控制与跨域复制、加密/防盗链/权限与 AK/SK 客户端 |
| 所属类别 | 云计算 → 华为云 → 存储类服务(对象存储) |
| 知识关键字 | OBS·Bucket·Object·Key·存储类别·多版本控制·跨域复制·SSE·防盗链·AK/SK |
一、对象存储和文件存储的根本差别:没有目录树
文件存储(NAS)里,数据是按「目录 → 子目录 → 文件」的树形结构组织的,路径就是层层索引。对象存储把这一层直接砍掉了:桶(Bucket)里直接放对象(Object),所有对象都在同一个逻辑层级,扁平化存放。
所以有个现象一定要先接受:对象的 Key 里带/,看起来像目录,其实只是名字的一部分。image/logo.png的 Key 就是这串字,OBS 不会真的建出一个image文件夹。控制台里看到的「文件夹」是按 Key 前缀模拟出来的视图。
好处是结构简单、容量能无限扩;代价是没有真正的目录语义——改名、移动这类操作在对象存储上往往等同于「复制一份再删掉原来那份」。
二、桶与对象:一个对象由三部分组成
桶(Bucket)是 OBS 中存储对象的容器。它有三个硬规矩:
- 名称全局唯一:所有账号共用一套命名空间,重名直接创建失败。
- 创建后不能改名:只能重建再迁移,所以命名要一次想清。
- 桶有自己的属性:区域、数据冗余策略(多 AZ)、默认存储类别、桶策略。
对象(Object)是数据存储的基本单位,一个对象是一个文件的数据加它的属性信息,由三部分构成:
| 组成 | 说明 |
|---|---|
Key | 对象名,桶内唯一;带/也只是名字的一部分 |
Metadata | 元数据:系统元数据(大小、类型、ETag 等)+ 用户自定义元数据 |
Data | 文件本体(二进制) |
用户上传到 OBS 的数据,都以对象的形式保存在桶中。上传一个 1 GB 的文件,就是一个 1 GB 的对象,不需要也不能把它「拆成目录存放」。
三、OBS 的四个优势,重点看「数据稳定」那一条
- 数据稳定:五级可靠性架构,从介质到区域逐层兜底。
- 业务可靠:千亿对象、千万级并发,靠智能调度优化访问路径。
- 多重防护:多版本控制、敏感操作保护、服务端加密、防盗链、VPC 网络隔离、访问日志审计、细粒度权限。
- 按需使用:四种存储类别独立计量计费,按量或包年包月都支持;在线扩容由云侧完成,客户无感知。
五级可靠性值得单独记住,因为它解释了「为什么对象存储敢承诺 11 个 9 的持久性」:
| 层级 | 范围 | 手段 |
|---|---|---|
| Level 1 | 介质级 | 慢盘 / 坏道检测 |
| Level 2 | 服务器级 | 纠删码(Erasure Code) |
| Level 3 | 机柜级 | 机柜级冗余 |
| Level 4 | 数据中心级 | 多 AZ |
| Level 5 | 区域级 | 跨区域复制 |
⚠️别把「可靠性」和「可用性」混为一谈:可靠性管的是「数据会不会丢」(持久性),可用性管的是「这一刻能不能访问」。五级架构主要保前者。
四、五种访问方式,按场景挑
同一个 OBS,控制台点、命令行跑、代码调,走的是不同入口:
| 工具 | 形态 | 鉴权方式 | 适合谁 |
|---|---|---|---|
| 管理控制台 | 网页 | 账号密码,或 IAM 用户名 + 密码 | 偶尔传几个文件、改配置 |
| OBS Browser+ | Windows 图形客户端 | 访问密钥 AK/SK | 习惯用资源管理器的人 |
| API | REST 风格 HTTP/HTTPS 接口 | AK/SK 签名 | 自研系统对接 |
| SDK | 对 REST API 的封装 | AK/SK | 应用开发 |
| obsutil | 命令行工具 | AK/SK | 批量处理、自动化脚本 |
| obsfs | 把并行文件系统挂到 Linux | AK/SK | 想让 OBS 像本地目录一样用 |
这里有个规律:只有控制台用账号密码,其余全要 AK/SK(Access Key ID / Secret Access Key,访问密钥)。原因很直接——控制台是「人」在操作,有登录态;工具和代码是「程序」在操作,只能靠密钥签名。
所以「用 Browser+ 之前先去申请密钥」不是多余步骤,是前置条件。
五、四种存储类别:按访问频次付钱
OBS 支持四种存储类别,本质是把「访问频次」换成「单价」:
| 类别 | 别称 | 访问频次 | 典型场景 | 取回代价 |
|---|---|---|---|---|
| 标准存储 | 热数据 | 频繁访问 | 热点视频、社交图片、移动应用 | 无,随时读 |
| 低频访问存储 | 温数据 | 平均一年少于 12 次 | 文件同步 / 共享、企业备份 | 有最低存储期要求 |
| 归档存储 | 冷数据 | 平均一年约 1 次 | 数据归档、长期备份 | 恢复需数分钟到数小时 |
| 深度归档存储 | 极冷数据 | 平均几年 1 次 | 合规留存、极少回看的历史数据 | 恢复需数小时 |
选类别的判断只有一句:这份数据一年会被打开几次?天天读就别省那点钱放归档,取回一次几小时,业务等不起;几年不动的数据放标准存储,就是在给不访问的字节交全价。
桶创建时要设「默认存储类别」,之后桶里的对象默认继承它;单个对象也可以单独指定。
六、多版本控制:开了之后,同名上传不再覆盖
默认情况下,往桶里上传一个同名对象,旧对象直接被覆盖,找不回来。开启多版本控制后,OBS 会为每个对象保留多个版本,误覆盖或应用写错时能快速回到历史版本。
两个细节:
- 开启前已存在的对象,版本 ID 是空的,内容不会变化;之后再上传同名对象,会为新文件生成版本号。
- 开启后,上传同名对象不再覆盖,而是并存多个版本——存储空间会随之增长,要配合生命周期规则清理旧版本。
⚠️多版本控制是「防手滑」的开关,不是备份。它和桶在同一个区域、同一个桶里,桶被删了版本也一起没。
七、跨域复制:异地容灾的最小配置
跨域复制(跨区域复制)通过创建复制规则,把一个桶(源桶)中的数据自动、异步复制到不同区域的另一个桶(目标桶)里,用来满足「数据要在异地留一份」的合规与容灾要求。
限制条件要记牢:
- 源桶与目标桶必须属于同一个账号,暂不支持跨账号复制。
- 复制是异步的,目标桶的数据会有秒级到分钟级的延迟。
- 只复制开启规则之后写入或变更的对象,历史对象需要单独处理(可在规则里选择同步历史对象)。
八、三层安全:加密、防盗链、权限
8.1 服务端加密:三种 SSE,算法都是 AES256
| 方式 | 密钥由谁管 | 适用场景 |
|---|---|---|
| SSE-KMS | 数据加密服务 KMS 托管 | 企业合规,想统一管密钥 |
| SSE-C | 用户每次请求自带密钥 | 用户自己持有密钥、不愿托管 |
| SSE-OBS | OBS 自己托管 | 图省事、又要开启加密 |
开启后的行为是一致的:上传时在服务端加密成密文存储,下载时先在服务端解密再返回。对应用透明,读写代码不用改。
8.2 防盗链:靠 referer 判断「谁在引用」
HTTP 协议里有个表头字段referer,用来标识请求是从哪个页面发起的。防盗链就是设置黑白名单:请求的 referer 命中白名单才允许访问,否则拒绝或返回指定页面。
典型配置:自己的站点web1.site.com进白名单,web2.site.com进黑名单。这样别人把自己的图片挂到他的网站上,浏览器带着他的域名来请求,直接被挡掉。
注意防盗链防的是「浏览器里的盗链」,防不住直接抓取——要更严的控制得用签名 URL 和权限策略。
8.3 权限:桶策略与 IAM 策略各管一段
默认情况下 OBS 的资源(桶和对象)都是私有的,只有拥有者能访问。授权有两条路:
| 类型 | 作用范围 | 说明 |
|---|---|---|
| IAM 权限 | 作用于云资源 | 定义允许和拒绝的访问操作,管「这个用户能用 OBS 这个服务吗」 |
| 桶策略 | 作用于所配置的桶及桶内对象 | 桶拥有者给 IAM 用户或其他账号授权,管「这个桶里能做什么」 |
| 对象策略 | 桶策略中针对对象的策略 | 粒度更细,精确到某个对象 |
控制台预置了几类常用模板:公共读、公共读写、桶只读、桶读写、目录只读、目录读写。「公共读写」是危险模板——任何拿到链接的人都能写,线上桶基本不该用。
九、实操:建桶、上传、分享、删除
9.1 创建桶
「存储 > 对象存储 OBS」→ 右上角「创建桶」,四个关键参数:
| 参数 | 取值 | 说明 |
|---|---|---|
| 桶名称 | cloud-service-gqd(自定义) | 全局唯一,创建后不能改 |
| 数据冗余存储策略 | 多 AZ 存储 | 数据打散到多个可用区 |
| 默认存储类别 | 标准存储 | 频繁访问 |
| 桶策略 | 私有 | 不给匿名访问 |
9.2 上传文件
点进桶,进入对象列表页 → 「上传对象」→ 把本地文件拖进上传区域 → 「上传」。页面会跳到任务列表显示进度,传完回到对象页就能看到。
9.3 下载与分享
- 下载:选中对象 → 「下载」,文件落到本地。
- 分享:选中对象 → 「分享」→ 设置有效期→ 复制链接。把这个链接丢进浏览器地址栏就能下载,不需要登录。
分享链接的本质是带签名的临时 URL,有效期一到自动失效。这也是为什么「分享」比「把桶改成公共读」安全得多。
9.4 删除对象
选中 → 「更多 > 删除」→ 确认。开着多版本控制时,删除只是加一个删除标记,历史版本还在,需要到「历史版本」里彻底删除。
十、多版本控制实操:看两个版本怎么并存
- 进入桶 → 「概览」→「基本配置」区域的「多版本控制」→ 「编辑」→ 选「启用」→ 确定。
- 回概览页确认状态已变成「已启用」。
- 本地新建
gqd-Cloud Service-2.txt,写内容 A,上传到桶里。 - 本地把同一个文件的内容改成 B(文件名不变),再上传一次。
- 在对象列表点「历史版本」,能看到同一个 Key 下有两个版本,可以分别下载、分享或删除。
这就是「覆盖」与「多版本」的分水岭:没开多版本,第二次上传把第一次的内容彻底盖掉;开了多版本,两份都在,靠版本号区分。
十一、OBS Browser+:用 AK/SK 登录
11.1 先拿访问密钥
控制台右上角用户名 → 「我的凭证」→ 左侧「访问密钥」→ 「新增访问密钥」→ 填写描述 → 确定 →下载密钥文件(credentials.csv)。
⚠️密钥只在创建时能下载一次,文件里是 AK 和 SK 明文。丢了只能新建一对,旧的作废。别把
credentials.csv提交进 Git 仓库,这是云上最常见的一类凭据泄露。
11.2 安装并登录
从官方文档页下载 OBS Browser+ 客户端(Windows),解压安装。登录界面支持 AK、账号、授权三种方式,这里选 AK:
| 字段 | 填什么 |
|---|---|
| 账号名 | 用户名,例如gqd888 |
| 服务提供商 | 华为对象存储服务 |
| Access Key ID | credentials.csv里的 AK |
| Secret Access Key | credentials.csv里的 SK |
| 访问路径 | 可不填 |
登录后就能像资源管理器一样浏览桶、上传下载、拖拽移动。
十二、两个典型场景:备份归档与大数据分析
理解了桶与对象,再看两个最常见的落地方式,会更容易记住它为什么长这样。
场景一:备份归档。企业数据中心的各类数据,通过同步客户端、主流备份软件、云存储网关或数据快递服务(DES,Data Express Service)备份到 OBS;需要时再把 OBS 里的数据恢复到云上的灾备主机或测试主机。
这条链路里,OBS 的角色是「便宜的最终归宿」——数据一旦进来就很少再读,于是选归档或深度归档,用「取回慢」换「存储便宜」。数据快递服务解决的是「网络传不完」的问题:几十 TB 首次上云,寄硬盘比拉专线快。
场景二:大数据分析。OBS 面向海量数据存储分析、历史数据明细查询、海量行为日志分析和公共事务分析统计等场景,提供低成本、高性能、业务不停、无需扩容的方案。
这里的重点是「无需扩容」:对象存储的容量上限是 EB 级,数据量从 TB 涨到 PB 不需要提前规划分片和节点,这也是它比自建 HDFS 省心的地方。
十三、用 obsutil 批量干活
控制台适合偶尔传几个文件,成百上千个对象就得靠命令行。obsutil 的基本用法只有三类:
# 查看桶里的对象obsutillsobs://cloud-service-gqd# 上传本地目录到桶(-f 表示强制覆盖同名对象)obsutilcp./data obs://cloud-service-gqd/data-r-f# 下载桶里的对象到本地obsutilcpobs://cloud-service-gqd/data/report.zip ./report.zip三个使用要点:
- 首次使用要
obsutil config配 AK/SK 与终端节点(endpoint),配完会写进本地配置文件。 - 批量操作前先用
ls确认路径,cp -r -f一旦指错目录,覆盖是不可逆的。 - 桶里对象多的时候,删除走生命周期规则比手工删更快。
十四、五个高频疑问
Q1:桶里看到的「文件夹」是真的目录吗?
不是。OBS 是扁平结构,控制台按 Key 的前缀把同前缀的对象聚成一组显示,看起来像文件夹。所以「移动文件到另一个目录」在底层等于「复制一份新 Key + 删掉旧 Key」。
Q2:开了多版本控制,为什么桶的用量涨得很快?
因为同名对象不再覆盖,而是并存多个版本,每个版本都实实在在占空间。要控制成本,得配生命周期规则自动清理过期版本。
Q3:分享链接为什么过一阵就打不开了?
分享链接是带有效期的签名 URL,时间一到自动失效。要长期可用,得改用桶策略或对象策略授权,而不是延长分享时间。
Q4:桶名为什么不能改?
桶名是全局唯一的命名空间,同时出现在所有访问路径(https://桶名.终端节点/对象)里。改名等于换地址,外部引用的链接全部失效,所以产品上直接不允许改。
Q5:把桶设成「公共读」有什么风险?
任何拿到链接的人都能下载,且无法审计是谁下的。图床、静态站点这类确实需要公开读,但公共读写基本等于把桶交出去——控制台把它做成模板是方便,不是建议。
十五、两个工程上绕不开的机制
大文件要走分段上传。单次请求上传的对象有大小上限(5 GB 量级),超过就得切成多段分别上传,最后合并成一个对象。分段的三个好处:断了只补失败的那一段、可以并发传、失败重试成本低。控制台和 SDK 都会自动处理,自己写 API 时才需要注意「先初始化分段任务、再逐段上传、最后合并」。
旧对象靠生命周期规则自动降冷。四种存储类别的价值要靠「自动转换」才落地:给桶配一条规则,比如「创建 30 天后转低频访问、180 天后转归档、3 年后删除」,桶里的对象就会按时间自己走下去。手工改类别只适合少量对象,上万个对象必须交给规则。
⚠️ 配规则前先确认「最低存储期」:低频与归档类都有最短存放时间要求,存了几天就删或转走,可能仍按最低期计费。降冷省的是「长期不动」的钱,不是「随时进出」的钱。
十六、删除顺序:桶里有对象就删不掉
OBS 的删除规则很硬:桶里还有对象(或未完成的分片上传)时,桶删不掉。所以顺序是:
删除对象(含历史版本)→ 删除桶如果开了多版本控制,光删「当前版本」不够,得把历史版本一并清掉,或者先关掉多版本再删对象。
如果桶里对象很多(几十万个),手工删不现实,用obsutil的生命周期规则或者批量删除更实际。
附:命令英文全称速查表
| 缩写/术语 | 英文全称 | 中文 |
|---|---|---|
OBS | Object Storage Service | 对象存储服务 |
Bucket | bucket | 桶 |
Object | object | 对象 |
Key | object key | 对象名 |
AK/SK | Access Key ID / Secret Access Key | 访问密钥 |
SSE | Server-Side Encryption | 服务端加密 |
KMS | Key Management Service | 密钥管理服务 |
REST | Representational State Transfer | 表述性状态转移 |
SDK | Software Development Kit | 软件开发工具包 |
AZ | Availability Zone | 可用区 |
ETag | Entity Tag | 对象内容标识(常用于校验) |
referer | referrer | 来源页字段 |
obsutil | OBS utility | OBS 命令行工具 |
obsfs | OBS file system | 把 OBS 挂载为 Linux 文件系统 |
📚 参考资料(官方文档)
- 对象存储服务 OBS 产品介绍:https://support.huaweicloud.com/productdesc-obs/obs_03_0152.html
- 存储类别与转换规则:https://support.huaweicloud.com/usermanual-obs/obs_03_0307.html
- 多版本控制:https://support.huaweicloud.com/usermanual-obs/obs_03_0403.html
- 服务端加密与防盗链配置:https://support.huaweicloud.com/usermanual-obs/obs_03_0301.html
- OBS Browser+ 使用指南:https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html
总结:OBS 的记忆骨架是「一个账号 → 多个桶 → 桶里一堆扁平对象」,每个对象 = Key + 元数据 + 数据。四种存储类别按访问频次省钱,多版本控制防手滑,跨域复制做异地容灾,SSE 加密保内容、防盗链保流量、桶策略保权限。最后一句实用的:桶名一次定终身,密钥只给一次机会,桶删不掉是因为里面还有东西。