对象版本控制

您可以存储内容的多个版本,以便从意外覆盖中恢复。对象版本控制是一种实现版本控制的简单方法,可用于任何类型的内容。

注意

您无法对大型对象清单文件进行版本控制,但大型对象清单文件可以指向已版本化的片段。

注意

强烈建议您将非当前对象放在与存储当前对象版本不同的容器中。

为了允许集群内的对象版本控制,云提供商应将 versioned_writes 过滤器添加到管道,并在代理服务器配置文件中的 [filter:versioned_writes] 部分将 allow_versioned_writes 选项设置为 true

要为容器启用对象版本控制,您必须指定一个“归档容器”来保留非当前版本,方法是使用 X-Versions-LocationX-History-Location 头。这两个头启用两种不同的操作模式。两种模式都可以在集群内使用,但任何给定容器只能激活一种模式。您必须对容器名称进行 UTF-8 编码,然后进行 URL 编码,才能将其包含在头中。

对于两种模式,PUT 请求将在写入新数据之前归档任何预先存在的对象,而 GET 请求将提供当前版本。COPY 请求的行为类似于 GET 后跟 PUT;也就是说,如果复制 位于已版本化的容器中,则将复制当前版本,如果复制 目标 位于已版本化的容器中,则在写入新数据之前,任何预先存在的对象将被归档。

如果使用 X-History-Location 启用了对象版本控制,则对象 DELETE 请求会将当前版本复制到归档容器,然后将其从版本化容器中删除。

如果使用 X-Versions-Location 启用了对象版本控制,则对象 DELETE 请求将从归档容器恢复最新版本,覆盖当前版本。

使用 X-Versions-Location 的示例

  1. 创建 current 容器

    # curl -i $publicURL/current -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token" -H "X-Versions-Location: archive"
    
    HTTP/1.1 201 Created
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: txb91810fb717347d09eec8-0052e18997
    X-Openstack-Request-Id: txb91810fb717347d09eec8-0052e18997
    Date: Thu, 23 Jan 2014 21:28:55 GMT
    
  2. current 容器中创建对象的第一个版本

    # curl -i $publicURL/current/my_object --data-binary 1 -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token"
    
    HTTP/1.1 201 Created
    Last-Modified: Thu, 23 Jan 2014 21:31:22 GMT
    Content-Length: 0
    Etag: d41d8cd98f00b204e9800998ecf8427e
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx5992d536a4bd4fec973aa-0052e18a2a
    X-Openstack-Request-Id: tx5992d536a4bd4fec973aa-0052e18a2a
    Date: Thu, 23 Jan 2014 21:31:22 GMT
    

    当您最初在 current 容器中 PUT 对象时,非当前版本容器中不会写入任何内容。但是,后续编辑对象的 PUT 请求会触发在 archive 容器中创建该对象的版本。

    这些非当前版本命名如下

    <length><object_name>/<timestamp>
    

    其中 length 是对象名称的 3 位零填充十六进制字符长度,<object_name> 是对象名称,<timestamp> 是对象最初创建为当前版本的时间。

  3. current 容器中创建对象的第二个版本

    # curl -i $publicURL/current/my_object --data-binary 2 -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token"
    
    HTTP/1.1 201 Created
    Last-Modified: Thu, 23 Jan 2014 21:41:32 GMT
    Content-Length: 0
    Etag: d41d8cd98f00b204e9800998ecf8427e
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx468287ce4fc94eada96ec-0052e18c8c
    X-Openstack-Request-Id: tx468287ce4fc94eada96ec-0052e18c8c
    Date: Thu, 23 Jan 2014 21:41:32 GMT
    
  4. 发出 GET 请求以获取版本化对象的当前版本。您无需执行任何请求重定向或元数据查找。

    列出 archive 容器中较旧版本的对象

    # curl -i $publicURL/archive?prefix=009my_object -X GET -H "X-Auth-Token: $token"
    
    HTTP/1.1 200 OK
    Content-Length: 30
    X-Container-Object-Count: 1
    Accept-Ranges: bytes
    X-Timestamp: 1390513280.79684
    X-Container-Bytes-Used: 0
    Content-Type: text/plain; charset=utf-8
    X-Trans-Id: tx9a441884997542d3a5868-0052e18d8e
    X-Openstack-Request-Id: tx9a441884997542d3a5868-0052e18d8e
    Date: Thu, 23 Jan 2014 21:45:50 GMT
    
    009my_object/1390512682.92052
    

    注意

    对版本化对象发出的 POST 请求仅更新对象的元数据,不会创建对象的新的版本。只有当对象的内容发生变化时,才会创建新版本。

  5. 对版本化对象发出 DELETE 请求以删除当前版本的对象,并将其替换为非当前容器中的下一个最新版本。

    # curl -i $publicURL/current/my_object -X DELETE -H "X-Auth-Token: $token"
    
    HTTP/1.1 204 No Content
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx006d944e02494e229b8ee-0052e18edd
    X-Openstack-Request-Id: tx006d944e02494e229b8ee-0052e18edd
    Date: Thu, 23 Jan 2014 21:51:25 GMT
    

    列出 archive 容器中的对象,以显示已归档的对象已移回 current 容器

    # curl -i $publicURL/archive?prefix=009my_object -X GET -H "X-Auth-Token: $token"
    
    HTTP/1.1 204 No Content
    Content-Length: 0
    X-Container-Object-Count: 0
    Accept-Ranges: bytes
    X-Timestamp: 1390513280.79684
    X-Container-Bytes-Used: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx044f2a05f56f4997af737-0052e18eed
    X-Openstack-Request-Id: tx044f2a05f56f4997af737-0052e18eed
    Date: Thu, 23 Jan 2014 21:51:41 GMT
    

    这个下一个最新版本会携带与其最后设置的任何元数据。如果您想完全删除一个对象,并且它有五个版本,则必须 DELETE 它五次。

使用 X-History-Location 的示例

  1. 创建 current 容器

    # curl -i $publicURL/current -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token" -H "X-History-Location: archive"
    
    HTTP/1.1 201 Created
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: txb91810fb717347d09eec8-0052e18997
    X-Openstack-Request-Id: txb91810fb717347d09eec8-0052e18997
    Date: Thu, 23 Jan 2014 21:28:55 GMT
    
  2. current 容器中创建对象的第一个版本

    # curl -i $publicURL/current/my_object --data-binary 1 -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token"
    
    HTTP/1.1 201 Created
    Last-Modified: Thu, 23 Jan 2014 21:31:22 GMT
    Content-Length: 0
    Etag: d41d8cd98f00b204e9800998ecf8427e
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx5992d536a4bd4fec973aa-0052e18a2a
    X-Openstack-Request-Id: tx5992d536a4bd4fec973aa-0052e18a2a
    Date: Thu, 23 Jan 2014 21:31:22 GMT
    

    当您最初在 current 容器中 PUT 对象时,非当前版本容器中不会写入任何内容。但是,后续编辑对象的 PUT 请求会触发在 archive 容器中创建该对象的版本。

    这些非当前版本命名如下

    <length><object_name>/<timestamp>
    

    其中 length 是对象名称的 3 位零填充十六进制字符长度,<object_name> 是对象名称,<timestamp> 是对象最初创建为当前版本的时间。

  3. current 容器中创建对象的第二个版本

    # curl -i $publicURL/current/my_object --data-binary 2 -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token"
    
    HTTP/1.1 201 Created
    Last-Modified: Thu, 23 Jan 2014 21:41:32 GMT
    Content-Length: 0
    Etag: d41d8cd98f00b204e9800998ecf8427e
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx468287ce4fc94eada96ec-0052e18c8c
    X-Openstack-Request-Id: tx468287ce4fc94eada96ec-0052e18c8c
    Date: Thu, 23 Jan 2014 21:41:32 GMT
    
  4. 发出 GET 请求以获取版本化对象的当前版本。您无需执行任何请求重定向或元数据查找。

    列出 archive 容器中较旧版本的对象

    # curl -i $publicURL/archive?prefix=009my_object -X GET -H "X-Auth-Token: $token"
    
    HTTP/1.1 200 OK
    Content-Length: 30
    X-Container-Object-Count: 1
    Accept-Ranges: bytes
    X-Timestamp: 1390513280.79684
    X-Container-Bytes-Used: 0
    Content-Type: text/plain; charset=utf-8
    X-Trans-Id: tx9a441884997542d3a5868-0052e18d8e
    X-Openstack-Request-Id: tx9a441884997542d3a5868-0052e18d8e
    Date: Thu, 23 Jan 2014 21:45:50 GMT
    
    009my_object/1390512682.92052
    

    注意

    对版本化对象发出的 POST 请求仅更新对象的元数据,不会创建对象的新的版本。只有当对象的内容发生变化时,才会创建新版本。

  5. 对版本化对象发出 DELETE 请求,将当前版本的对象复制到归档容器,然后从当前容器中删除它。后续对当前容器中对象的 GET 请求将返回 404 Not Found

    # curl -i $publicURL/current/my_object -X DELETE -H "X-Auth-Token: $token"
    
    HTTP/1.1 204 No Content
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx006d944e02494e229b8ee-0052e18edd
    X-Openstack-Request-Id: tx006d944e02494e229b8ee-0052e18edd
    Date: Thu, 23 Jan 2014 21:51:25 GMT
    

    列出 archive 容器中较旧版本的对象

    # curl -i $publicURL/archive?prefix=009my_object -X GET -H "X-Auth-Token: $token"
    
    HTTP/1.1 200 OK
    Content-Length: 90
    X-Container-Object-Count: 3
    Accept-Ranges: bytes
    X-Timestamp: 1390513280.79684
    X-Container-Bytes-Used: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx044f2a05f56f4997af737-0052e18eed
    X-Openstack-Request-Id: tx044f2a05f56f4997af737-0052e18eed
    Date: Thu, 23 Jan 2014 21:51:41 GMT
    
    009my_object/1390512682.92052
    009my_object/1390512692.23062
    009my_object/1390513885.67732
    

    除了对象的两个先前版本之外,归档容器还有一个“删除标记”来记录对象何时被删除。

    要永久删除以前的版本,请对归档容器中的版本发出 DELETE 请求。

禁用对象版本控制

要为 current 容器禁用对象版本控制,请通过发送一个空键值来删除其 X-Versions-Location 元数据头。

# curl -i $publicURL/current -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token" -H "X-Versions-Location: "
HTTP/1.1 202 Accepted
Content-Length: 76
Content-Type: text/html; charset=UTF-8
X-Trans-Id: txe2476de217134549996d0-0052e19038
X-Openstack-Request-Id: txe2476de217134549996d0-0052e19038
Date: Thu, 23 Jan 2014 21:57:12 GMT

<html><h1>Accepted</h1><p>The request is accepted for processing.</p></html>