Swift对象多版本
可以存储内容的多个版本,以便从意外的覆盖中恢复。对象版本控制是实现版本控制的一种简单方法,您可以将其用于任何类型的内容。说明不能对大型对象清单文件进行版本控制,但大型对象清单可以指向版本控制的段。说明强烈建议将非当前对象放在与当前对象版本所在的容器不同的容器中。为了允许集群中的对象版本控制,云提供程序应将筛选器添加到管道中,并在代理服务器配置文件的部分将选项设置为true。要为容器启用对象版本控制
Swift 对象多版本
可以存储内容的多个版本,以便从意外的覆盖中恢复。对象版本控制是实现版本控制的一种简单方法,您可以将其用于任何类型的内容。
说明
不能对大型对象清单文件进行版本控制,但大型对象清单可以指向版本控制的段。
说明
强烈建议将非当前对象放在与当前对象版本所在的容器不同的容器中。
为了允许集群中的对象版本控制,云提供程序应将versioned_writes
筛选器添加到管道中,并在代理服务器配置文件的 [filter:versioned_writes]
部分将allow_versioned_writes
选项设置为 true
。
要为容器启用对象版本控制,必须指定一个“存档容器”,该存档容器将通过X-Versions-Location
或 X-History-Location
头保留非当前版本。这两个头启用两种不同的操作模式。任何一种模式都可以在集群中使用,但对于任何给定的容器,只有一种模式是活动的。在将容器名称包含在头中之前,必须先对其进行UTF-8编码,然后对其进行URL编码。
对于这两种模式,PUT请求将在写入新数据之前归档任何预先存在的对象,而GET请求将为当前版本提供服务。COPY请求的行为类似于一个GET,后面跟着一个PUT;也就是说,如果副本源位于版本控制的容器中,则将复制当前版本,如果副本目标位于版本控制的容器中则在写入新数据之前将存档任何预先存在的对象。
如果使用X-History-Location
启用了对象版本控制,则对象DELETE请求将把当前版本复制到存档容器,然后从版本控制的容器中删除。
如果使用 X-Versions-Location
启用了对象版本控制,则对象DELETE请求将从存档容器中恢复最新版本,覆盖当前版本。
使用X-Versions-Location
示例
-
创建
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
-
在
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>
是最初将对象创建为当前版本的时间。 -
在
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
-
向一个有版本控制的对象发出一个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请求只更新该对象的元数据,而不创建该对象的新版本。只有当对象的内容发生变化时,才会创建新版本。
-
对一个有版本控制的对象发出一个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
示例
-
创建
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
-
在
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>
是最初将对象创建为当前版本的时间。 -
在
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
-
向一个有版本控制的对象发出一个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请求只更新该对象的元数据,而不创建该对象的新版本。只有当对象的内容发生变化时,才会创建新版本。
-
向一个版本控制的对象发出一个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>
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)