对象存储的事实标准-Amazon S3服务

发布于2024-08-01

什么是对象存储

对象存储是云服务中的一个非常重要的概念。

AWS对对象服务的解释

一般我们使用操作系统时,是通过磁盘->操作系统挂载->文件系统->目录和文件的形式来使用的。在我们使用云服务时,我们的需求往往不是实际在对服务器的文件进行操作,而是使用很多 基于网址的 图片/视频/文件,来供我们的网页/APP使用。在这种场景下,文件可以抽象为是独立于服务器/网站/APP,存在的互联网资源,即对象。对象存储服务就是通过基于HTTP的API,对可以通过HTTP访问的对象,进行读/写/删除/列出等操作,并根据实际需求进行授权的服务,解决了所有系统的资源/附件需求。

以大俗话来说,对象存储服务就是通用附件服务

AWS的S3服务

AWS,全称Amazon Web Services,亚马逊云服务,是由电商巨头Amazon于2002年创建的云计算平台。作为历史最久,最成功的云计算平台,在AWS的云服务中,对象存储S3服务由于创建时间早,技术成熟,应用广泛,成为了该服务的事实标准,绝大部分云计算平台的对象服务都提供了S3的基本协议兼容,包括:

  • 微软Azure平台的Blob服务
  • 谷歌的Google Cloud平台的Cloud Storage
  • 阿里云的OSS
  • 腾讯云的COS
  • 华为云的OBS

当你使用了S3兼容协议的云服务后,绝大部分客户端/sdk/软件都可以直接对你的附件池进行操作,很容易的进行数据迁移或服务替代。可以说,对于需要在线网络附件而且不依赖特定云服务商特殊功能的场景下,AWS S3兼容协议是最好也应该是唯一的选择。

S3的特点和概念

AWS S3作为一个为了附件服务而生的协议,有很多自己独有的概念和特点,能更适合附件的应用场景

接入点 Endpoint

Endpoint一般是域名中2级域名的一部分,本质上是不同服务器的别名。

通过Endpoint的不同,可以实现区分线路(服务器物理位置)和功能于接口(不同的服务接入点可以有不同的API版本和功能实现)区分权限(针对endpoint颗粒度进行权限分配)。

对于熟悉Windows的用户,可以将Endpoint理解为盘符,一个盘符可能对应不同的机械硬盘/固态硬盘/网盘,有不同的速度和功能特性,但在标准操作上,接口是一致的。

存储桶 Bucket

存储桶是我们管理附件的基本单位。类似于我们在硬盘中创建各种1级目录,然后将相关的资源都放在目录内。存储桶我们一般会统一设置权限,比如(用户可见/全部人可见)。bucket和Endpoint的区别就是,Endpoint是由AWS根据实际物理服务器的情况设置的划分,而Bucket是我们用户根据实际业务需求进行的划分,组织和管理的单位。

前缀 Prefix

S3的前缀,就是我们附件的/部分,即传统意义上的目录。

但作为专业的附件服务,前缀和目录还是有区别的。

即,附件服务目录没有实体,不存在对目录进行操作(一般文件系统目录其实是一种特殊的文件),所以不纯在对前缀本身的操作,只存在对符合某个规律(前缀)的路径的统一设置。

也就是说,前缀是弱化很多倍的目录。

以俗话来说,S3只有Bucket是真目录,所有的prefix是假目录

REST 风格的API

REST风格(Restful)的API,是一种很受争议的接口风格。

曾经饱受推崇,但现在基本属于褒贬不一的状态。

Restful的理念是万物皆资源,url代表了资源的位置,HTTP协议的Method动词代表了操作的类型。在实际业务中,很多操作难以抽象成资源,所以使用范围受到很大的限制。

不过在S3的使用场景中,Restful风格优势体现地淋漓尽致。

基于ID/SECRET和TIMESTAMP的签名验证

AWS S3分隔的签名是基于时间戳拼接字符串的摘要签名来进行验证的。

也就是只要将请求关键内容,时间戳和KEY拼接和进行摘要,AWS会根据ID,在服务器端也用预留的KEY做一边同样的验证。

这样就很好的解决了异地授权的问题。

AWS S3的文件也创造性的使用了预签名链接,可以实现前端不经过服务器直传附件。

自建S3服务

在开发和部署时,根据实际情况和开发需求先采用自建服务,然后根据实际运行情况迁移到S3时一个很常见的场景。

min.io是一个基于golang开发的,十分优秀的和常用的自建S3服务。

一般场景下能很出色的胜任附件服务器的职责。

但是,在使用时要特别注意,min.io是十分严格的AGPL授权的。在对授权要求十分严格的场合,很可能需要寻找其他替代品。

挂载S3为本地文件系统

很多时候,在读写压力不高的场合,会需要将S3的附件盘挂载为系统磁盘,以实现多个服务器共享部分文件的需求。

这时候,我们可以通过RClone工具或者基于fuse的s3fs将S3挂载为本地文件系统。

s3fs挂载

s3fs是一款利用fuse系统,再用户空间挂载s3网盘的驱动

github地址

在各大软件源里都可以直接安装

注意,在fstab中使用s3fs挂载系统时,记得使用_netdev参数,这样会在网络连通后再进行挂载

RClone挂载

rclone是一款优秀的,支持多种网络协议的网盘管理软件

官网地址

可以对各种网盘进行复制/同步/挂载等多种操作。

十分推荐使用。