对象版本控制¶
您可以存储内容的多个版本,以便从意外覆盖中恢复。对象版本控制是一种实现版本控制的简单方法,可用于任何类型的内容。
注意
您无法对大型对象清单文件进行版本控制,但大型对象清单文件可以指向已版本化的片段。
注意
强烈建议您将非当前对象放在与存储当前对象版本不同的容器中。
为了允许集群内的对象版本控制,云提供商应将 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 请求,将当前版本的对象复制到归档容器,然后从当前容器中删除它。后续对当前容器中对象的 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>