S3 协议接口

Ozone 提供了兼容 S3 的 REST 接口,你可以使用任何兼容 S3 的工具来操作 Ozone 的对象存储数据。

S3 桶存放在 /s3v 卷下。

起步

S3 网关是提供兼容 S3 的 API 的独立组件,它应当和普通的 Ozone 组件分别启动。

你可以使用发行包启动一个基于 docker 的集群,其中会包括 S3 网关。

进入 compose/ozone 目录,启动服务:

  1. docker-compose up -d --scale datanode=3

你可以通过 http://localhost:9878 访问 S3 网关。

URL 规范

Ozone S3 网关既支持虚拟主机风格的 URL 作为桶地址(形如:http://bucketname.host:9878),也支持多级路径风格的 URL 作为桶地址(形如 http://host:9878/bucketname)。

默认使用多级路径风格,如果要使用虚拟主机风格的 URL,在 ozone-site.xml 中设置你的主域名:

  1. <property>
  2. <name>ozone.s3g.domain.name</name>
  3. <value>s3g.internal</value>
  4. </property>

桶浏览器

在桶的 URL 中加上 ?browser=true,就可以在浏览器中浏览桶。

比如,testbucket 桶中的内容可以在浏览器中用 http://localhost:9878/testbucket?browser=true 来查看。

已实现的 REST 端点

S3 网关服务的操作:

端点状态
GET 服务已实现

桶操作:

端点状态备注
GET 桶(列举对象)第二版已实现
HEAD 桶已实现
DELETE 桶已实现
PUT 桶 (创建桶)已实现
Delete 多个对象 (POST)已实现

对象操作:

端点状态备注
PUT 对象已实现
GET 对象已实现
分块上传已实现但不包括当前分块上传的进度
DELETE 对象已实现
HEAD 对象已实现

安全

如果不启用安全机制,你可以使用**任何** AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 来访问 Ozone 的 S3 服务。

在启用了安全机制的情况下,你可以通过 ozone s3 gesecret 命令获取 key 和 secret(需要进行 Kerberos 认证)。

  1. kinit -kt /etc/security/keytabs/testuser.keytab testuser/scm@EXAMPLE.COM
  2. ozone s3 getsecret
  3. awsAccessKey=testuser/scm@EXAMPLE.COM
  4. awsSecret=c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999

现在你可以使用 key 和 secret 来访问 S3 endpoint:

  1. export AWS_ACCESS_KEY_ID=testuser/scm@EXAMPLE.COM
  2. export AWS_SECRET_ACCESS_KEY=c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999
  3. aws s3api --endpoint http://localhost:9878 create-bucket --bucket bucket1

公开任何卷

Ozone 与 S3 相比,Ozone 在命名空间层次结构中多了一个元素:卷。默认情况下,可以使用 S3 接口访问 /s3v 卷的所有存储桶,但仅有 /s3v 卷的(Ozone)存储桶被公开。

为了使 S3 接口上的任何其他桶可用,可以创建一个“符号链接”的桶:

  1. ozone sh volume create /s3v
  2. ozone sh volume create /vol1
  3. ozone sh bucket create /vol1/bucket1
  4. ozone sh bucket link /vol1/bucket1 /s3v/common-bucket

本例通过 S3 接口将 /vol1/bucket1 Ozone 桶公开为 S3 兼容的 common-bucket

(注:桶链接功能的实现细节可在设计文档中找到)

客户端

AWS 命令行接口

通过指定自定义的 –endpoint 选项,aws 命令行接口可以在 Ozone S3 上使用。

  1. aws s3api --endpoint http://localhost:9878 create-bucket --bucket buckettest

或者

  1. aws s3 ls --endpoint http://localhost:9878 s3://buckettest

S3 Fuse 驱动(goofys)

Goofys 是一个 S3 FUSE 驱动,可以将 Ozone 的桶挂载到 POSIX 文件系统。

  1. goofys --endpoint http://localhost:9878 bucket1 /mount/bucket1