什么是 OSS
对象存储服务,全称 Object Storage Service,是一种海量、安全、低成本、高可靠的云存储服务。你可以把它想象成一个存在于云端的无限大的硬盘,专门用来存放各种文件。
在计算机系统中,我们会有物理存储,如 Disk 磁盘、RAM、ROM、等,而 OSS 与我们电脑里的文件夹结构不同,OSS 是“扁平化”的。它把数据(如一张图片、一段视频、一个文档)看作一个对象(Object),存放在一个 存储空间(Bucket) 里。
一些基本概念
存储空间(Bucket)
存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间。
- 存储空间的名称在 OSS 范围内必须是全局唯一的。存储空间创建成功后,名称将无法修改。
说明: 全局唯一表示阿里云所有的用户创建的 Bucket 名称都不能相同。例如用户 A 创建了名称为 example 的 Bucket,其他用户无法再次创建名称为 example 的 Bucket。
- 存储空间内部的对象数目没有限制。
对象(Object)
对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元数据(Object Meta)、用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的 Key 来标识。对象元数据是一组键值对,表示了对象的一些属性,例如文件类型、编码方式等信息,同时用户也可以在元数据中存储一些自定义的信息。
对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除使用追加方式上传的 Object 可以通过继续追加上传写入数据外,使用其他方式上传的 Object 内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。
简单来说大部分情况下,无法修改已经上传成功的对象数据,仅可通过上传同名对象来覆盖。
ObjectKey
在各语言 SDK 中,ObjectKey、Key 以及 ObjectName 是同一概念,均表示对 Object 执行相关操作时需要填写的 Object 名称。例如向某一存储空间上传 Object 时,ObjectKey 表示上传的 Object 所在存储空间的完整名称,即包含文件后缀在内的完整路径,如填写为 abc/efg/123.jpg。
Object 类型
Object 包含以下三种类型:
- Normal
通过简单上传生成的 Object。上传结束之后内容是固定的,只能读取,不能修改。如果 Object 内容发生了改变,只能重新上传同名的 Object 来覆盖之前的内容。简单上传适用于上传小于 5 GB 的单个文件、一次 HTTP 请求交互即可完成上传的场景。
- Multipart
通过分片上传生成的 Object。上传结束之后内容是固定的,只能读取,不能修改。如果 Object 内容发生了改变,只能重新上传同名的 Object 来覆盖之前的内容。分片上传适用于大文件加速上传、网络环境较差、文件大小不确定的场景。
- Appendable
通过追加上传生成的 Object。追加上传可在视频数据产生之后即时将数据上传至同一个 Object。追加上传适用于视频监控、视频直播等领域生成的实时视频流场景。更多信息,请参见追加上传。
Region(地域)
Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建 Bucket。一般来说,距离用户更近的 Region 访问速度更快。
Region 是在创建 Bucket 的时候指定的。Bucket 创建成功后,Region 将无法修改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置。
Endpoint(访问域名)
Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 oss-cn-hangzhou-internal.aliyuncs.com。
AccessKey(访问密钥)
AccessKey 简称 AK,指的是访问身份验证中用到的 AccessKey ID 和 AccessKey Secret。OSS 通过使用 AccessKey ID 和 AccessKey Secret 对称加密的方法来验证某个请求的发送者身份。AccessKey ID 用于标识用户;AccessKey Secret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。对于 OSS 来说,AccessKey 的来源有:
Bucket 的拥有者申请的 AccessKey。
被 Bucket 的拥有者通过 RAM 授权给第三方请求者的 AccessKey。
被 Bucket 的拥有者通过 STS 授权给第三方请求者的 AccessKey。
原子性和强一致性
- 原子性
Object 操作在 OSS 上具有原子性,操作要么成功要么失败,不存在中间状态的 Object。当 Object 上传完成时,OSS 即可保证读到的 Object 是完整的,OSS 不会返回给用户一个部分上传成功的 Object。
- 强一致性
Object 操作在 OSS 同样具有强一致性,当用户收到了上传(PUT)成功的响应时,该上传的 Object 进入立即可读状态,并且 Object 的冗余数据已经写入成功。不存在上传的中间状态,即执行 read-after-write,却无法读取到数据。对于删除操作,用户删除指定的 Object 成功之后,该 Object 立即不存在。
数据冗余机制
OSS 使用基于纠删码的数据冗余存储机制,确保硬件失效时的数据持久性和可用性。
OSS Object 操作具有强一致性,当用户收到了上传或复制成功的响应时,该上传的 Object 就已经立即可读,且数据已经冗余写入到多个设备中。
OSS 会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。
OSS 的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。
当数据存入 OSS 后,OSS 会检测和修复丢失的冗余,确保数据持久性和可用性。
OSS 会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的数据损坏。当检测到数据有部分损坏或丢失时,OSS 会利用冗余的数据,进行重建并修复损坏数据。
OSS 的优势
- 低成本
按需付费;自动扩容,零运维成本 - 使用简单
标准的 RESTful API;提供 SDK 包,客户端工具等 - 可靠性高
自动实现数据备份和容灾,系统故障自动转移 - 安全性高
多层次安全防护,包括服务端加密,客户端加密,防盗链,通过 Bucket Policy(存储空间协议)限制 IP 黑白名单访问等 - 其他
互联网访问加速,图片处理,视频截帧,文档预览,图片场景识别等等
可靠性高如何实现
云服务商(如阿里云 OSS、AWS S3)之所以敢承诺“11 个 9”的可靠性,依靠的不是硬件不坏(硬盘总会坏的),而是靠一套复杂的分布式软件架构。
简单来说,这背后的核心逻辑可以概括为:冗余存储(多存几份) + 物理隔离(分开放) + 智能调度(自动切换)。
数据层:不把鸡蛋放在一个篮子里(冗余与纠删码)
当你在 OSS 上传一个文件(比如 photo.jpg)时,系统绝不会只把它存在一块硬盘上。早期的做法:三副本机制 (Replica)
系统会自动把你的文件复制成三份。
第 1 份存在机器 A。
第 2 份存在机器 B。
第 3 份存在机器 C。
原理:只要这三台机器不同时坏掉,数据就在。坏了一台,系统会自动从另外两台读取。
现在的做法:纠删码技术 (Erasure Coding, EC)
三副本太浪费空间了(存 1GB 数据需要 3GB 硬盘)。现代 OSS 通常使用纠删码。- 原理: 就像解数学方程。系统把你的文件切碎成多个数据块(Data),并计算出几个校验块(Parity)。
- 例子: 假设把数据分成 D1, D2, D3, D4,算出校验块 P1, P2。如果 D2 所在的硬盘坏了,系统可以通过 D1, D3, D4 和 P1 经过数学运算,瞬间反算出 D2 的内容。
- 优势: 既保证了坏几块盘数据不丢,又比三副本更省空间。
物理层:分得 越开越安全(故障域隔离)
仅仅复制多份还不够,如果这几份都在同一个机柜里,机柜断电怎么办?如果都在同一个机房,机房着火怎么办?OSS 会将数据的不同切片强制分散到不同的故障域:
跨机柜/跨机架: 保证副本 1 和副本 2 绝不在同一个机柜(防止插排断电)。
同城多可用区 (Multi-AZ): 这是容灾的关键。
实现: 在同一个城市(如北京),云厂商通常有 3 个独立的物理数据中心(机房 A、机房 B、机房 C),它们相隔几十公里,供电和网络完全独立。
流程: 你的数据会被切分并分散存到这 3 个机房里。
效果: 哪怕机房 A 发生火灾彻底烧毁,机房 B 和 C 里的数据碎片依然能拼凑出完整的数据。
监控层:心跳检测与自动修复(自我愈合)
这是“自动”二字的核心。OSS 系统内部有一个庞大的监控网络。心跳机制 (Heartbeat)
控制节点会每隔几秒钟问存储节点:“你还活着吗?”存储节点回答:“活着”。故障判定
如果存储节点 A 没有回答,控制节点就会判定节点 A“死亡”(可能是硬盘坏了或网线断了)。自动重建 (Re-balancing)
一旦判定 A 死亡,系统会立即启动数据重建。它会指挥其他健康的节点,利用剩余的副本或校验块,计算出 A 节点上丢失的数据,并写入到一个新的、健康的节点 D 上。- 全自动: 这个过程不需要人工干预,通常在几分钟到几十分钟内完成,让数据副本数量重新回到安全水位。
接入层:无感知的流量切换(负载均衡)
这是用户视角的“故障自动转移”。- 统一入口 (VIP/DNS)
你访问 OSS 时,用的是一个域名(如 oss-cn-beijing.aliyuncs.com)。这个域名背后对应着成千上万台服务器。 - 负载均衡器 (Load Balancer)
在你的请求到达存储硬盘之前,有一层负载均衡器。它拥有一张“健康地图”。 - 自动避坑
如果你要下载的文件所在的服务器 A 坏了,负载均衡器会瞬间知道,并把你的下载请求路由到存有该文件备份的服务器 B 上。
结果: 作为一个用户,你可能只会感觉到网络稍微抖了一下(或者完全无感),文件依然能正常下载,根本不知道背后有一台服务器刚刚爆炸了。
- 统一入口 (VIP/DNS)