批量复制
在 MinIO 版本加入: RELEASE.2022-10-08T20-11-00Z
批量框架是在 mc https://github.com/minio/mc/releases/tag/RELEASE.2022-10-08T20-11-00Z 中通过 replicate 作业类型引入的。
MinIO 批量框架允许您使用 YAML 格式的作业定义文件(即”批量文件”)来创建、管理、监控和执行作业。 批量作业直接在 MinIO 部署上运行,以利用服务器端的处理能力,而不受您运行 MinIO 客户端 的本地机器的限制。
replicate 批量作业将对象从一个 MinIO 部署(称为 source 部署)复制到另一个 MinIO 部署(称为 target 部署)。
source 或 target 必须 是 本地 部署。
MinIO 部署之间的批量复制与使用 mc mirror 相比具有以下优势:
- 消除了客户端到集群网络作为潜在的瓶颈 
- 用户只需要有权限启动批量作业,无需其他权限,因为整个作业都在集群的服务器端运行。 
- 作业提供了重试机制,以便在对象无法复制时进行尝试。 
- 批量作业是一次性的、精心策划的过程,允许对复制进行精细控制。 
- (仅限 MinIO 到 MinIO)复制过程将从源复制对象版本到目标。 
从 MinIO 服务器 RELEASE.2023-05-04T21-44-30Z 版本开始,另一个部署可以是另一个 MinIO 部署,或者任何使用实时存储类的 S3 兼容位置。
在复制 YAML 文件中使用过滤选项,以排除那些在提供请求对象之前需要重新水合或其他恢复方法的存储位置中的对象。
对这些类型远程的批量复制使用的是 mc mirror 的行为。
Behavior
访问控制和要求
批量复制与存储桶复制的访问和权限要求相似,具体可以参考 存储桶复制的先决条件。
“源” 部署的凭据必须具有类似于以下内容的策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "admin:SetBucketTarget",
                "admin:GetBucketTarget"
            ],
            "Effect": "Allow",
            "Sid": "EnableRemoteBucketConfiguration"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketLocation",
                "s3:GetBucketVersioning",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold",
                "s3:PutReplicationConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ],
            "Sid": "EnableReplicationRuleConfiguration"
        }
    ]
}
“远程” 部署的凭据必须具有类似于以下内容的策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketLocation",
                "s3:GetBucketVersioning",
                "s3:GetBucketObjectLockConfiguration",
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ],
            "Sid": "EnableReplicationOnBucket"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:ReplicateTags",
                "s3:AbortMultipartUpload",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionTagging",
                "s3:PutObject",
                "s3:PutObjectRetention",
                "s3:PutBucketObjectLockConfiguration",
                "s3:PutObjectLegalHold",
                "s3:DeleteObject",
                "s3:ReplicateObject",
                "s3:ReplicateDelete"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ],
            "Sid": "EnableReplicatingDataIntoBucket"
        }
    ]
}
有关向 MinIO 部署添加用户、访问密钥和策略的更完整文档,请参见 mc admin user、mc admin user svcacct 和 mc admin policy。
配置为使用 Active Directory/LDAP 或 OpenID Connect 用户管理的 MinIO 部署可以选择为支持批量复制创建专用的 访问密钥。
过滤复制目标
批量作业定义文件可以限制通过存储桶、前缀和/或过滤器进行复制,只复制某些对象。 复制的对象和存储桶的访问可能受到您在 YAML 文件中为源或目标目的地提供的凭据的限制。
在 MinIO 版本发生变更: Server RELEASE.2023-04-07T05-28-58Z
您可以将从远程 MinIO 部署复制到运行批量作业的本地部署。
例如, 您可以使用批量作业来执行一次性的复制同步,将本地部署上 minio-local/invoices/ 存储桶中的对象推送到远程部署上 minio-remote/invoices 的存储桶中。
您还可以将从远程部署上的 minio-remote/invoices 拉取对象到本地部署上的 minio-local/invoices。
Small File Optimization
从 RELEASE.2023-12-09T18-17-51Z 版本开始,默认情况下,批量复制会自动将小于 5MiB 的对象进行打包和压缩,以高效地在源和远程之间传输数据。 远程 MinIO 部署可以检查并立即将生命周期管理分层规则应用于批量对象。 该功能类似于S3 Snowball Edge小文件批量处理提供的功能。
您可以在 replicate 作业配置中修改压缩设置。
复制批处理作业参考
YAML 必须 定义源和目标部署。
如果 源 部署是远程的,那么 目标 部署 必须 是 local 。
可选地,YAML还可以定义标志来过滤要复制的对象、为作业发送通知或定义重试尝试。
在 MinIO 版本发生变更: RELEASE.2023-04-07T05-28-58Z
您可以从远程MinIO部署复制到运行批处理作业的本地部署。
在 MinIO 版本发生变更: RELEASE.2024-08-03T04-33-23Z
此版本引入了新版本的批量任务复制 API, 即 v2 。
更新后的 API 允许您在源上列出多个前缀,以便从源进行复制。
要从一个源复制多个前缀,请将 replicate.apiVersion 指定为 v2 。
replicate:
  apiVersion: v1
  source:
    type: minio
    bucket: mybucket
    prefix:
      - prefix1
      - prefix2
...
For the source deployment
- 要求(提供)的信息 - type:- 必须是 - minio.- bucket:- 部署上的存储桶。 
- 可选信息 - prefix:复制对象的前缀。从 MinIO Server- RELEASE.2024-08-03T04-33-23Z开始,批量任务复制 API v2 允许您列出多个前缀。指定- replicate.apiVersion为- v2以从多个前缀复制。- endpoint:复制的源或目标部署的位置。例如,- https://minio.example.net.如果部署是指向命令的 mc alias set,则省略此字段,让MinIO使用该别名来确定端点和凭据值。源部署或远程部署 必须 是 “local” 别名。非 “local” 部署必须指定- endpoint(端点)和- credentials(凭据)。- path:这个选项指示MinIO使用路径风格或虚拟样式(DNS)的方式来查找桶。- 指定- on以使用路径风格。- 指定- off以使用虚拟样式。- 指定- auto以让 MinIO 自动确定正确的查找风格。默认值为- auto.- credentials:- accesskey:和- secretKey:,或者- sessionToken:,用于访问对象(们)。仅为非 本地 部署指定。- snowball版本添加: RELEASE.2023-12-09T18-17-51Z用于控制批量压缩功能的配置选项。- snowball.disable指定- true以在复制过程中禁用批量压缩功能。默认值为- false.- snowball.batch指定要批量压缩的对象的最大整数数量。默认值为- 100.- snowball.inmemory指定- false以使用本地存储暂存归档,或者指定- true以在内存(RAM)中暂存。默认值为- true.- snowball.compress指定- true以使用 S2/Snappy 压缩算法 在网络上压缩批量对象。默认值为- false,即不进行压缩。- snowball.smallerThan指定 MinIO 应该批量处理的对象的大小,单位为兆比特(MiB)。默认值为- 5MiB.- snowball.skipErrs指定- false以指示 MinIO 在读取任何产生错误的对象时继续执行,而不是停止。默认值为- true.
对于 目标部署
- 要求(提供)的信息 - type:- 必须是 - minio.- bucket:- 部署上的存储桶。 
- 可选信息 - prefix:- 指定需要复制的对象的前缀。 - endpoint:- credentials:- 用于访问对象(s)的 - accesskey和- secretKey或- sessionToken。
对于 过滤器
| 
 | 表示时间长度的字符串,格式为  仅复制比指定时间长度更新的对象。
例如,  | 
| 
 | 表示时间长度的字符串,格式为  仅复制比指定时间长度更旧的的对象。 | 
| 
 | 格式为 THH:MM:SSZ`` RFC3339 日期和时间。 仅复制该日期之后创建的对象。 | 
| 
 | 格式为 THH:MM:SSZ`` RFC3339 日期和时间。 仅复制该日期之前创建的对象。 | 
对于 通知
| 
 | 用于发送通知事件的预定义端点。 | 
| 
 | 用于访问   | 
对于 重试尝试
如果任务被打断,您可以定义重试任务批次的次数。 对于每次重试,您还可以定义两次尝试之间应等待的时间长度。
| 
 | 在放弃之前完成批处理作业的尝试次数。 | 
| 
 | 每次尝试之间应等待的最短时间。 | 
复制 作业类型的示例 YAML 描述文件
使用 mc batch generate 命令创建一个基本的 replicate 批处理作业,以便进一步自定义。
对于 local 部署,不要指定端点或凭据。
根据是源(source)还是目标(target)部分是 local ,要么删除相应部分的端点或凭据,要么对其进行注释。
replicate:
  apiVersion: v1
  # source of the objects to be replicated
  # if source is not the local deployment for the command, provide the endpoint and credentials
  source:
    type: TYPE # valid values are "s3" or "minio"
    bucket: BUCKET
    prefix: PREFIX
    # endpoint: ENDPOINT
    # path: "on|off|auto"
    # credentials:
    #   accessKey: ACCESS_KEY
    #   secretKey: SECRET_KEY
    #   sessionToken: SESSION_TOKEN # Available when rotating credentials are used
    # snowball:
    #   disable: true|false
    #   batch: 100
    #   inmemory: true|false
    #   compress: true|false
    #   smallerThan: 5MiB
    #   skipErrs: true|false
  # target where the objects must be replicated
  # if target is not the local deployment for the command, provide the endpoint and credentials
  target:
    type: TYPE # valid values are "s3" or "minio"
    bucket: BUCKET
    prefix: PREFIX
    # endpoint: ENDPOINT
    # path: "on|off|auto"
    # credentials:
    #   accessKey: ACCESS_KEY
    #   secretKey: SECRET_KEY
    #   sessionToken: SESSION_TOKEN # Available when rotating credentials are used
  # optional flags based filtering criteria
  # for all source objects
  flags:
    filter:
      newerThan: "7d" # match objects newer than this value (e.g. 7d10h31s)
      olderThan: "7d" # match objects older than this value (e.g. 7d10h31s)
      createdAfter: "date" # match objects created after "date"
      createdBefore: "date" # match objects created before "date"
      # tags:
      #   - key: "name"
      #     value: "pick*" # match objects with tag 'name', with all values starting with 'pick'
      ## NOTE: metadata filter not supported when "source" is non MinIO.
      # metadata:
      #   - key: "content-type"
      #     value: "image/*" # match objects with 'content-type', with all values starting with 'image/'
  notify:
    endpoint: "https://notify.endpoint" # notification endpoint to receive job status events
    token: "Bearer xxxxx" # optional authentication token for the notification endpoint
  retry:
    attempts: 10 # number of retries for the job before giving up
    delay: "500ms" # least amount of delay between each retry
