所有文章 > 学习各类API > MinIO与Azure兼容吗?
MinIO与Azure兼容吗?

MinIO与Azure兼容吗?

MinIO可通过其网关功能为微软Azure Blob存储添加S3兼容性,这使得在不更改客户端代码的情况下,应用能够使用Azure作为其存储后端。MinIO通过实现一个与S3兼容的API网关,将请求转发到Azure Blob存储。此方法不仅降低了迁移成本,还提供了一种灵活的对象存储解决方案。本文探讨了如何使用MinIO和S3Proxy来实现Azure Blob与S3的兼容性,并提供了详细的步骤和配置指南。

MinIO Azure 网关

MinIO网关通过提供与亚马逊S3兼容的API,将其功能扩展到微软Azure Blob存储,使得用户能够在Azure上享受S3的便利。

运行支持微软Azure Blob存储的MinIO网关

使用Docker

Copydocker run -p 9000:9000 --name azure-s3 
 -e "MINIO_ACCESS_KEY=azureaccountname" 
 -e "MINIO_SECRET_KEY=azureaccountkey" 
 minio/minio gateway azure

使用二进制

Copyexport MINIO_ACCESS_KEY=azureaccountname
export MINIO_SECRET_KEY=azureaccountkey
minio gateway azure

使用MinIO浏览器验证

MinIO Gateway自带一个嵌入式的网络对象浏览器,通过将您的Web浏览器指向 http://127.0.0.1:9000,您可以检查服务器是否成功启动。

MinIO浏览器

使用MinIO客户端 mc 验证

mc 提供了诸如ls,cat,cp,mirror,diff等UNIX命令的替代方案,支持文件系统和Amazon S3兼容的云存储服务。

配置 mc

Copymc config host add myazure http://gateway-ip:9000 azureaccountname azureaccountkey

列出微软Azure上的容器

Copymc ls myazure
[2017-02-22 01:50:43 PST]     0B ferenginar/
[2017-02-26 21:43:51 PST]     0B my-container/
[2017-02-26 22:10:11 PST]     0B test-container1/

了解更多

Minio与Azure兼容性

Minio是一种基于Apache License v2.0协议的对象存储服务,完全兼容亚马逊的S3云储存服务。它非常适合存储非结构化数据,如图片、视频、日志文件、备份数据等。

Minio Gateway

Minio已经实现了多个Gateway,包括Amazon S3、Google Cloud Storage、Azure Storage等。用户可以通过这些Gateway,将S3兼容的API请求转发到其他类型的对象存储中,如阿里云OSS。

Interface

一个Gateway需要实现GatewayLayer接口,如下所示:

// ObjectLayer implements primitives for object API layer.
type ObjectLayer interface {
    // Storage operations.
    Shutdown() error
    StorageInfo() StorageInfo
    // Bucket operations.
    MakeBucketWithLocation(bucket string, location string) error
    GetBucketInfo(bucket string) (bucketInfo BucketInfo, err error)
    ListBuckets() (buckets []BucketInfo, err error)
    DeleteBucket(bucket string) error
    ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error)
    // Object operations.
    GetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error)
    GetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error)
    PutObject(bucket, object string, data *HashReader, metadata map[string]string) (objInfo ObjectInfo, err error)
    CopyObject(srcBucket, srcObject, destBucket, destObject string, metadata map[string]string) (objInfo ObjectInfo, err error)
    DeleteObject(bucket, object string) error
    // Multipart operations.
    ListMultipartUploads(bucket, prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartsInfo, err error)
    NewMultipartUpload(bucket, object string, metadata map[string]string) (uploadID string, err error)
    CopyObjectPart(srcBucket, srcObject, destBucket, destObject string, uploadID string, partID int, startOffset int64, length int64) (info PartInfo, err error)
    PutObjectPart(bucket, object, uploadID string, partID int, data *HashReader) (info PartInfo, err error)
    ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListPartsInfo, err error)
    AbortMultipartUpload(bucket, object, uploadID string) error
    CompleteMultipartUpload(bucket, object, uploadID string, uploadedParts []completePart) (objInfo ObjectInfo, err error)
    // Healing operations.
    HealBucket(bucket string) error
    ListBucketsHeal() (buckets []BucketInfo, err error)
    HealObject(bucket, object string) (int, int, error)
    ListObjectsHeal(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, error)
    ListUploadsHeal(bucket, prefix, marker, uploadIDMarker,
        delimiter string, maxUploads int) (ListMultipartsInfo, error)
}

// GatewayLayer - Interface to implement gateway mode.
type GatewayLayer interface {
    ObjectLayer

    AnonGetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error)
    AnonGetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error)
    AnonPutObject(bucket string, object string, size int64, data io.Reader, metadata map[string]string, sha256sum string) (ObjectInfo, error)
    SetBucketPolicies(string, policy.BucketAccessPolicy) error
    GetBucketPolicies(string) (policy.BucketAccessPolicy, error)
    DeleteBucketPolicies(string) error
    AnonListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error)
    AnonListObjectsV2(bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error)
    ListObjectsV2(bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error)
    AnonGetBucketInfo(bucket string) (bucketInfo BucketInfo, err error)
}

对于不支持的操作,可以使用留桩代码返回 NotImplemented 错误,官方提供了一个 gatewayUnsupported 供参考。

Implementation

了解接口后,只需将代码适配到接口中即可。阿里云OSS的API风格与AWS S3相似,适配过程相对简单。

编辑(2017-10-23): Pull Request 请看 minio/minio#5103

编辑(2017-12-19): Minio 上游已合并 PR,可直接使用。

最后,要注意Minio结构较为复杂,添加Gateway需修改多个文件。为此,也提交了一个PR: minio/minio#5111

FAQ

问:如何使用Docker运行支持Azure Blob存储的MinIO网关?

  • 答:使用Docker运行MinIO网关,可以通过以下命令实现:
    docker run -p 9000:9000 --name azure-s3 
    -e "MINIO_ACCESS_KEY=azureaccountname" 
    -e "MINIO_SECRET_KEY=azureaccountkey" 
    minio/minio gateway azure

    请确保用您的Azure账户名称替换azureaccountname,并用Azure账户密钥替换azureaccountkey

问:MinIO与Azure兼容吗?

  • 答:是的,MinIO通过网关模式支持与Azure Blob存储的兼容。它通过提供与Amazon S3兼容的API,使用户能够在Azure上使用S3的功能。MinIO网关已经实现了与多个云存储的兼容,包括Azure。

问:如何验证MinIO网关是否成功启动?

  • 答:您可以使用MinIO自带的嵌入式网络对象浏览器进行验证。将您的Web浏览器指向http://127.0.0.1:9000,如果浏览器成功显示MinIO界面,则说明服务器已成功启动。

问:如何配置MinIO客户端mc以连接Azure上的MinIO网关?

  • 答:您可以通过以下命令配置mc客户端:
    mc config host add myazure http://gateway-ip:9000 azureaccountname azureaccountkey

    请用您的实际网关IP替换gateway-ip,用您的Azure账户名称和密钥替换azureaccountnameazureaccountkey

问:MinIO网关如何实现与其他对象存储的兼容性?

  • 答:MinIO通过实现GatewayLayer接口来支持与其他对象存储的兼容性。接口中定义了对象存储API的基本操作,开发者可以通过适配代码实现在不同存储上的API请求转发,对于不支持的操作,可以返回NotImplemented错误。
#你可能也喜欢这些API文章!