概述
Ozone 提供了 S3 兼容的 REST 接口,可使用任何 S3 兼容工具访问对象存储中的数据。S3 存储桶存储在 /s3v 卷下。
快速开始
S3 网关是一个独立的组件,提供 S3 兼容的 API。除了常规的 Ozone 组件之外,还需要额外启动它。你可以从发布包中启动一个包含 S3 网关的基于 Docker 的集群。
进入 compose/ozone 目录,启动服务:
docker-compose up -d --scale datanode=3你可以通过 http://localhost:9878 访问 S3 网关。
URL 样式
Ozone S3 网关同时支持虚拟主机式 URL 的 S3 存储桶地址(例如 http://bucketname.host:9878)以及路径式地址(例如 http://host:9878/bucketname)。默认使用路径式寻址。若要使用虚拟主机样式的 URL,请在 ozone-site.xml 中设置你的主域名:
<property>
<name>ozone.s3g.domain.name</name>
<value>s3g.internal</value>
</property>已实现的 REST 端点
Ozone S3 网关实现了 Amazon S3 REST API 的大部分子集。下表汇总了每个 API 的支持状态、功能及相关说明,其中包括与 AWS S3 行为已知的差异。
存储桶操作
| API 名称 | 功能 | 说明 |
|---|---|---|
| ✅ ListBuckets | 列出已认证用户拥有的所有存储桶。 | 返回完整的存储桶列表。 |
| ✅ CreateBucket | 创建新的存储桶。 | 不符合规范的行为: 默认的存储桶 ACL 可能包含额外的组权限,而非严格的私有权限。存储桶名称必须遵循 S3 命名约定。 |
| ✅ HeadBucket | 检查存储桶是否存在。 | 如果存储桶存在,则返回 200 状态码。 |
| ✅ DeleteBucket | 删除存储桶。 | 删除前存储桶必须为空。 |
对象操作
| API 名称 | 功能 | 说明 |
|---|---|---|
| ✅ GetObject | 获取对象的内容。 | 不符合规范的行为: 对于不存在的对象,Ozone 可能返回通用的 404,而不包含 AWS S3 所定义的结构化 XML 错误正文。 |
| ✅ HeadObject | 获取对象的元数据。 | 与 GET Object 类似,对象缺失时的错误响应可能缺少详细的 AWS 风格错误 XML。 |
| ✅ PutObject | 上传新对象。 | 同时支持单次 PUT 和分片上传。不符合规范的行为: 请求中提供的任何 ACL 头部都会被忽略。 |
| ✅ DeleteObject | 删除单个对象。 | 对缺失的对象返回标准错误码。 |
| ✅ DeleteObjects | 在一次请求中删除多个对象。 | 批量删除操作,提供汇总的错误报告。 |
| ✅ CopyObject | 复制对象(同一存储桶内或跨存储桶)。 | 支持元数据指令(COPY/REPLACE)。不符合规范的行为: 用于更新元数据的自我复制可能与 AWS S3 略有不同。 |
| ✅ ListObjectsV2 | 列出存储桶中的对象,支持过滤和分页。 | 支持前缀、分隔符和续传令牌。 |
对象标签操作
| API 名称 | 功能 | 说明 |
|---|---|---|
| ✅ PutObjectTagging | 为对象添加或更新标签。 | 完全支持;更新操作会替换已有的标签集合。 |
| ✅ GetObjectTagging | 获取对象的标签集合。 | 返回由 S3 API 定义的标签集合。 |
| ✅ DeleteObjectTagging | 删除对象的标签集合。 | 清除与该对象关联的所有标签。 |
分段上传操作
| API 名称 | 功能 | 说明 |
|---|---|---|
| ✅ CreateMultipartUpload | 启动一个分段上传会话。 | 返回一个 UploadId,供后续上传分段使用。 |
| ✅ UploadPart | 为分段上传上传单个分段。 | 分段编号与 ETag 计算遵循 AWS 语义。 |
| ✅ ListMultipartUploads | 列出存储桶中进行中的分段上传。 | 默认每批最多返回 1000 个分段上传。 |
| ✅ ListParts | 列出进行中的分段上传已上传的分段。 | 当分段数量较多时支持分页。 |
| ✅ CompleteMultipartUpload | 将所有已上传的分段组装成最终对象。 | 返回一个遵循 AWS 分段上传规则的 ETag。 |
| ✅ AbortMultipartUpload | 中止一个进行中的分段上传。 | 释放已上传分段所占用的存储空间。超过 7 天未完成的分段上传会被 Ozone 自动中止。 |
其他操作
| API 名称 | 功能 | 说明 |
|---|---|---|
| ✅ 生成预签名 URL | 为访问对象生成临时 URL。 | 使用 AWS Signature V4。**不符合规范的行为:**生成的 URL 可能包含固定的默认区域,而不是动态反映存储桶所在的位置。Ozone 现已支持为所有主要的 S3 操作生成预签名 URL,包括 GetObject、PutObject、DeleteObject、HeadObject、HeadBucket、MultipartUpload。 |
补充说明
不支持的高级功能:
- **ACL、存储桶策略、CORS 配置和网站托管:**这些功能尚未完全实现;Ozone 使用的内部权限模型与 AWS S3 不同。
- **存储桶版本控制、对象锁定、服务端加密和 S3 Select:**这些功能目前尚不支持。
- **条件请求:**对条件请求(例如
If-Match、If-None-Match)的支持正在规划中,相关进展记录在 HDDS-13117。 - 生命周期配置、跨区域复制、S3 事件通知正在实现中,并已列入路线图。
虽然 Ozone S3 网关对常见的 S3 操作提供了广泛的支持,但在与需要完整 AWS S3 功能的应用集成时,用户应当注意上述不符合规范的行为和限制。
虽然 Ozone S3 网关不支持 S3 服务端加密,但它支持使用 Apache Ranger KMS 实现加密存储桶。有关更多信息,请参阅透明数据加密文档。
安全性
如果未启用安全性,你可以使用任意 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
如果启用了安全性,你可以通过 ozone s3 getsecret 命令获取密钥和密钥秘密(*需要基于 Kerberos 的身份验证)。
kinit -kt /etc/security/keytabs/testuser.keytab testuser/scm@EXAMPLE.COM
ozone s3 getsecret
awsAccessKey=testuser/scm@EXAMPLE.COM
awsSecret=c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999note
从 Ozone 1.4.0 开始,使用 getsecret 生成的密钥(secret)只会显示一次。如果丢失了该密钥,用户必须先执行 revokesecret,然后才能使用 getsecret 重新生成新的密钥。
现在,你可以使用该 key 和 secret 来访问 S3 端点:
export AWS_ACCESS_KEY_ID=testuser/scm@EXAMPLE.COM
export AWS_SECRET_ACCESS_KEY=c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999
aws s3api --endpoint http://localhost:9878 create-bucket --bucket bucket1要使密钥失效/撤销密钥,请使用 ozone s3 revokesecret 命令。可在其后附加 -y 参数以跳过交互式确认。
ozone s3 revokesecret
Enter 'y' to confirm S3 secret revocation for 'testuser/scm@EXAMPLE.COM': y
S3 secret revoked.Ozone Manager 管理员可以运行 ozone s3 getsecret 和 ozone s3 revokesecret 命令并配合 -u 参数来指定其他用户。
# Obtained Kerberos TGT for testuser/scm@EXAMPLE.COM with kinit,
# testuser/scm@EXAMPLE.COM is an OM admin.
ozone s3 getsecret -u om/om@EXAMPLE.COM
awsAccessKey=om/om@EXAMPLE.COM
awsSecret=1e9379d0424cce6669b1a501ff14834e46dee004ee868b41a313b49eabcfb68f
ozone s3 revokesecret -u om/om@EXAMPLE.COM -y
S3 secret revoked.暴露任意卷
与 S3 相比,Ozone 的命名空间层级中多了一个元素:卷(volume)。默认情况下,/s3v 卷的所有存储桶都可以通过 S3 接口访问,但只有 /s3v 卷中的(Ozone)存储桶会被暴露。
若要通过 S3 接口访问其他任意存储桶,可以创建一个"符号链接"存储桶:
ozone sh volume create /s3v
ozone sh volume create /vol1
ozone sh bucket create /vol1/bucket1
ozone sh bucket link /vol1/bucket1 /s3v/common-bucket此示例通过 S3 接口,将 /vol1/bucket1 Ozone 存储桶以 S3 兼容的 common-bucket 形式暴露出来。
note
存储桶链接功能的实现细节可参见设计文档。
客户端
AWS CLI
通过指定自定义 REST 端点,即可使用 aws CLI。
aws s3api --endpoint http://localhost:9878 create-bucket --bucket buckettest或
aws s3 ls --endpoint http://localhost:9878 s3://buckettest支持的 AWS CLI 版本
- 支持 AWS CLI v1(1.37.0 及以上)和 AWS CLI v2(2.23.0 及以上)。正是在这些版本中,AWS 启用了默认数据完整性保护,会自动为 S3 上传计算
CRC32校验和;Ozone 在 2.1 及更高版本中增加了对该流程的处理。 - AWS 已宣布 AWS CLI v1 将于 2026 年 7 月 15 日进入维护模式,建议用户升级到 AWS CLI v2。Ozone 可能在未来某个时间点停止对 AWS CLI v1 的支持。
兼容的第三方应用
Ozone 的 S3 网关可与各类云原生应用和分析应用集成。以下是已知可与 Ozone 配合使用的工具和平台示例(按字母顺序排列):
- Clickhouse
- Fluentd 可通过 S3 网关将日志直接发送到 Ozone。
- JuiceFS
- Starburst(Starburst 还支持 Ozone 的
ofs://) - Teradata NOS
- CyberDuck,参见教程页面
此列表并不详尽——任何支持 S3 协议的应用理论上都可以连接到 Ozone,这使得在现代数据管道和云原生工作流中采用 Ozone 变得轻而易举。
评论
登录后参与评论
KnowForge