✨ 前言
在构建企业级对象存储系统时,“对象的版本管理”是一个关键特性。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 []string
objects := 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