Red Hat Training

A Red Hat training course is available for RHEL 8

2.5. 在未清除关闭后恢复 VDO 卷

您可以在不干净的关机后恢复 VDO 卷,使其可以继续运行。任务通常是自动的。另外,由于过程中的故障,您可以在 VDO 卷创建失败后进行清理。

2.5.1. VDO 写入模式

VDO 支持以下写入模式:

sync

当 VDO 处于 sync 模式时,其上的层会假定写入命令将数据写入持久性存储。因此,文件系统或应用程序不需要发出 FLUSH 或强制单元访问(FUA)请求来使数据在关键点上变为持久。

只有在底层的存储保证数据在写命令完成后写入持久性存储时,才必须将 VDO 设为 sync 模式。也就是说,存储必须没有易变的写缓存,或者不通过缓存进行写入操作。

async

当 VDO 处于 async 模式时,VDO 不能保证在确认写命令时数据会被写入持久性存储。文件系统或应用程序必须发出 FLUSH 或 FUA 请求,来确保每次事务中数据在关键点上的持久性。

如果底层存储不能保证在写命令完成后数据被写入到持久性存储,必须将 VDO 设为 async 模式;也就是说当存储具有易失性写回缓存时。

async-unsafe

这个模式与 async 具有同样的属性,但它与原子性、一致性、隔离、持久性(ACID)不兼容。与 async 相比,async-unsafe 具有更好的性能。

警告

当假设 ACID 合规的应用程序或文件系统在 VDO 卷上运行时,sync-unsafe 模式可能会导致意外的数据丢失。

auto
auto 模式根据每个设备的特性自动选择 syncasync。这是默认选项。

2.5.2. VDO 卷恢复

当在一个非干净的关闭后重启一个 VDO 卷时,VDO 会执行以下操作:

  • 验证卷元数据的一致性。
  • 重建一部分元数据以便在需要时进行修复。

重建是自动的,不需要用户干预。

VDO 可能会重建不同的写入模式,具体取决于活跃的写入模式:

sync
如果 VDO 在同步存储上运行,且写策略被设为 sync,则写到卷的所有数据都可以被完全恢复。
async
如果写策略是 async 的,如果一些写不是持久化的,则它们可能无法被恢复。这可以通过发送 VDO FLUSH 命令或带有 FUA(强制单元访问)标记的写 I/O 来实现。您可以通过调用 fsyncfdatasyncsyncumount 等数据完整性操作来在用户模式下实现这一点。

在任何一种模式下,某些未被确认或未刷新的写也可能被重新构建。

自动和手动恢复

当 VDO 卷进入到 recovering 操作模式时,VDO 会在其重新上线后自动重建不干净的 VDO 卷。这叫做 在线恢复

如果 VDO 无法成功恢复 VDO 卷,它会将卷置于只读 操作模式下,该模式在卷重新启动时仍然有效。您需要强制重新构建来手动解决这个问题。

其它资源

2.5.3. VDO 操作模式

本节描述了指示 VDO 卷是否在正常运行或者正在从错误中恢复的模式。

您可以使用 vdostats --verbose device 命令显示 VDO 卷的当前操作模式。请参阅输出中的 Operating mode 属性。

normal
这是默认的操作模式。VDO 卷始终处于 normal 模式,除非以下其中一种状态强制使用不同的模式。新创建的 VDO 卷以 normal 模式启动。
recovering

当 VDO 卷在关闭前没有保存其所有元数据时,它会在下次启动时自动进入 recovering 模式。进入这个模式的典型原因是电源丢失或者基础存储设备出现问题。

recovering 模式下,VDO 将修复设备上每个物理块的引用数。恢复通常不需要非常长。时间取决于 VDO 卷的大小、基础存储设备的速度以及其它请求 VDO 同时处理的速度。VDO 卷通常具有以下例外:

  • 最初,在卷中写入请求的空间量可能会有所限制。当恢复了更多元数据后,更多的可用空间就会可用。
  • 如果数据位于尚未恢复的卷的一部分中,则在 VDO 卷恢复过程中的数据写入可能对崩溃前写入的数据不能去除重复数据。VDO 可在恢复卷时压缩数据。您仍然可以读取或覆盖压缩的块。
  • 在在线恢复过程中,某些统计数据不可用:例如,blocks in useblocks free。重建完成后就可使用这些统计数据。
  • 由于正在进行恢复工作,读取和写入的响应时间可能比通常要慢

您可以在 recovering 模式下安全地关闭 VDO 卷。如果恢复在关闭前没有完成,则设备将在下一次启动时再次进入 recovering 模式。

当 VDO 卷修复了所有引用数时,VDO 卷会自动退出 recovering 模式,并进入到 normal 模式。不需要管理员操作。详情请查看 第 2.5.4 节 “在线恢复 VDO 卷”

read-only

当 VDO 卷遇到严重的内部错误时,它会进入 read-only 模式。可能导致 read-only 模式的事件包括元数据崩溃或支持的存储设备变为只读。这个模式是一个错误状态。

read-only 模式下,数据读取通常会正常进行,但数据写入会始终失败。VDO 卷会一直处于 read-only 模式,直到管理员解决了问题。

您可以在 read-only 模式下安全地关闭 VDO 卷。VDO 卷重启后通常会保留这个模式。在个别情况下,VDO 卷无法将 read-only 状态记录到支持的存储设备中。在这种情况下,VDO 会尝试进行恢复。

当一个卷处于只读模式后,就无法保证卷中的数据不会被丢失或损坏。在这种情况下,红帽建议从只读卷中复制数据,并可能从备份中恢复卷。

如果数据崩溃的风险可以接受,则可以强制离线重新构建 VDO 卷元数据,以便将该卷重新在线并可用。无法保证重建数据的完整性。详情请查看 第 2.5.5 节 “强制 VDO 卷元数据离线重建”

2.5.4. 在线恢复 VDO 卷

此流程在一个 VDO 卷上执行在线恢复,以在未清除关闭后恢复元数据。

流程

  1. 如果 VDO 卷还没有启动,请启动它:

    # vdo start --name=my-vdo

    不需要额外的步骤。恢复在后台运行。

  2. 如果您依赖卷统计,比如 使用中的块 和块空闲,请等待这些数据可用。

2.5.5. 强制 VDO 卷元数据离线重建

此流程对 VDO 卷元数据执行强制离线重新构建,以便在不干净的关闭后进行恢复。

警告

此过程可能会导致卷的数据丢失。

先决条件

  • 已启动 VDO 卷。

流程

  1. 检查卷是否处于只读模式。查看命令输出中的 操作模式 属性:

    # vdo status --name=my-vdo

    如果卷不处于只读模式,则不需要强制离线重建。执行在线恢复,如 第 2.5.4 节 “在线恢复 VDO 卷” 中所述。

  2. 如果卷正在运行,请停止它:

    # vdo stop --name=my-vdo
  3. 使用 --forceRebuild 选项重启卷:

    # vdo start --name=my-vdo --forceRebuild

2.5.6. 删除失败创建的 VDO 卷

此流程清理处于中间状态的 VDO 卷。如果在创建卷时发生故障,则卷处于中间状态。这可能会在以下情况发生,例如:

  • 系统崩溃
  • 电源失败
  • 管理员中断了运行的 vdo create 命令

流程

  • 要进行清理,请使用 --force 选项删除创建失败的卷:

    # vdo remove --force --name=my-vdo

    需要 --force 选项,由于卷创建失败,管理员可能会由于更改了系统配置而导致冲突。

    如果没有 --force 选项,vdo remove 命令会失败,并显示以下信息:

    [...]
    A previous operation failed.
    Recovery from the failure either failed or was interrupted.
    Add '--force' to 'remove' to perform the following cleanup.
    Steps to clean up VDO my-vdo:
    umount -f /dev/mapper/my-vdo
    udevadm settle
    dmsetup remove my-vdo
    vdo: ERROR - VDO volume my-vdo previous operation (create) is incomplete