? 前言
在構建企業級對象存儲系統時,“對象的版本管理”是一個關鍵特性。MinIO 作為一款高性能、Kubernetes 原生的 S3 兼容對象存儲系統,也支持強大的版本控制功能。
本文將通過 Go 示例代碼 + 實操講解 的形式,手把手帶你掌握 MinIO 的版本控制能力,包括開啟版本控制、獲取對象版本、物理刪除等高頻操作。
??? 1、如何開啟版本管理
MinIO 使用 S3 API 實現對象版本控制,默認是關閉的。你可以使用如下 Go 代碼開啟某個 Bucket 的版本控制:
import ("context""log/slog""github.com/minio/minio-go/v7"
)// EnableVersion 開啟版本控制
func EnableVersion(client *minio.Client, bucketName string) {err := client.EnableVersioning(context.Background(), bucketName)if err != nil {slog.Info("開啟版本控制失敗", err)return}slog.Info("開啟版本控制成功")
}
?? 注意事項:
- Bucket 必須已經存在;
- 一旦開啟,后續上傳的對象都會生成唯一的版本 ID;
- 關閉版本控制不會刪除已有版本。
?? 2、開啟版本管理后,如何獲取對象?
當版本管理開啟后,每次上傳對象都會生成一個唯一的 VersionID
。你可以通過如下方式獲取最新版本的對象:
// GetLatestObject 獲取最新版本對象
func GetLatestObject(client *minio.Client, bucketName, objectName string) {object, err := client.GetObject(context.Background(), bucketName, objectName, minio.GetObjectOptions{})if err != nil {slog.Error("獲取對象失敗:", err)return}defer object.Close()// 示例:讀取數據內容buf := make([]byte, 1024)n, _ := object.Read(buf)slog.Info("對象內容:", string(buf[:n]))
}
?? 提示:
- 不指定
VersionID
,默認獲取最新版本; - 如果對象已被刪除(非物理刪除),仍可通過版本 ID 訪問舊版本。
?? 3、如何獲取指定版本的對象?
若你知道某個對象的具體 VersionID
,可以精確獲取它:
// ListObjectVersion 獲取一個對象的所有版本號
func ListObjectVersion(client *minio.Client, bucketName, objectName string) []string {var versionIds []stringobjects := client.ListObjects(context.Background(), bucketName, minio.ListObjectsOptions{Prefix: objectName,WithVersions: true,})for object := range objects {slog.Info("objectName對象信息,", "versionId", object.VersionID, "IsDeleteMarker",object.IsDeleteMarker, "IsLatest", object.IsLatest)versionIds = append(versionIds, object.VersionID)}return versionIds
}// GetObjectByVersion 指定版本獲取對象
func GetObjectByVersion(client *minio.Client, bucketName, objectName, versionID string) {object, err := client.GetObject(context.Background