1.概述
1.1 简介
本文从通用的AWS S3协议,以及在兼容S3的第三方应用中使用COS的场景出发,介绍基于MinIO对象存储配置腾讯云对象存储COS的步骤,包括编译环境的准备工作,MinIO Client、MinIO Gateway的配置。
1.2 名词解释
COS:对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。COS 提供网页端管理界面、多种主流开发语言的 SDK、API 以及命令行和图形化工具,并且兼容 S3 的 API 接口,方便用户直接使用社区工具和插件。
AWS S3:Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。各种规模和行业的客户可以为几乎任何使用案例存储和保护任意数量的数据,例如数据湖、云原生应用程序和移动应用程序。通过经济高效的存储类和易于使用的管理功能,您可以优化成本、组织数据并配置精细调整过的访问控制,从而满足特定的业务、组织和合规性要求。
MinIO对象存储:MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。
MinIO Client : MinIO 客户端 (简称mc) 为 UNIX 命令(如 ls、cat、cp、mirror、diff、find 等)提供了替代方案。它支持文件系统级别的操作并且兼容 AWS S3协议 的云存储服务(包括 AWS Signature v2 和 v4)
MinIO Gateway:MinIO S3 Gateway 将 MinIO 功能(如 MinIO 控制台和磁盘缓存)添加到 AWS S3 或兼容AWS S3协议的云存储服务。避免了增加SDK开发中适配多种云存储产品的复杂性,可以使用 MinIO Gateway 做一层代理,SDK中仅需支持 MinIO 的访问方式即可;同时还支持各种帐号管理方式:比如 Keycloak、 LDAP等。
2.MinIO 架构
2.1 MinIO 典型业务架构图
2.2 MinIO Gateway 架构图
3.适配腾讯云COS
3.1 为什么需要单独编译来适配腾讯云COS
MinIO Gateway 和 MinIO Client 在启动时会随机生成一个 Bucket 名称,然后发起 GetBucketLocation 请求来检查 S3 服务是否可用,若返回状态码是 404,则返回验证成功。
但腾讯云 COS 的 Bucket 的样式名为<bucketname>-<appid>,如果不符合格式,则响应 400,导致 MinIO Gateway 或 MinIO Client 验证失败。
抓包信息如下
代码语言:javascript复制GET /probe-bucket-sign-u5x32il6o626/?location= HTTP/1.1
Host: cos.ap-beijing.myzijiebao.com
User-Agent: MinIO (linux; amd64) minio-go/v7.0.23
Authorization: AWS4-HMAC-SHA256 Credential=AKIDe5e18zmPnxsZ1EDwRmskNkskMipgJhro/20220414/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=a22e2d2c171d4f649f7439fc8e53acae916065ecf7c8c55b804318717cc06dc0
X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Amz-Date: 20220414T185329Z
HTTP/1.1 400 Bad Request
Content-Type: application/xml
Content-Length: 433
Connection: keep-alive
Date: Thu, 14 Apr 2022 18:53:30 GMT
Server: tencent-cos
x-amz-request-id: NjI1ODZkYTlfOWNiNTE0MGJfYzFmXzFjNmI0MDE=
x-amz-trace-id: OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc1NGE1MWY0MzY2NTg1MzM1OTY3MDliYzY2YTQ0ZThhMDM2NjEzNmJhN2E5MjY5MDAxNWE1NzdhNGVhNzcyMGVm
<?xml version='1.0' encoding='utf-8' ?>
<Error>
<Code>InvalidURI</Code>
<Message>Could not parse the specified URI.</Message>
<Resource>cos.ap-beijing.myzijiebao.com/probe-bucket-sign-u5x32il6o626</Resource>
<RequestId>NjI1ODZkYTlfOWNiNTE0MGJfYzFmXzFjNmI0MDE=</RequestId>
<TraceId>OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc1NGE1MWY0MzY2NTg1MzM1OTY3MDliYzY2YTQ0ZThhMDM2NjEzNmJhN2E5MjY5MDAxNWE1NzdhNGVhNzcyMGVm</TraceId>
</Error>
3.2 MinIO Gateway 如何适配腾讯云COS
首先执行如下命令下载 MinIO 源码
代码语言:javascript复制URL https://github.com/minio/minio
git clone https://github.com/minio/minio.git
在 /cmd/gateway/s3/gateway-s3.go 文件第139行 末尾加上 "-123456"
代码语言:javascript复制L124 // randString generates random names and prepends them with a known prefix.
L125 func randString(n int, src rand.Source, prefix string)
L139 return prefix string(b[0:30-len(prefix)]) "-123456"
执行编译即可使用
已编译好的 MinIO Gateway For Cos UNIX 二进制可执行文件
代码语言:javascript复制https://cos.iclay.cn/Software/Linux/minio/minio-for-cos
3.3 MinIO Client 如何适配腾讯云COS
首先执行如下命令下载 MinIO Client 源码
代码语言:javascript复制URL https://github.com/minio/mc/
git clone https://github.com/minio/mc.git
在 cmd/utils.go 文件第105行 末尾加上 "-123456"
代码语言:javascript复制L90 // randString generates random names and prepends them with a known prefix.
L91 func randString(n int, src rand.Source, prefix string)
L105 return prefix string(b[0:30-len(prefix)]) "-123456"
执行编译即可使用
已编译好的 MinIO Client For Cos UNIX 二进制可执行文件
代码语言:javascript复制https://cos.iclay.cn/Software/Linux/minio/mc-for-cos