Windows 存储卸载的数据传输

概述

卸载的数据传输 (ODX) 是一项加快服务器复制和移动操作的功能。 此功能从 Windows Server 2012 开始可用,NTFS 卷支持此功能。 本页从存储设备的角度介绍 ODX。 有关文件系统和微筛选器的信息,请参阅 卸载的数据传输

Windows ODX 引入了一个标记化操作,用于在存储设备上移动数据。 源文件和目标文件可以位于同一卷上、同一计算机托管的两个不同的卷、通过服务器消息块 (SMB2 或 SMB3) 的本地卷和远程卷,或者通过 SMB2 或 SMB3 在两台不同计算机上的两个卷。 ODX 是在 Windows 8 中引入的。

下图显示了在支持 ODX 的存储设备上卸载复制操作的过程,如下所述。

使用 ODX 执行复制卸载操作。

  1. 复制应用程序将卸载读取请求发送到源存储设备的复制管理器。
  2. 源复制管理器返回令牌。 标记是要复制的 ROD) (数据的表示形式。
  3. 应用程序将带有令牌的卸载写入请求发送到目标存储设备的复制管理器。
  4. 存储阵列复制管理器将数据从源设备移动到目标设备,并将卸载写入结果返回到应用程序。

标识ODX-Capable源和目标

为了支持 ODX,存储阵列必须为支持 ODX 的存储阵列实现相关的 T10 标准规范,包括使用令牌卸载读取和写入操作。 在 LUN 设备枚举 (系统启动或即插即用事件) 期间,Windows 通过以下步骤收集或更新存储目标设备的 ODX 功能信息。

  1. 查询复制卸载功能。
  2. 收集复制卸载操作和限制所需的参数。

默认情况下,如果源 LUN 和目标 LUN 都支持 ODX,则 Windows 会首先尝试执行复制操作的 ODX 路径。 如果存储设备未能通过初始 ODX 请求,Windows 会将源 LUN 和目标 LUN 的组合标记为“不支持 ODX”路径,并遵循旧版复制文件代码路径。

ODX 读/写操作

同步命令采用和 API

使用以下算法拆分大型卸载写入请求,以确保可靠的同步卸载写入。

  • 如果目标存储设备不提供最佳传输大小,请将最佳传输大小设置为 64 MB。
  • 如果目标设备设置的最佳传输大小大于 256 MB,请将最佳传输大小设置为 256 MB。
  • 存储目标设备指定的最佳传输大小大于零且小于 256 MB。

同步卸载读取和卸载写入 SCSI 命令可减少 MPIO 和群集故障转移方案的复杂性。 Windows 要求复制管理器在 4 秒内完成同步卸载读/写 SCSI 命令。

应用程序可以使用 FSCTLDSM IOCTLSCSI_PASS_THROUGH API 与存储阵列进行交互并执行复制卸载操作。 为了避免数据损坏或系统不稳定,Windows 限制应用程序直接写入文件系统装载的卷,而无需先获取对卷的独占访问权限。 这是因为对卷的写入可能会与文件系统写入发生冲突。 发生此类冲突时,卷的内容可能会处于不一致状态。

卸载读取操作

应用程序的卸载读取请求可以指定令牌生存期 (非活动超时) 。 如果应用程序将令牌生存期设置为零,则默认非活动计时器将用作令牌生存期。 存储阵列的复制管理器根据其非活动超时值和凭据来维护和验证令牌。 Windows 主机还将文件片段数限制为 64。 如果卸载读取请求包含超过 64 个片段,则 Windows 将失败复制卸载请求,并回退到传统的复制操作。

完成卸载读取请求后,复制管理器为接收卸载读取结果命令准备数据 (ROD) 令牌的表示形式。 ROD 令牌字段指定用户数据和保护信息的时间点表示形式。 ROD 可以是“以独占方式打开”或“使用共享打开”格式的用户数据。 复制管理器可以根据其 ROD 策略设置使令牌失效。 如果 ROD 为复制卸载操作“独占打开”,则 ROD 令牌在修改或移动 ROD 时可能会失效。 如果 ROD 采用“使用共享打开”格式,则 ROD 令牌在修改 ROD 时仍然有效。 ROD 令牌为 512 字节,格式如下:

大小(以字节为单位) 令牌内容
4 ROD 令牌类型
508 ROD 令牌 ID

由于 ROD 令牌仅由存储阵列授予和使用,因此其格式不透明、唯一且高度安全。 如果令牌已修改、未验证或过期,则复制管理器可以在卸载写入操作期间使令牌失效。 从卸载读取操作返回的 ROD 令牌具有非活动超时值,指示复制管理器必须使令牌在下次使用令牌写入时保持有效的秒数。

卸载写入操作

从复制管理器接收 ROD 令牌后,应用程序会将带有 ROD 令牌的卸载写入请求发送到存储阵列的复制管理器。 当同步卸载写入命令发送到目标设备时,Windows 希望复制管理器在 4 秒内完成该命令。 如果命令因命令超时或其他错误条件而终止,则 Windows 将失败该命令。 应用程序根据返回的状态代码回退到旧版复制操作。

可以使用一个或多个“接收卸载写入结果”命令完成卸载写入请求。 如果卸载写入部分完成,复制管理器将返回估计延迟和传输计数数,以指示复制进度。 传输计数数指定从源介质写入到目标媒体且未出错的连续逻辑块的数目。 复制管理器可以按顺序或散点/收集模式执行卸载写入。

发生写入失败时,复制进度会将从第一个逻辑块到失败块的连续逻辑块计数。 客户端应用程序或复制引擎从写入失败块恢复卸载写入。 卸载写入完成后,复制管理器完成“接收 ROD 令牌信息”命令,估计状态更新延迟设置为零,数据传输计数的进度为 100%。 如果接收卸载写入结果返回数据传输计数的相同进度,则 Windows 在四次重试后,复制操作将失败回应用程序。

客户端应用程序还可以使用已知的 ROD 令牌执行卸载写入操作。 这是具有已知数据模式和令牌格式的预定义 ROD 令牌。 一个常见的实现称为零标记。 客户端应用程序可以使用零标记来填充一个或多个逻辑块范围的零。 如果已知令牌不受支持或不可识别,则复制管理器会因“令牌无效”而失败卸载写入请求。 众所周知的 ROD 令牌为 512 字节,格式如下:

大小(以字节为单位) 令牌内容
4 ROD 令牌类型
2 已知模式
506 ROD 令牌 ID

在使用已知 ROD 令牌的卸载写入中,客户端应用程序不能使用卸载读取来请求已知令牌。 复制管理器根据自己的策略验证和维护已知的 ROD 令牌。

ODX 实现的性能优化参数

ODX 的性能不依赖于服务器与存储阵列之间客户端-服务器网络或存储区域网络 (SAN) 的传输链接速度。 数据由存储阵列的复制管理器和设备服务器移动。

并非每个副本卸载都受益于 ODX 技术。 例如,1 Gbit iSCSI 存储阵列的复制管理器可以在 10 秒内完成 3 GB 的文件复制,数据传输速率将大于每秒 300 MB。 数据传输速率已超过 1 Gbit 以太网接口的最大理论传输速度。

此外,一定大小的文件的复制性能可能无法受益于 ODX 技术。 为了优化性能,可以将 ODX 的使用限制为允许的最小文件大小和最大复制长度。 注意:

  • Windows 在复制引擎中将复制卸载操作的最小文件大小要求设置为 256 KB。 如果文件小于 256 KB,则复制引擎会回退到旧版复制过程。

  • Windows 主机使用最大令牌传输大小和最佳传输计数来准备卸载读取或写入 SCSI 命令的最佳传输大小。 总传输大小(以块数为单位)不得超过最大令牌传输大小。 如果存储阵列未报告最佳传输计数,则 Windows 使用 64 MB 作为默认计数。

最佳和最大传输长度参数指定一个范围描述符中的最佳和最大块数。 复制卸载应用程序可以符合这些参数,以实现最佳的文件传输性能。

ODX 错误处理和高可用性支持

当 ODX 操作使文件复制请求失败时,复制引擎和 Windows 文件系统 (NTFS) 回退到旧版复制操作。 如果在卸载写入操作中复制卸载失败,则复制引擎和 NTFS 将从卸载写入中的第一个故障点恢复旧复制操作。

ODX 错误处理

ODX 根据存储阵列的功能使用可靠的错误处理算法。 如果在支持 ODX 的路径中复制卸载失败,Windows 主机希望应用程序回退到旧版复制操作。 此时,Windows 复制引擎已经实现了“回退到传统复制”机制。 复制卸载失败后,NTFS 会将源和目标 LUN 标记为不支持 ODX 三分钟。 经过这段时间后,Windows 复制引擎将重试 ODX 操作。 在高度紧张的情况下,存储阵列可以使用此功能在某些路径中暂时禁用 ODX 支持。

MPIO 和群集服务器配置中的 ODX 故障转移

必须从同一存储链接 (I_T nexus) 完成或取消卸载读取和写入操作。

在同步卸载读取或写入操作期间发生 MPIO 或群集服务器故障转移时,Windows 按如下所示处理故障转移:

  • 如果发生 MPIO 路径故障转移,Windows 会重试失败的 ODX 命令。 如果命令再次失败,Windows:

    • 在属于群集服务器时启动群集服务器节点故障转移。
    • 如果无法选择群集服务器故障转移,则向存储设备发出 LUN 重置,并将 I/O 失败状态返回给应用程序。
  • 在群集服务器配置中,群集存储服务故障转移到下一个首选群集节点,然后恢复群集存储服务。 卸载应用程序必须能够感知群集,以便能够在群集存储服务故障转移后重试卸载读/写命令。

如果在 MPIO 路径和群集节点故障转移后卸载读取或写入命令失败,Windows 在故障转移后会向存储设备发出 LUN 重置。 存储设备终止 LUN 上所有未完成的命令和挂起的操作。

目前,Windows 不会从存储堆栈发出异步卸载读取或写入 SCSI 命令。

ODX 使用模型

跨物理磁盘、虚拟硬盘和 SMB 共享磁盘的 ODX

若要执行 ODX 操作,应用程序服务器必须具有对源 LUN 和具有读/写特权的目标 LUN 的访问权限。 复制卸载应用程序向源 LUN 发出卸载读取请求,并从源 LUN 的复制管理器接收令牌。 复制卸载应用程序使用该令牌向目标 LUN 发出卸载写入请求。 然后,复制管理器通过存储网络将数据从源 LUN 移动到目标 LUN。 下图演示了卸载数据传输支持的最基本的源和目标目标。

支持的基本 ODX 源和目标。

使用一台服务器的 ODX 操作

在单服务器配置中,复制卸载应用程序会发出来自同一服务器系统的卸载读取和写入请求。

源服务器 (或源 VM) 可以访问源 LUN (VHD 或物理磁盘) 和目标 LUN (VHD 或物理磁盘) 。 复制卸载应用程序向源 LUN 发出卸载读取请求,并从源 LUN 接收令牌。 然后,复制卸载应用程序使用该令牌向目标 LUN 发出卸载写入请求。 复制管理器将数据从源 LUN 移动到同一存储阵列内的目标 LUN。

使用两台服务器的 ODX 操作

在双服务器配置中,有两个服务器和多个存储阵列由同一个复制管理器管理。

  • 一个服务器 (或 VM) 是源 LUN 的主机,另一个服务器 (或 VM) 是目标 LUN 的主机。 源服务器通过 SMB 协议与应用程序客户端共享源 LUN,目标服务器还通过 SMB 协议与应用程序客户端共享目标 LUN。 因此,应用程序客户端可以访问源 LUN 和目标 LUN。
  • 源和目标存储阵列由 SAN 配置中的同一个副本管理器管理。
  • 从应用程序客户端系统中,复制卸载应用程序向源 LUN 发出卸载读取请求,并从源 LUN 接收令牌,然后向目标 LUN 发出包含令牌的卸载写入请求。 复制管理器将数据从源 LUN 移动到目标 LUN,跨两个不同位置的两个不同存储阵列。

大规模数据迁移

大规模数据迁移是将大量数据(如数据库记录、电子表格、文本文件、扫描的文档和图像)导入新系统的过程。 数据迁移可能是由存储系统升级、新的数据库引擎或应用程序或业务流程的更改引起的。 如果旧存储系统可由新存储系统的复制管理器管理,则 ODX 可用于将数据从旧存储系统迁移到新存储系统。

  • 一台服务器是旧存储系统的主机,另一台服务器是新存储系统的主机。 源服务器通过 SMB 协议将源 LUN 共享为数据迁移应用程序客户端,目标服务器通过 SMB 协议将目标 LUN 共享为数据迁移应用程序客户端。 因此,应用程序客户端有权访问源 LUN 和目标 LUN。
  • 旧存储系统和新存储系统由 SAN 配置中的同一个副本管理器管理。
  • 从数据迁移应用程序客户端系统,复制卸载应用程序向源 LUN 发出卸载读取请求,并从源 LUN 接收令牌,然后向目标 LUN 发出包含令牌的卸载写入请求。 复制管理器将数据从源 LUN 移动到位于两个不同位置的两个不同存储系统的目标 LUN。
  • 也可以在同一位置使用一台服务器执行大规模数据迁移。

分层存储设备中的Host-Controlled数据传输

分层存储设备将数据分类为不同类型的存储媒体,以降低成本、提高性能并解决容量问题。 类别可以基于所需的保护级别、性能要求、使用频率和其他注意事项。

数据迁移策略在分层存储策略的最终结果中起着重要作用。 ODX 支持在分层存储设备中迁移主机控制的数据。 以下示例介绍两层存储设备中的 ODX:

  • 服务器是分层存储系统的主机。 源 LUN 是 Tier1 存储设备,目标 LUN 是 Tier2 存储设备。
  • 所有分层存储设备都由同一个复制管理器管理。
  • 在服务器系统中,数据迁移应用程序向源 LUN 发出卸载读取请求,并从源 LUN 接收令牌,然后向目标 LUN 发出包含令牌的卸载写入请求。 复制管理器将数据从源 LUN 移动到两个不同层存储设备的目标 LUN。
  • 数据迁移任务完成后,应用程序将从 Tier1 存储设备中删除数据并回收存储空间。