Windows 存储卸载的数据传输

Windows 卸载的数据传输 (ODX) 是一项可加快服务器复制和移动操作速度的功能。 它从 Windows Server 2012 开始提供,并且支持 NTFS 卷。

本文从存储设备的角度介绍 ODX。 有关文件系统和微型筛选器的信息,请参阅卸载的数据传输

概述

Windows ODX 引入了一种令牌化操作来移动存储设备上的数据,而不是在文件传输过程中复制大量数据。 源文件和目标文件可以位于以下任何位置:

  • 在同一卷上。
  • 在同一台计算机托管的两个不同卷上。
  • 通过服务器信息块(SMB2 或 SMB3)在本地卷和远程卷上。
  • 通过 SMB2 或 SMB3 在两台不同计算机的两个卷上。

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

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

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

标识支持 ODX 的源和目标

要支持 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 令牌,具有已知的数据模式和令牌格式。 一种常见的实现方式被称为“零令牌”。 客户端应用程序可以使用零令牌来为逻辑块的一个或多个范围填充零。 如果不支持或无法识别已知的令牌,则复制管理器会以“令牌无效”为由拒绝卸载写入请求。 已知的 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 和目标 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。
  • 大规模数据迁移也可通过同一地点的一台服务器进行。

分层存储设备中由主机控制的数据传输

分层存储设备会将数据分为不同类型的存储介质,以降低成本、提高性能并解决容量问题。 可根据所需的保护级别、性能要求、使用频率和其他考虑因素来进行分类。

数据迁移策略对分层存储策略的最终结果起着重要作用。 ODX 可在分层存储设备中实现由主机控制的数据迁移。 以下示例介绍了双层存储设备中的 ODX:

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