对象存储的事实标准-Amazon S3服务
什么是对象存储
对象存储是云服务中的一个非常重要的概念。
一般我们使用操作系统时,是通过磁盘->操作系统挂载->文件系统->目录和文件的形式来使用的。在我们使用云服务时,我们的需求往往不是实际在对服务器的文件进行操作,而是使用很多 基于网址的 图片/视频/文件,来供我们的网页/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网盘的驱动
在各大软件源里都可以直接安装
注意,在fstab中使用s3fs挂载系统时,记得使用_netdev参数,这样会在网络连通后再进行挂载
RClone挂载
rclone是一款优秀的,支持多种网络协议的网盘管理软件
可以对各种网盘进行复制/同步/挂载等多种操作。
十分推荐使用。