minio/docs/zh_CN/bucket/versioning/README.md
2020-08-18 13:10:26 -07:00

8.7 KiB
Raw Blame History

存储桶版本控制指南 Slack Docker Pulls

MinIO的版本控制可以让一个存储通里的某个对象具有多个版本。例如你可以存储spark.csv (版本为 ede336f2) 和 spark.csv (版本为 fae684da)在一个存储通中。版本控制保护你免受意外覆盖、删除、应用保留策略和存档对象的影响。

要自定义数据保留和存储使用情况,请在对象生命周期管理中使用对象版本控制。如果你在不受版本控制的存储桶中具有对象到期生命周期策略,并且希望在启用版本控制时保持相同的永久删除行为,则必须添加非当前版本到期策略。非当前版本到期生命周期策略将管理在受版本控制的存储桶中删除非当前对象版本的行为。(启用版本控制的存储桶会维护一个当前对象版本,以及零个或零个以上非当前对象版本。)

必须在存储桶上显式启用版本控制,默认情况下不启用版本控制。启用对象锁定的存储桶会自动启用版本控制。启用和暂停版本控制是在存储桶级别完成的。

只有MinIO能生成版本ID并且无法对其进行编辑。版本ID是DCE 1.1 v4 UUID 4(基于随机数据)UUID是128位数字旨在在空间和时间上具有很高的唯一性并且难以通过计算猜测。它们是全局唯一的可以在不联网一个全局注册服务器的情况下在本地生成。UUID旨在用作生命周期非常短的大量标记对象的唯一标识符并可以可靠地标识整个网络上非常持久的对象。

当您在启用版本控制的存储桶中PUT一个对象时非当前版本不会被覆盖。下图显示当将新版本的spark.csv放入已经包含相同名称对象的存储桶中时原始对象ID = ede336f2保留在存储桶中MinIO生成新版本ID = fae684da),并将新版本添加到存储桶中。

put

这意味着对对象的意外覆盖或删除进行了保护,允许检索对象的先前版本。

删除对象时所有版本都保留在存储桶中MinIO添加删除标记如下所示

delete

现在删除标记成为对象的当前版本。默认情况下GET请求始终检索最新的存储版本。因此当当前版本为删除标记时执行简单的GET对象请求将返回404 The specified key does not exist,如下所示:

get

通过指定如下所示的版本ID进行GET请求你可以检索特定的对象版本fae684da

get_version_id

要永久删除对象你需要指定要删除的版本只有具有适当权限的用户才能永久删除版本。如下所示使用特定版本ID调用的DELETE请求从存储桶中永久删除一个对象。带版本id的DELETE请求不会添加删除标记。

delete_version_id

概念

  • MinIO上的所有存储桶始终处于以下状态之一无版本控制默认启用版本控制或暂停版本控制。
  • 版本控制状态应用于启用版本控制的存储桶中的所有对象。首次启用存储桶版本控制后将始终对存储桶中的对象进行版本控制并为其指定唯一的版本ID。
  • 现存或者新建的存储通都能启用版本控制,最终也可以将其暂停。 对象的现有版本保持不变并且仍可以使用版本ID进行访问。
  • 在删除存储桶之前,应删除所有版本,包括删除标记。
  • 版本控制功能仅在纠删码和分布式纠删码模式下可用

如何在存储桶上配置版本控制

创建的每个存储桶都有与其关联的版本控制配置。默认情况下,存储桶是无版本控制的,如下所示

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
</VersioningConfiguration>

要启用版本控制你可以发送一个Status为Enabled的版本控制配置请求到MinIO。

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Status>Enabled</Status>
</VersioningConfiguration>

同样的要暂停版本控制把Status配置设置为Suspended即可。

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Status>Suspended</Status>
</VersioningConfiguration>

只有具有相应的权限或者root用户才能配置任何存储桶的版本控制状态。

使用MinIO Java SDK启用存储通版本控制的示例

EnableVersioning() API

import io.minio.EnableVersioningArgs;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class EnableVersioning {
  /** MinioClient.enableVersioning() example. */
  public static void main(String[] args)
      throws IOException, NoSuchAlgorithmException, InvalidKeyException {
    try {
      /* play.min.io for test and development. */
      MinioClient minioClient =
          MinioClient.builder()
              .endpoint("https://play.min.io")
              .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
              .build();

      /* Amazon S3: */
      // MinioClient minioClient =
      //     MinioClient.builder()
      //         .endpoint("https://s3.amazonaws.com")
      //         .credentials("YOUR-ACCESSKEY", "YOUR-SECRETACCESSKEY")
      //         .build();

      // Enable versioning on 'my-bucketname'.
      minioClient.enableVersioning(EnableVersioningArgs.builder().bucket("my-bucketname").build());

      System.out.println("Bucket versioning is enabled successfully");

    } catch (MinioException e) {
      System.out.println("Error occurred: " + e);
    }
  }
}

isVersioningEnabled() API

public class IsVersioningEnabled {
  /** MinioClient.isVersioningEnabled() example. */
  public static void main(String[] args)
      throws IOException, NoSuchAlgorithmException, InvalidKeyException {
    try {
      /* play.min.io for test and development. */
      MinioClient minioClient =
          MinioClient.builder()
              .endpoint("https://play.min.io")
              .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
              .build();

      /* Amazon S3: */
      // MinioClient minioClient =
      //     MinioClient.builder()
      //         .endpoint("https://s3.amazonaws.com")
      //         .credentials("YOUR-ACCESSKEY", "YOUR-SECRETACCESSKEY")
      //         .build();

      // Create bucket 'my-bucketname' if it doesn`t exist.
      if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket("my-bucketname").build())) {
        minioClient.makeBucket(MakeBucketArgs.builder().bucket("my-bucketname").build());
        System.out.println("my-bucketname is created successfully");
      }

      boolean isVersioningEnabled =
          minioClient.isVersioningEnabled(
              IsVersioningEnabledArgs.builder().bucket("my-bucketname").build());
      if (isVersioningEnabled) {
        System.out.println("Bucket versioning is enabled");
      } else {
        System.out.println("Bucket versioning is disabled");
      }
      // Enable versioning on 'my-bucketname'.
      minioClient.enableVersioning(EnableVersioningArgs.builder().bucket("my-bucketname").build());
      System.out.println("Bucket versioning is enabled successfully");

      isVersioningEnabled =
          minioClient.isVersioningEnabled(
              IsVersioningEnabledArgs.builder().bucket("my-bucketname").build());
      if (isVersioningEnabled) {
        System.out.println("Bucket versioning is enabled");
      } else {
        System.out.println("Bucket versioning is disabled");
      }

    } catch (MinioException e) {
      System.out.println("Error occurred: " + e);
    }
  }
}

进一步探索