Swift 对象多版本

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

说明

不能对大型对象清单文件进行版本控制,但大型对象清单可以指向版本控制的段。

说明

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

为了允许集群中的对象版本控制,云提供程序应将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请求,将该对象的当前版本复制到archive容器中,然后从当前容器中删除它。后续对当前容器中对象的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
    

    除了对象的前两个版本之外,archive容器还有一个delete marker来记录对象何时被删除。

    要永久删除以前的版本,对归档容器中的版本发出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>
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐