MinIO版本控制详解

        引出:两个人上传同一张图片到MinIO中,MinIO只会保留一份数据。如果某一个人删除了图片,那么另一个人就会受到影响。

        MinIO的版本控制使用户可以在同一存储桶中保留对象的多个变体。

1. 桶的版本控制

        在存储桶级别启用版本控制。启用后,MinIO会自动为将要存放在该桶中的对象创建一个唯一的版本ID,当我们后续又上传同一对象时就会就不会覆盖就对象而是存放一个版本号不同的同一对象。

        这样做确实导致了数据冗余,但是解决了业务漏洞,是一个合理权衡。

1.1. 版本ID的生成方式

        MinIO 在写入操作中会为每个版本化的对象生成一个唯一 且不可变的标识符。 每个对象版本 ID 由一个 128 位的固定大小 UUIDv4 组成,保证了随机性。

        MinIO 不支持客户端管理的版本 ID 分配。 所有版本 ID 的生成都由 MinIO 服务器进程处理。

        对于在版本控制禁用或暂停时创建的对象,MinIO 使用一个 null 版本 ID。 您可以通过将 null 作为版本 ID 的一部分来访问或删除这些对象。

2. 实战

2.1. 上传版本对象

        当我们设置桶开启了版本控制时,通过uploadObjectArgs()上传的对象会自动生成版本ID存储在桶中

    @Autowired
    MinioClient minioClient;	//注入MinIO客户端

    @Test
    void testVersionUpload() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        String objectName = "versionTest";
        String localFilePath = "E:\\QQ图片.jpg";	//图片在我电脑中的存储路径
        UploadObjectArgs uploadObjectArgs = null;
        uploadObjectArgs = UploadObjectArgs.builder()
                .bucket("version")
                .object(objectName)
                .filename(localFilePath)
                .build();
        ObjectWriteResponse objectWriteResponse = minioClient.uploadObject(uploadObjectArgs);
        System.out.println(objectWriteResponse.versionId());
    }

        查看对象的版本: 

        重复执行上述代码,同一个图片生成的各个版本如下:

2.2. 获取版本对象

        下述代码输出结果均为true

@Test
void testVersionGet() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
   GetObjectArgs getObjectArgs = null;
   getObjectArgs = GetObjectArgs.builder()
           .bucket("version")
           .object("versionTest")
           .versionId("7ddfeba8-c731-483f-b46e-eb350c6d1120")	//指定版本获取
           .build();
   GetObjectResponse object = minioClient.getObject(getObjectArgs);
   System.out.println(object.object().startsWith("version"));

    //获取最新的版本
    GetObjectArgs getObjectArgs2 = null;
    getObjectArgs2 = GetObjectArgs.builder()
    .bucket("version")
    .object("versionTest")
    .build();
    GetObjectResponse object2 = minioClient.getObject(getObjectArgs2);
    System.out.println(object2.object().startsWith("version"));
}

2.3. 删除版本对象

        对MinIO中存储的对象既可以指定版本删除又可以之间删除。对于指定了版本的删除是永久删除,不可逆,对于直接删除则会创建一个0字节的 DeleteMarker 作为该对象的最新版本。 对于最新版本是 DeleteMarker 的对象,客户端必须指定版本控制标志或标识符,才能对对象的前一个版本执行GET/HEAD/LIST/DELETE 操作

2.3.1. 指定版本删除

@Test
    void testVersionDelete() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        RemoveObjectArgs removeObjectArgs = null;
       removeObjectArgs = RemoveObjectArgs.builder()
               .bucket("version")
               .object("versionTest")
               .versionId("b5a8f053-13a5-42c1-a31b-39a12f93e69c")	//指定要删除的版本对象
               .build();
       minioClient.removeObject(removeObjectArgs);
    }

        上述代码执行后版本号为b5a8f053-13a5-42c1-a31b-39a12f93e69c的版本对象已不在Versions里了,直接被删除。

2.3.2. 不指定版本删除

void testVersionDelete() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        RemoveObjectArgs removeObjectArgs2 = null;
        removeObjectArgs2 = RemoveObjectArgs.builder()
                .bucket("version")
                .object("versionTest")	//直接删除最新的版本对象
                .build();
        minioClient.removeObject(removeObjectArgs2);
}

        上述代码执行后只能通过指定版本号获取一个版本对象了,无法直接获取——因为现在的最新版本是0字节的DeleteMaker了。这时客户端显示的是这个对象已经没有了,如下图:

        直接获取会抛异常显示不存在这样的文件: 

         通过查看版本号可知其他版本文件还是存在的:

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MinIO是一个开源的对象存储服务器,它提供了版本控制功能来管理对象的不同版本。下面是MinIO版本控制的实现方式: 1. 启用版本控制:在创建存储桶时,可以通过设置`--versioning`参数来启用版本控制。例如,使用MinIO客户端工具创建一个名为`mybucket`的存储桶并启用版本控制的命令如下: ``` mc mb myminio/mybucket mc version enable myminio/mybucket ``` 2. 存储对象版本:当启用版本控制后,每次上传或覆盖一个对象时,MinIO会自动为该对象创建一个新的版本。每个版本都有一个唯一的版本ID。 3. 获取对象版本:可以通过指定版本ID来获取特定版本的对象。如果未指定版本ID,则默认获取最新版本的对象。 4. 列出对象版本:可以列出存储桶中所有对象的所有版本。可以使用MinIO客户端工具的`ls`命令来列出对象及其版本。例如,列出存储桶`mybucket`中所有对象及其版本的命令如下: ``` mc ls --versions myminio/mybucket ``` 5. 删除对象版本:可以删除特定版本的对象,也可以删除整个对象的所有版本。使用MinIO客户端工具的`rm`命令来删除对象或特定版本。例如,删除存储桶`mybucket`中特定版本的对象的命令如下: ``` mc rm --version-id=<version-id> myminio/mybucket/object ``` 6. 恢复对象版本:可以将特定版本的对象恢复为最新版本。使用MinIO客户端工具的`cp`命令来恢复对象版本。例如,将存储桶`mybucket`中特定版本的对象恢复为最新版本的命令如下: ``` mc cp --version-id=<version-id> myminio/mybucket/object myminio/mybucket/object ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值