对象版本控制

对象版本控制

您可以存储您多个内容的版本,这样你可以从意外的覆盖重新恢复。对象版本管理是实现版本控制的一个简单的方法,你可以使用任何类型的内容作为对象版本。

注解

不能版本化大型对象的manifest文件,但大型对象的manifest文件可以指向已版本化的segments。

我们强烈建议您将非当期的对象放在一个不同的容器中,而不是当前对象版本存放的容器。

启用和运用对象版本

  1. 如需启用对象版本管理,请求你的云提供商在容器配置文件中将``allow_versions``设置为``TRUE`` .

  2. 创建一个“archive”容器去存放过去版本的对象。

    $ curl -i $publicURL/archive -X PUT -H "Content-Length: 0" -H "X-Auth-Token: $token"
    
    HTTP/1.1 201 Created
    Content-Length: 0
    Content-Type: text/html; charset=UTF-8
    X-Trans-Id: tx46f8c29050834d88b8d7e-0052e1859d
    Date: Thu, 23 Jan 2014 21:11:57 GMT
    
  3. 创建一个“current”容器存放当前版本的对象。

    包含``X-Versions-Location``请求头。该请求头指定了包含非当前版本对象的容器。该请求头的值必须进行UTF-8编码和URL编码。该请求头将启用``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
    Date: Thu, 23 Jan 2014 21:28:55 GMT
    
  4. 在“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
    Date: Thu, 23 Jan 2014 21:31:22 GMT
    

    当向``current``容器初始地``PUT``一个对象时,不会向非当前版本对象写入任何内容。然而,随后的编辑一个对象的``PUT``请求会触发在``archive``容器中该对象版本的创建操作。

    这些非当期的版本被如下命名:

    <length><object_name><timestamp>
    

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

  5. 在“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
    Date: Thu, 23 Jan 2014 21:41:32 GMT
    
  6. 发出一个``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
    Date: Thu, 23 Jan 2014 21:45:50 GMT
    
      009my_object/1390512682.92052
    

    注解

    版本对象“POST”请求只更新元数据对象而不创建一个新版本的对象。只有当对象的内容发生更改时才创建新版本。

  7. 发出一个``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
    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
    Date: Thu, 23 Jan 2014 21:51:41 GMT
    

    下一最新版本带有之前为其设置的任何元数据。如果想完全地删除一个对象,而且它有五个版本,则必须执行五次``DELETE``。

  8. 为禁止``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
      Date: Thu, 23 Jan 2014 21:57:12 GMT
    
    <html><h1>Accepted</h1><p>The request is accepted for processing.</p></html>
    

Versioning with python-swiftclient

You can utilize python-swiftclient to enable object versioning.

  • Create an additional container to hold previous versions:

    $ swift post CONTAINER_versions
    
  • Enable object versioning on your desired container:

    $ swift post CONTAINER -H "X-Versions-Location:CONTAINER-versions"
    
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.