oss

对象存储 OSS

对象存储是无层次结构的数据存储方法,通常用于云中。不同于其他数据存储方法,基于对象的存储不使用目录树。各个单独的数据(对象)单元存在于存储池中的同一级别。

Brain++ OSS 是 Brain++ Platform 提供的对象存储服务。您可以在 Brain++ 内网中存储和访问任意类型的数据。关于对象存储的基本用法,请参考下文的客户端示例。关于对象存储的更多基本概念,请查阅相关资料。

重要基础知识

  • 对象存储不存储目录树,而是一个简单的 Key-Value 映射

一些文档

oss是什么

oss (object storage service) 是一种分布式对象存储解决方案。最著名的oss是aws的s3 45,国内有阿里云oss 18

想了解. wiki中提到,oss很适合存储“非结构化”数据,facebook,spotify,dropbox都使用oss去存储图片/视频.

oss相比与isilon

  • oss比isilon便宜很多,OSS 的硬件成本是 Isilon 成本的 30% 左右。
  • 业务增长快,扩容需求急,isilon响应周期慢,isilon需要依赖第三方的采购,实施。往往流程很慢,很难应对存储快速扩容需求。

oss的不足

oss是对象存储,最大的好处是可扩展性。相比与开源分布式文件系统,比如hdfs,其面对小文件,更友好,更易扩展。但其牺牲了文件系统带来的meta层级结构。不过oss提供了很多类似文件系统的命令,比如:
image

如何配置使用

1. 安装必要的工具

执行以下命令安装工具,如遇到错误,请尝试更新 pip.conf 385.

1
pip3 install --user awscli boto3

通过 aws --version 查看当前安装的版本号,如果提示 aws 命令不存在,请添加环境变量:

1
export PATH=~/.local/bin:$PATH

2. 配置 AccessKey 与 SecretAccessKey

OSS 使用 AccessKey 与 SecretAccessKey 进行认证和加密,到 Brain++ 安全设置 1.3k页面即可获取。

注意:

  • AccessKey 和 SecretAccessKey 相当于密码
  • 不可以公开贴出来
  • 不可以写进代码里
  • 不可以告诉别人
  • 如果 AccessKey 泄露、丢失,请及时 Reset。

执行命令完成配置:

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: 输入你的 Access Key
AWS Secret Access Key [None]: 输入你的 Secret Access Key
Default region name [None]: 跳过
Default output format [None]: 跳过

3. 使用命令行工具

ls 一下确认配置正确

1
$ aws --endpoint-url=http://oss.i.brainpp.cn s3 ls

如果你名下有可以访问的 OSS Bucket,或者在 存储 490 页面中建立过自己的 OSS Bucket,ls 就会返回 bucket 列表,否则就会返回空。只要没报错、卡死,就说明配置正确了。

以下是更完整的命令行工具用例,更多用法请参考 AWS Command Line Interface 480 的相关文档或者阅读 aws help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#(本操作非必选)
# 通过设置别名来简化使用,将下面一行加入你的 bashrc/zshrc,并 source 使其生效。
$ alias oss="aws --endpoint-url=http://oss.i.brainpp.cn s3"
# 确认配置成功,结果跟之前一样即配置成功。
$ oss ls

#(以下操作基于上一个操作的结果)

# 高级别 aws s3 命令可以方便地管理 S3 对象。
# 这些对象命令包括 aws s3 cp、aws s3 ls、aws s3 mv、aws s3 rm 和 sync。
# cp、ls、mv 和 rm 命令的用法与它们在 Unix 中的对应命令相同(但是他们不支持使用通配符),使您可以跨本地目录和 S3 bucket 无缝工作。sync 命令同步一个 bucket 与一个目录或两个 bucket 中的内容。
# 如果对象很大,所有涉及向 S3 bucket(aws s3 cp、aws s3 mv 和 aws s3 sync)上传对象的高级别命令都会自动执行分段上传。
# 使用这些命令时,无法恢复失败的上传。如果分段上传由于超时而失败,或者通过按 CTRL+C 手动取消,AWS CLI 将会清除创建的所有文件并中止上传。此过程可能耗时数分钟。
# 如果进程被 kill 命令中断或者由于系统故障而中断,则正在进行的分段上传将保留在 S3 中,必须手动清除。
# 使用 --exclude 和 --include 选项可以指定规则来筛选要操作的文件或者目录。

# oss ls <S3Uri> or NONE
# 列出一个 bucket 中的所有对象和文件夹(前缀)
$ oss ls s3://bucket-name
# 列出一个 bucket 中的一个文件夹(前缀)下的对象和文件夹(前缀)
$ oss ls s3://bucket-name/sth

# oss cp <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
# 复制一个文件到一个 bucket 中
$ oss cp ./1.txt s3://bucket-name

# oss mv <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
# 移动一个文件到一个 bucket 中
$ oss mv ./1.txt s3://bucket-name

# oss sync <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
# 同步一个目录到 bucket 中
$ oss sync ./testdir s3://bucket-name/testdir

# oss rm <S3Uri>
# 删除 bucket 中的一个 object
$ oss rm s3://bucket-name/1.txt

在 Python 代码中使用

下面代码展示了基本用法,更多请参考 boto3 s3 client 353 的相关文档。
注意: 请首先确保自己完成了命令行工具配置,否则会因为没有 AccessKey 和 SecretAccessKey 而失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import boto3

# config
# access_key/secret_key 已使用 aws configure 配置
host = "http://oss.i.brainpp.cn"

# Client初始化
s3_client = boto3.client('s3', endpoint_url=host)

# 列出该用户拥有的 bucket
for bucket in s3_client.list_buckets()['Buckets']:
print(bucket['Name'])

# 列出 bucket 中的 object
resp = s3_client.list_objects(Bucket="bucket name")
for obj in resp['Contents']:
print(obj['Key'])

# 上传一个 object
resp = s3_client.put_object(Bucket="bucket name", Key="object key", Body=b'something')

# 上传一个 object 从文件 file path
resp = s3_client.upload_file("file path", "bucket name", "object key")

# 获取一个 object
resp = s3_client.get_object(Bucket="bucket name", Key="object key")
print(resp['Body'].read())

# 下载一个 object 到文件 file path
resp = s3_client.download_file("bucket name", "object key", "file path")

# 删除一个 object
resp = s3_client.delete_object(Bucket="bucket name", Key="object key")

管理对象存储 Bucket

在 Brain++ OSS 89 页面可以创建、删除和管理 Bucket 权限。需要注意的是,Bucket 名字是 所有用户全局唯一 的,所以在对 bucket 命名时,建议通过前缀等方式避免冲突。Bucket 建立之后名字可以修改。

其他语言用法

对象存储具有与平台无关的 RESTful API 接口,它与 Amazon S3 API 的基本数据访问模型兼容(具体兼容性请参考下文 兼容性 )。所以它可以直接使用支持 Amazon S3 接口的工具包。有一点例外的是,对象存储 Bucket 的创建、删除和权限控制仅可在 OSS 89 页面完成。

理论上,可复用任何支持 S3 的客户端和工具包。下面展示 CLI 和 Python 的基本使用,它们本质上都是对 S3 RESTful API 的调用,所以在下文兼容性中所描述的不支持的功能在客户端和工具包中也不能支持

注:仅支持通过URI中的顶级目录来确认 bucket。如:
GET http://oss.i.brainpp.cn/mybucket 11

不支持通过虚拟的 bucket 主机名来确认 bucket。如:
GET http://mybucket.oss.i.brainpp.cn 2


oss
https://flepeng.github.io/oss/
作者
Lepeng
发布于
2021年5月19日
许可协议