调研各个云厂商的对象存储服务

0. What is & Why Object storage?

之前写过一篇博客 why Object Storage

1. 对象存储的 schema

虽然各家厂商的对象存储服务都有差异,但 schema 基本一样。
具体见 这篇文章 。摘录如下:

image.png

Bucket

对象存储呈现出来的是一个“桶”(bucket),你可以往“桶”里面放“对象(Object)”。这个对象包括三个部分:Key、Data、Metadata。

Key

可以理解文件名,是该对象的全局唯一标识符(UID)。

Key是用于检索对象,服务器和用户不需要知道数据的物理地址,也能通过它找到对象。这种方法极大地简化了数据存储。

下面这行,就是一个对象的地址范例:


image.png

看上去就是一个URL网址。如果该对象被设置为“公开”,所有互联网用户都可以通过这个地址访问它。

Data

也就是用户数据本体。这个不用解释了。

Metadata

Metadata叫做元数据,它是对象存储一个非常独特的概念。

元数据有点类似数据的标签,标签的条目类型和数量是没有限制的,可以是对象的各种描述信息。

举个例子,如果对象是一张人物照片,那么元数据可以是姓名、性别、国籍、年龄、拍摄地点、拍摄时间等。

  • 元数据可以有很多

在传统的文件存储里,这类信息属于文件本身,和文件一起封装存储。而对象存储中,元数据是独立出来的,并不在数据内部封装。

元数据的好处非常明显,可以大大加快对象的排序,还有分类和查找。

其他常见的 Schema

Region 和 Endpoint

Region表示数据中心所在的地域,Endpoint表示对外服务的访问域名。
例如:


image.png

详细介绍可以看下阿里云 OSS 的文档: 访问域名和数据中心 (aliyun.com)

顺便说下,这两个字段没做到“对开发者透明”,开发者用 oss sdk的时候要传这两个字段。

2. 对象存储的一般架构

image.png

图片来自文章 https://www.modb.pro/db/104970
分布式系统的常见设计,不展开了.

3. 常见功能

3.1. CRUD

值得一提的是,没有 Update 操作

对象存储虽然看上去很好很强大,但也不是没有缺点。它最大的缺点,和它的工作模式有关。
它是那种把整个数据取出来,修改,再放回去的模式,不支持直接在存储上修改,哪怕只是加一行数据,都不行。所以,它不适合存储需要频繁擦写的数据(例如关系型数据库的数据)。

3.2. 分段上传/分段下载

3.3. 分级存储,区分冷热数据

他们通常会把存储业务分为3个等级,即标准型、低频型、归档型。对应的应用场景如下:

  • 标准类型:移动应用 | 大型网站 | 图片分享 | 热点音视频
  • 低频访问类型:移动设备 | 应用与企业数据备份 | 监控数据 | 网盘应用
  • 归档类型:各种长期保存的档案数据 | 医疗影像 | 影视素材

3.4. Security

3.4.1. 认证

3.4.2. 鉴权 (ACL、policy)

非常复杂,如果你去看云厂商文档,那大概率是看不懂的。
推荐看 浅谈云上攻防——对象存储服务访问策略评估机制研究

题外话: 怪不得云服务经常会有“因为配置出错,导致出现安全问题、被黑客窃取数据”的情况,这些产品做的真让人看不懂,配置出错是大概率事件。

另一个题外话: 怪不得最近安全厂商创业开始火起来了,一方面是出事多了、甲方怕了,另一方面,甲方靠自己搞不定这些复杂的细节,需要由专家来给出整体性的解决方案

这里概括下重点,详细说明见上面的文章。

ACL

可以给存储桶/Object 添加访问控制规则。比如:


image.png
Policy

相比于 ACL, policy 可以做到更细粒度的访问控制

与 ACL 仅可以配置的用户与权限选项相比,控制的颗粒更细。

比如,我们可以添加一个 Policy “允许账号 ID 为 123456 的账号对 cos-aclxxx/policy_test 路径的读操作”。
然后通过访问 API 接口,获取权限策略:


image.png

在这个 Policy 中,我们可以看到更细腻的 Action 与 Resource 配置。

访问策略评估机制: 基于 ACL 与 Policy,控制存储桶权限

太复杂了,概括不了。


image.png

这其中还有一些逻辑漏洞,比如“虽然我没权限读取A 文件,但是我有权限把 A 文件的 ACL 修改为所有人可见,然后我就有权限读了”。详见文章。

4. 各云厂商 OSS 功能

4.1. 七牛云 Kodo

七牛云存储并不仅仅是简单的分布式存储,它需要额外考虑以下这些问题。

第一,网络问题,也就是文件的上传下载问题。
.......
第二,多媒体处理。
.......
从用户使用的角度来看,七牛云存储是这样的:
七牛云存储 = 对象存储 + 上传下载加速 + 多媒体处理

多媒体处理是亮点
https://www.qiniu.com/products/kodo

4.2. AWS S3

doc:
Amazon Simple Storage Service Documentation

sdk:
aws/aws-sdk-go-v2: AWS SDK for the Go programming language. (github.com)
Developer Guide | AWS SDK for Go V2

4.2.1. Features for developers

  • CRUD
  • tag
    https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html
image.png

To my understanding, you can attach kv pairs to objects and then use those tags in some rule processing things.
But, there aren't any API to "filter objects with tag xx"

  • HeadObject

The HEAD action retrieves metadata from an object without returning the object itself. This action is useful if you're only interested in an object's metadata. To use HEAD, you must have READ access to the object.

I think the name is a little bit odd. Better to call it getMetadata.
The metadata here includes more than just tags.

  • multipart upload (分段上传)
    https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/mpuoverview.html

  • 没有类似于阿里云的 AppendObject 的功能

  • RestoreObject
    Restores an archived copy of an object back.
    https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html
Security
authentification

Every interaction with Amazon S3 is either authenticated or anonymous

Authenticated requests must include a signature value that authenticates the request sender. The signature value is, in part, generated from the requester's AWS access keys (access key ID and secret access key).

https://docs.aws.amazon.com/AmazonS3/latest/userguide/MakingRequests.html
https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html

Authorization

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html

policy + ACL

  • Canned ACL

Amazon S3 supports a set of predefined grants, known as canned ACLs. Each canned ACL has a predefined set of grantees and permissions
https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl

  • Using presigned URLs
    https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html

All objects and buckets are private by default. However, you can use a presigned URL to optionally share objects or allow your customers/users to upload objects to buckets without AWS security credentials or permissions.

To my understanding, it's like "creating a share link for this file"

4.2.2. Features for Operators

  • lifecycle


    image.png

4.3. 阿里云

教程: https://help.aliyun.com/learn/learningpath/oss.html?spm=5176.7933691.J_9588141710.2.2e394c598zS2Dk

4.3.1. schema

https://help.aliyun.com/document_detail/31947.html

4.3.2. Features for developers

  • bucket 和 Object
    创建 bucket 后,kv存储。其中 key 可以是类似于目录结构的 /a/b/c

  • AccessKey

AccessKey,简称 AK,指的是访问身份验证中用到的AccessKeyId 和AccessKeySecret。OSS通过使用AccessKeyId 和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户,AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,其中AccessKeySecret 必须保密。

  • multipart upload
    分片上传(MultipartUpload) (aliyun.com)

  • tag
    标签(Tagging) (aliyun.com)

security
  • 认证鉴权

  • acl

4.3.3. Features for Operators

  • 存储类型
    4种。除了常见的3种之外,还有冷归档存储(Cold Archive)
    https://help.aliyun.com/document_detail/51374.html

OSS支持标准(Standard)、低频访问(IA)和归档存储(Archive)三种存储类型,分别对应AWS S3中的STANDARD、STANDARD_IA和GLACIER。您可以根据需要转换OSS Object的存储类型。

归档存储类型的Object在读取之前,要先使用Restore请求进行解冻操作。

与S3不同,OSS会忽略S3 API中的解冻天数设置,解冻状态默认持续1天,用户可以延长到最多7天,之后,Object又回到初始时的冷冻状态。

  • region 和 endpoint
    Region表示OSS的数据中心所在的地域,Endpoint表示OSS对外服务的访问域名
    https://help.aliyun.com/document_detail/31837.htm?spm=a2c4g.11186623.0.0.6c2c1bcaCqfnCl#concept-zt4-cvy-5db

  • lifecycle

4.3.4. AWS S3 compatibility

https://help.aliyun.com/document_detail/389025.html

4.4. Google

https://cloud.google.com/learn/what-is-object-storage?hl=zh-cn
https://cloud.google.com/storage?hl=zh-cn
https://cloud.google.com/filestore/?hl=zh-cn

4.5. 腾讯云

https://cloud.tencent.com/document/product/436/31315

  • 有视频教程
    https://cloud.tencent.com/document/product/436/44423

5. 跨平台 API

业界有没有标准化的 API,让用户面向该 API 编程、避免厂商绑定?

  • AWS S3
    Many vendors' products are compatible with this protocol (not all)

  • https://github.com/google/go-cloud
    I wrote an article about it, see 调研跨平台 sdk

你可能感兴趣的:(调研各个云厂商的对象存储服务)