S3协议及各厂商适配

Posted by mjTree on March 12, 2024

更新于:2024-03-12 21:00

一、S3协议

S3协议指的是 Amazon S3(Simple Storage Service) 的接口规范,它是一种基于 HTTP 协议的 Restful API,用于访问 Amazon Web Services(AWS) 提供的对象存储服务,目前市面上主流的存储厂商都支持S3协议接口。而 Amazon S3 产品作为一种对象存储服务,它提供了安全、持久、高可扩展的对象存储。

二、国内外厂商的产品

厂商 存储服务 官方网站
Amazon AWS S3 https://aws.amazon.com/cn/s3
Minio Inc minio https://min.io
Hitachi Vantara HCP S3 https://www.hitachivantara.com
阿里 OSS https://www.aliyun.com/product/oss
腾讯 COS https://cloud.tencent.com/product/cos
华为 OBS https://www.huaweicloud.com/product/obs.html
天翼云 CT-ZOS https://www.ctyun.cn/products/oos
青云 qing cloud https://www.qingcloud.com/

上面表格只列举了个人工作中遇到的一些对象存储厂商,国内其实还有很多很多对象存储的厂商(网易、七牛等),不少都是互联网兴起的时代开始创建对象存储业务。个人第一次接触还是 2019 年刚毕业那会,公司有自己的存储服务产品,为了推动以及把各类业务的数据迁移到对象存储中,当时也是紧急接需求改造。

这里也提一下为什么要用到对象存储服务,或者说对象存储和我们常用的nas有什么区别。从客户那边得到的信息就是为了保证数据安全,除了保证数据安全,对象存储服务也能降低运维的管理维护成本。而且对象存储相比nas还是实惠不少。但是读写速度方面以及开发人员开发维护方面,对象存储不占优势。当然,我们选择什么存储方案都是要基于产品的使用场景来确定。

三、适配方案

各家厂商提供了自家产品的同时,也提供了不同语言的工具库方便开发人员调用。但是各家都是各种的工具库,不能统一到一起,此时有点怀念秦王扫六合。

1、从零开始

如果自己从零做起的话,可能会使用各家的工具库,然后缝合成一个聚合怪,维护好各类工具库以及所适配的对象存储服务版本即可,拓展起来看似方便但是维护的成本也不低。如果业务只是针对个别厂商适配,也是一种不错的方案。

2、参考第三方库

如果是 toB 性质的公司,那使用那家厂商的产品可由不得自己了。这里就要引出本篇文章的主题,就是有没有一个工具库能做到适配各厂商的对象存储。其实好像没有,原因很简单,国内厂商在自家官网声明兼容了S3协议,但是个人在实际使用过程中还是存在不少偏差的。不过还是能推荐一款 python 语言的工具,它能做到适配一些对S3协议适配度很好的对象存储。

3、PyFilesystem

PyFilesystem ,官方介绍是像本地驱动器一样轻松地处理档案、内存、云等中的文件和目录,无需学习新的 API。该组下 Pinned 了三个代码仓,分别是 pyfilesystem2 | s3fs | pyfilesystem.org 。第三个是介绍官网网站,前两个仓库是我们要介绍的重点。

pyfilesystem2: 定义了 Python 的文件系统抽象层。
s3fs: 是 PyFilesystem2 在 Amazon S3 文件系统的具体实现,并且允许您以与任何其他受支持的文件系统相同的方式使用 S3。

通过上面的简单介绍,我们应该能简单的了解这些仓库的功能,下面提供一段代码示例让大家熟悉它的使用。

print('pip install fs-s3fs==1.1.1')
from fs.mountfs import MountFS
from fs_s3fs import S3FS

bucket_name = 'test-bucket'
s3_server_path = '/test_path'
aws_access_key_id = '******'
aws_secret_access_key = '******'
endpoint_url = 'http://******'

print('可通过工具直接操作对象存储服务(此处使用了minio服务)')
s3_object = S3FS(
    bucket_name,
    dir_path=s3_server_path,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    endpoint_url=endpoint_url,
)
print(s3_object.listdir('/'))
if not s3_object.exists('/test_path_1'):
    s3_object.makedir('/test_path_1')

print('借用pyfilesystem2的MountFS,可适配于一些路径映射(例如docker路径挂载)')
local_path = '本地映射的路径'
mount_fs = MountFS()
mount_fs.mount(local_path, s3_object)

四、小结

本文介绍了S3协议以及各对象存储厂商,在各厂商提供的了不同SDK的情况下,通过PyFilesystem工具,我们可以操作各厂商的对象存储服务,从而让开发者专注于业务,无需担心各厂商的SDK接口差异。