跳转到: 导航, 搜索

Swift/HighLatencyMedia

Swift的高延迟媒体/磁带支持

是什么?

一种以通用方式将 Swift 与高延迟存储后端(磁带、光盘、MAID 等)集成的设计和示例。

概述演示(东京峰会):http://www.slideshare.net/hseipp/adapting-swift-for-tape-storage-or-other-highlatency-media 和会话回放:https://youtu.be/6nWMRCKBs-o 更新的概述演示:http://www.slideshare.net/SlavisaSarafijanovic/swift-extensions-for-tape-storage-or-other-highlatency-media

代码仓库:https://github.com/ibm-research/SwiftHLM

它解决了什么问题?

所解决的问题是在 Swift 数据环内执行数据分层的大批量操作时,使高延迟存储后端能够良好且实用地使用。该功能可以看作是与Swift 数据分层规范中描述的环到环数据分层正交且互补的,如文档后面的章节中进一步讨论。

高延迟媒体的问题在于它不擅长处理许多独立请求,而这正是 Swift 代理层到 Swift 存储节点的工作负载情况。文件系统也面临并解决了类似的问题,典型的解决方案是

  1. 在大型容量和高延迟但通常廉价的存储层(例如磁带或光盘)之上使用低容量低延迟存储层(例如磁盘),并
  2. 提供一个用于在层之间移动数据的显式批量操作函数。批量操作允许优化请求顺序和资源利用率(例如磁带挂载),这对于使此类系统可用至关重要。第二个方面,即批量函数,已被证明对于一个实用的系统至关重要。值得一提的是,Amazon Glacier 也提供了一个批量操作接口,用于在访问这些对象之前预取对象。

术语

Swift 本地数据分层 (SLDT 或 LDT) 用于在 Swift 数据环内进行分层,而 Swift 数据分层 (SDT) 用于环到环数据分层。如果收到好的建议,可能会引入更合适的术语。

问题可以如何解决?

Swift 可以以通用方式实现一个用于在层之间移动数据的显式批量操作函数,该函数可以支持基于磁带、光盘或其他高延迟媒体的不同 LDT 兼容后端。可以集成以供 LDT 使用的现有后端示例包括 BDT 的磁带库连接器IBM 的 Spectrum Archive。总之,建议引入 Swift 本地数据分层接口扩展,在 Swift 中间件内实现。相同 Swift 中间件还实现了一个通用的函数和接口,用于控制基于 LDT 兼容 HLM 后端的,数据环内的本地分层操作。该概念如图 1 所示。

Ldt middleware concept.png

图 1。SwiftHLM 中间件为环内数据分层支持提供 Swift 接口扩展,并允许插入 LDT 兼容的 HLM 后端。这允许通过扩展的 Swift 接口控制基于后端构建的数据环内的分层操作。数据路径存储对象不变,除了通过中间件传递。可以配置两种控制路径中的一种:1) LDT 操作通过写入/读取文件系统 EA(扩展属性)来控制;2) LDT 中间件通过标准化的、例如基于命令行接口来控制后端。

支持的基本 LDT 操作集是

  • MIGRATE 将对象数据(或整个容器)从后端的低延迟存储(例如磁盘)迁移到高延迟存储(例如磁带或光盘)
  • RECALL 从后端的低延迟存储预取对象数据(或容器)到高延迟存储
  • STATUS 获取对象状态

可以通过添加新的请求类型或通过向现有的基于 URL 的请求添加修饰符来实现 LDT 操作的 Swift API 扩展。例如,要迁移对象或容器,可以将“?MIGRATE”修饰符添加到 POST 请求的 URL

  • http://SWIFT-URL/ACCT/CONT/OBJECT?MIGRATE
  • http://SWIFT-URL/ACCT/CONT?MIGRATE

可以对 recall 执行类似操作,例如将“?RECALL”修饰符添加到 POST 请求的 URL,对于状态,例如将“?STATUS”修饰符添加到 GET 请求的 URL。

扩展 Swift 接口以支持数据环内的此类显式批量 LDT 操作,应该会产生与集成高延迟媒体的文件系统看到的好处相同。进一步的扩展,例如设置 LDT 策略,以根据使用情况、年龄、大小等将数据迁移到廉价的高延迟层,也可能感兴趣。

关于 LDT 操作控制路径,由于 OpenStack Swift 通常将对象 EA 存储为存储对象数据的后端文件的一部分,因此这是一种将 LDT 请求传达给后端的方式。其他后端集成如果 Swift 中间件可以配置为直接与后端通信批量 LDT 请求,例如通过调用作为后端软件包的一部分提供的后端控制程序 (CP) 但使用标准化的接口,可能会更容易。支持这两种选项并使其可配置相对简单,但可以允许更多方更容易地集成支持高延迟媒体的存储解决方案,BDT 的磁带库连接器(开源解决方案)和 IBM 的 Spectrum Archive(专有企业级解决方案)是示例。

对于第二种配置选项,仅定义 SwiftLDT 中间件与后端 LDT 控制程序之间的接口,后端的内部结构及其 CP(如果使用)可能是专有的。例如,CP 可以伴随在代理节点上运行的服务器,并控制存储节点上的 LDT 操作。

为了更好地了解将批量操作集成到 Swift 中可能产生的影响,让我们简要了解磁带用例,因为它是一种用于长期廉价存储的最重要媒体。例如,来自 Swift 数据访问的独立文件访问将导致漫长的磁带搜索,平均为 10 秒,实际响应时间可能会更长(几分钟),因为请求排队和顺序服务。即使对于像 5GB 这样大的对象,驱动器利用率也很低,因为驱动器可能花费更多的时间进行搜索而不是服务数据,从而显着增加实现指定有效数据带宽所需的驱动器数量,这是另一个问题。由于磁带挂载和卸载,延迟进一步增加,由于 Swift 发起的独立请求,这将有很多。如果没有集成和使用后端的批量操作功能,该系统将很难使用。在 VancouverDiscussion 中,玩 Swift 对象访问超时而没有预取似乎也不是一个选项。

我们看到两种高级选项可以将批量操作集成到 Swift 中。

选项 1:LDT / 本地数据分层

一个选项是使用上述 LDT。这样,低延迟层可以独立使用,或者它可以作为环到环 Swift 数据分层 (SDT) 的目标,如 RingToRingTiering 中指定的。图 2 显示了 Swift 数据分层(在数据环之间)和 Swift 本地数据分层的共存和互补使用。

Sdt ldt.png

图 2。Swift 环到环数据分层 (SDT) 和 Swift 归档/本地数据分层 (LDT) 功能可以实现并用作正交和互补。SDT 将数据从一个数据环移动到另一个数据环,当访问或分层当前存储在第二个数据环的高延迟介质上的数据时,这可能无法正常工作。LDT 允许在同一数据环内将数据在低延迟存储和高延迟存储之间移动。一旦 LDT 将数据移动到低延迟介质,就可以从最初存储它的数据环访问该对象。

此选项的一个优点是模块化设计。基于 LDT 的数据环可以独立使用,也可以作为环到环分层的目标。该函数可以由环到环分层函数或用户外部调用。

选项 2:SDT / 环到环分层

将批量操作集成到 Swift 中的第二个选项是进一步增强 Swift 数据分层,如 RingToRingTiering 中提出的那样,以便它可以控制后端及其批量操作。在这种情况下,只有环到环分层的接口才对外可用。在这种情况下,高延迟媒体数据环不能独立使用。这是否是缺点或优点可能取决于用例。此外,如果实现了第一个选项,其功能可以透明地更改为基于环到环的分层,如果用户只想以这种方式管理数据。

重要的是要理解,不能通过仅仅为高延迟媒体后端提供不同的 DiskFile 实现来透明地添加批量 LDT 功能,因为批量 LDT 请求需要以某种方式传达给后端。

Swift 中间件后端集成

图 3 和图 4 显示了示例后端集成,分别配置和使用 EA 或 CP 控制路径。

Ldt ea control.png

图 3。Swift 和 LDT 兼容后端的示例集成,配置为使用专用的 Swift 扩展属性来控制 LDT。SwiftHLM 是添加到 Swift 的新的中间件组件,它扩展了 Swift 的 LDT 接口,Swift 的其余部分未被修改。Swift 数据路径保持未修改,目标是低延迟存储。在此配置中,LDT 控制路径通过使用专用的 EA 来存储 LDT 请求和对象的 LDT 状态来实现。后端 LDT 数据移动器组件 (B-LDT-DMC) 查看 LDT 专用属性(扫描或写入拦截),并在存储节点或数据环内将数据在低延迟和高延迟存储之间移动。

Ldt cp control.png

图 4。Swift 和 LDT 兼容后端的示例集成,配置为使用后端 LDT 控制程序 (B-LDT-CP) 来控制 LDT 操作。SwiftHLM 是添加到 Swift 的新的中间件组件,它扩展了 Swift 的 LDT 接口,Swift 的其余部分未被修改。Swift 数据路径保持未修改,目标是低延迟存储。在此配置中,LDT 控制路径通过 SwiftLDT 调用后端 LDT 控制程序 (B-LDT-CP) 来实现,然后调用后端 LDT 数据移动器组件 (B-LDT-DMC) 在存储节点或数据环内将数据在低延迟和高延迟存储之间移动