OpenStack Swift 元数据

Swift 元数据

一般来说,元数据是关于资源的信息,它与资源相关联,但不是资源本身所包含的数据——它是通过HTTP头设置和检索的。(例如,Swift对象的" Content-Type "在HTTP响应头中返回)

Swift中的所有用户资源(即帐户、容器、对象)都可以有与之关联的用户元数据。中间件还可以使用System metadata将自定义元数据安全地保存到帐户和容器中。在sysmeta之前的一些Swift核心特性已经为自定义的非用户元数据头添加了异常(例如ACLs大对象支持)。

用户元数据

用户元数据采用X-<type>-meta-<key>:<value>的形式,其中<type>取决于资源类型(即Account, Container, Object), <key><value>由客户端设置。

用户元数据通常应该保留给客户端或客户端应用程序使用。用户元数据的一个完美的用例是python-swiftclientX-Object-Meta-Mtime,它存储在它上传的对象上,以实现它的--changed选项,该选项只上传自上次上传以来更改的文件。

新中间件应该避免在用户元数据命名空间中存储元数据,以避免在引入新的元数据键时与现有用户元数据发生潜在冲突。借用用户元数据命名空间的旧中间件的一个示例是TempURL。使用自定义的非用户元数据来避免用户元数据命名空间的中间件的一个示例是静态大对象

由PUT或POST请求存储到容器或帐户资源的用户元数据将持续存在,直到它被后续的PUT或POST要求明确删除,该请求包括一个没有值的头 X-<type>-Meta-<key>或一个头X-Remove-<type>-Meta-<key>: <ignored-value>。在后一种情况下,不存储 <ignored-value>。删除帐户或容器时,将删除与帐户或容器资源一起存储的所有用户元数据。

与对象资源一起存储的用户元数据具有不同的语义;对象用户元数据一直存在,直到对同一对象发出任何后续的PUT或POST请求为止,此时与该对象一起存储的所有用户元数据都将被集体删除,并用PUT或POST要求中包含的任何用户元数据替换。因此,不可能在保持某些项目不变的情况下更新与对象一起存储的用户元数据项目的子集。

系统元数据

系统元数据采用X-<type>-Sysmeta-<key>: <value>的形式,其中<type>取决于资源类型(即Account, Container, Object), <key><value>由运行在Swift WSGI服务器上的可信代码设置。

在由任何中间件处理之前, X-<type>-Sysmeta-<key> 形式的客户端请求上的所有标头都将从请求中删除。在所有中间件处理完响应之后,但在将响应发送到客户端之前,来自后端系统的响应上以 X-<type>-Sysmeta-<key> 形式出现的所有标头都将被删除。参见GateKeeper中间件以获取更多信息。

系统元数据提供了一种方法,可以以安全可靠的方式将潜在的私有自定义元数据与相关的Swift资源存储在一起,而不必通过核心Swift服务器来查看自定义元数据。传入过滤器确保命名空间不能被客户端请求直接修改,而传出过滤器确保删除使用特定系统元数据键的中间件使其良性。新的中间件应该利用系统元数据。

系统元数据可以通过将头包括在PUT或POST请求中而在帐户和容器上设置。如果头名称与系统元数据的现有项的名称匹配,则将更新现有项的值。否则,将保留现有项目。具有空值的系统元数据头将导致删除具有相同名称的任何现有项。

只能使用PUT请求在对象上设置系统元数据。现有系统元数据的所有项都将被删除,并被PUT请求中包含的任何系统元数据头批量替换。系统元数据既不通过POST请求更新也不通过POST请求删除:与不支持更新用户元数据的单个项一样,还不支持通过POST请求更新系统元数据的单个项。在中间件需要通过POST请求存储自己的元数据的情况下,它可以使用Object Transient-Sysmeta。

Object Transient-Sysmeta

如果中间件需要在POST请求中存储对象元数据,它可以使用 X-Object-Transient-Sysmeta-<key>: <value>形式的标头来实现。

所有以X-Object-Transient-Sysmeta-<key>形式出现的客户端请求的头将在被任何中间件处理之前从请求中删除。在所有中间件处理完响应之后,在响应发送到客户端之前,所有以X-Object-Transient-Sysmeta-<key>形式的后端系统响应的头将被删除。请参阅GateKeeper中间件了解更多信息。

对象上的Transient-sysmeta更新与对象上的用户元数据更新具有相同的语义(参见user metadata),即每当对对象发出任何PUT或POST请求时,所有现有的Transient-sysmeta项都会被大量删除,并被包含在PUT或POST请求中的任何Transient-sysmeta所取代。因此,中间件设置的Transient-sysmeta很容易被后续客户端生成的POST请求删除,除非中间件小心地将其Transient-sysmeta包含在每个POST中。同样,客户端设置的用户元数据很容易被后续中间件生成的POST请求删除,因此中间件应该避免生成独立于任何客户端请求的POST请求。

Transient-sysmeta故意使用与用户元数据不同的头前缀,以便中间件可以避免与用户元数据键的潜在冲突。

Transient-sysmeta故意使用系统元数据不同的头前缀,以强调数据仅在后续POST之前保持不变的事实。

猜你喜欢

转载自blog.csdn.net/QTM_Gitee/article/details/131287111