使用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網關?

問:MinIO與Azure兼容嗎?

問:如何驗證MinIO網關是否成功啟動?

問:如何配置MinIO客戶端mc以連接Azure上的MinIO網關?

問:MinIO網關如何實現與其他對象存儲的兼容性?

上一篇:

Jenkins拉取GitLab代碼的自動化部署配置指南

下一篇:

MinIO API文檔快速入門
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費