更新于: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
接口差异。