27.2. 维护 VDO


部署 VDO 卷后,您可以执行某些任务来维护或优化它。以下一些任务是 VDO 卷正常工作所必需的。

先决条件

27.2.1. 管理 VDO 卷的空闲空间

VDO 是一个精简配置的块存储目标。因此,您必须主动监控和管理 VDO 卷中的空间使用情况。

27.2.1.1. VDO 卷的物理和逻辑大小

VDO 使用以下方法使用物理、可用物理和逻辑大小:

物理大小

这与底层块设备的大小相同。VDO 使用这个存储用于:

  • 用户数据,这些数据可能会进行重复数据删除和压缩
  • VDO 元数据,如 UDS 索引
可用物理大小

这是 VDO 可用于用户数据的物理大小的一部分

它等同于物理大小减去元数据的大小,再减去将卷根据指定的 slab 的大小分为 slab 后剩余的值。

逻辑大小

这是 VDO 卷在应用程序中的置备大小。它通常大于可用的物理大小。如果没有指定 --vdoLogicalSize 选项,则逻辑卷的置备现在会被置备为 1:1 比例。例如,如果将 VDO 卷放在 20GB 块设备之上,则为 UDS 索引保留 2.5 GB(如果使用默认索引大小)。剩余的 17.5 GB 为 VDO 元数据和用户数据提供。因此,要消耗的可用存储不超过 17.5 GB,且可能会因为组成实际 VDO 卷的元数据而减少。

VDO 目前支持任意逻辑卷大小最多为物理卷的 254 倍,但不能超过 4PB。

图 27.5. VDO 磁盘机构

VDO 磁盘机构

在这个图表中,VDO 重复数据删除存储对象完全位于块设备之上,这意味着 VDO 卷的物理大小与基本块设备大小相同。

其它资源

27.2.1.2. VDO 中的精简置备

VDO 是一个精简配置的块存储目标。VDO 卷使用的物理空间量可能与为存储用户显示的卷大小有所不同。您可以使用它来节约存储成本。

没有可用空间条件

如果写入的数据没有达到预期的性能率,请小心会意外出现存储空间耗尽的问题。

每当逻辑块(虚拟存储)的数量超过物理块(实际存储)的数量时,文件系统和应用程序可能会意外地遇到没有存储空间的问题。因此,使用 VDO 的存储系统必须为您提供一个监控 VDO 卷中可用池大小的方法。

您可以使用 vdostats 程序确定这个可用池的大小。此实用程序的默认输出列出所有运行 VDO 卷的信息,其格式与 Linux df 实用程序类似。例如:

Device                1K-blocks   Used        Available   Use%
/dev/mapper/vdo-name  211812352   105906176   105906176   50%

当 VDO 卷的物理存储容量接近满时,VDO 在系统日志中报告警告,如下所示:

Oct  2 17:13:39 system lvm[13863]: Monitoring VDO pool vdo-name.
Oct  2 17:27:39 system lvm[13863]: WARNING: VDO pool vdo-name is now 80.69% full.
Oct  2 17:28:19 system lvm[13863]: WARNING: VDO pool vdo-name is now 85.25% full.
Oct  2 17:29:39 system lvm[13863]: WARNING: VDO pool vdo-name is now 90.64% full.
Oct  2 17:30:29 system lvm[13863]: WARNING: VDO pool vdo-name is now 96.07% full.
注意

这些警告信息只有在 lvm2-monitor 服务正在运行时才会出现。它会被默认启用。

如何防止没有空间的问题

如果可用池的大小低于一定级别,可以执行以下操作:

  • 删除数据。当删除的数据不再被重复时,可能重新获得可用空间。只有发出了签发后,删除数据才可以释放空间。
  • 添加物理存储
重要

监控 VDO 卷的物理空间,以防止出现空间不足的情况。物理块不足可能会导致 VDO 卷中最近写入的数据丢失。

精简配置以及 TRIM 和 DISCARD 命令

为从精简配置的存储节省中受益,物理存储层需要知道何时删除数据。使用精简配置的存储的文件系统发送 TRIMDISCARD 命令,以在不再需要逻辑块时告知存储系统。

有几种发送 TRIMDISCARD 命令的方法:

  • 使用 discard 挂载选项时,无论删除块时,文件系统都可发送这些命令。
  • 您可以使用 fstrim 等实用程序以受控的方式发送命令。这些工具告诉文件系统检测哪些逻辑块没有被使用,并以 TRIMDISCARD 命令的形式向存储系统发送信息。

在未使用的块中使用 TRIMDISCARD 对 VDO 并不是唯一的。任何精简置备的存储系统也会遇到同样的问题。

27.2.1.3. 监控 VDO

此流程描述了如何从 VDO 卷获取使用效率的信息。

先决条件

流程

  • 使用 vdostats 工具来获取有关 VDO 卷的信息:

    # vdostats --human-readable
    
    Device                   1K-blocks    Used     Available    Use%    Space saving%
    /dev/mapper/node1osd1    926.5G       21.0G    905.5G       2%      73%
    /dev/mapper/node1osd2    926.5G       28.2G    898.3G       3%      64%

其它资源

  • 您系统上的 vdostats (8) 手册页

27.2.1.4. 在文件系统中为 VDO 回收空间

此流程在托管文件系统的 VDO 卷中回收存储空间。

除非文件系统使用 DISCARDTRIMUNMAP 命令自由,否则 VDO 无法回收空间。

流程

  • 如果 VDO 卷中的文件系统支持丢弃(discard)操作,请启用它们。请参阅禁用未使用的块
  • 对于不使用 DISCARDTRIMUNMAP 的文件系统,您可以手动回收空闲空间。保存由二进制 0 组成的文件,以便占据空闲空间,然后删除该文件。

27.2.1.5. 在没有文件系统的情况下为 VDO 回收空间

此流程在在没有文件系统的情况下作为块存储目标的 VDO 卷中重新声明存储空间。

流程

  • 使用 blkdiscard 实用程序。

    例如,单个 VDO 卷可以通过在其之上部署 LVM 来划分到多个子卷中。在取消置备逻辑卷前,使用 blkdiscard 工具释放之前由该逻辑卷使用的空间。

    LVM 支持 REQ_DISCARD 命令,并在适当的逻辑块地址将请求转发到 VDO 以释放空间。如果您使用其他卷管理器,它们还需要支持 REQ_DISCARD、或等同的 SCSI 设备 UNMAP 用于 SCSI 设备,或者 TRIM 用于 ATA 设备。

其它资源

  • 系统中 blkdiscard (8) 手册页

27.2.1.6. 在光纤通道或以太网网络中为 VDO 回收空间

此流程回收 VDO 卷(或部分卷)中的存储空间,这些空间被置备到光纤通道存储结构上的主机或使用 LIO 或 SCST 等 SCSI 目标框架的以太网网络。

流程

  • SCSI 发起程序可以使用 UNMAP 命令在精简配置的存储目标上可用空间,但需要将 SCSI 目标框架配置为公告此命令支持。这通常通过在这些卷中启用精简配置来实现。

    运行以下命令,在基于 Linux 的 SCSI 发起程序中验证对 UNMAP 的支持:

    # sg_vpd --page=0xb0 /dev/device

    在输出中,验证 Maximum unmap LBA count 的值大于零。

27.2.2. 启动或停止 VDO 卷

您可以启动或停止给定的 VDO 卷或所有 VDO 卷及其关联的 UDS 索引。

27.2.2.1. 已启动并激活的 VDO 卷

在系统引导过程中,vdo systemd 单元 会自动启动 所有配置为 激活的 VDO 设备。

安装 vdo 软件包时,默认安装并启用 vdo systemd 单元。本单元会在系统启动时自动运行 vdo start --all 命令,以调出所有激活的 VDO 卷。

您还可以通过在 vdo create 命令中添加 --activate=disabled 选项来创建不会自动启动的 VDO 卷。

启动顺序

有些系统可能会将 LVM 卷放在 VDO 卷之上,或它们之下。在这些系统中,需要以正确顺序启动服务:

  1. 必须首先启动 LVM 的下层。在大多数系统中,当安装 LVM 软件包时会自动启动这个层。
  2. 然后,vdo systemd 单元必须启动。
  3. 最后,额外的脚本必须运行,才能在运行 VDO 卷之上启动 LVM 卷或其他服务。

停止卷所需的时间

停止 VDO 卷需要根据存储设备速度以及卷需要写入的数据量而有所不同:

  • 卷总是为每 1GiB UDS 索引写入大约 1GiB。
  • 卷还写入与块映射缓存大小相等的数据量,再加上每个 slab 最多 8MiB。
  • 卷必须完成处理所有未完成的 IO 请求。

27.2.2.2. 启动 VDO 卷

此流程启动给定 VDO 卷或系统中的所有 VDO 卷。

流程

  • 要启动给定的 VDO 卷,请使用:

    # vdo start --name=my-vdo
  • 要启动所有 VDO 卷,请使用:

    # vdo start --all

其它资源

  • 系统上的 VDO (8) 手册页

27.2.2.3. 停止 VDO 卷

此流程停止给定 VDO 卷或系统中的所有 VDO 卷。

流程

  1. 停止卷。

    • 要停止给定的 VDO 卷,请使用:

      # vdo stop --name=my-vdo
    • 要停止所有 VDO 卷,请使用:

      # vdo stop --all
  2. 等待卷完成向磁盘写入数据。

其它资源

  • 系统上的 VDO (8) 手册页

27.2.3. 系统引导时自动启动 VDO 卷

您可以配置 VDO 卷以便在系统引导时自动启动。您还可以禁用自动启动。

27.2.3.1. 已启动并激活的 VDO 卷

在系统引导过程中,vdo systemd 单元 会自动启动 所有配置为 激活的 VDO 设备。

安装 vdo 软件包时,默认安装并启用 vdo systemd 单元。本单元会在系统启动时自动运行 vdo start --all 命令,以调出所有激活的 VDO 卷。

您还可以通过在 vdo create 命令中添加 --activate=disabled 选项来创建不会自动启动的 VDO 卷。

启动顺序

有些系统可能会将 LVM 卷放在 VDO 卷之上,或它们之下。在这些系统中,需要以正确顺序启动服务:

  1. 必须首先启动 LVM 的下层。在大多数系统中,当安装 LVM 软件包时会自动启动这个层。
  2. 然后,vdo systemd 单元必须启动。
  3. 最后,额外的脚本必须运行,才能在运行 VDO 卷之上启动 LVM 卷或其他服务。

停止卷所需的时间

停止 VDO 卷需要根据存储设备速度以及卷需要写入的数据量而有所不同:

  • 卷总是为每 1GiB UDS 索引写入大约 1GiB。
  • 卷还写入与块映射缓存大小相等的数据量,再加上每个 slab 最多 8MiB。
  • 卷必须完成处理所有未完成的 IO 请求。

27.2.3.2. 激活 VDO 卷

此流程激活 VDO 卷使其自动启动。

流程

  • 激活一个特定卷:

    # vdo activate --name=my-vdo
  • 激活所有卷:

    # vdo activate --all

其它资源

  • 系统上的 VDO (8) 手册页

27.2.3.3. 取消激活 VDO 卷

此流程取消激活 VDO 卷以防止自动启动。

流程

  • 取消激活一个特定卷:

    # vdo deactivate --name=my-vdo
  • 取消激活所有卷:

    # vdo deactivate --all

其它资源

  • 系统上的 VDO (8) 手册页

27.2.4. 选择 VDO 写入模式

您可以根据基础块设备的要求,为 VDO 卷配置写入模式。默认情况下,VDO 选择自动写入模式。

27.2.4.1. VDO 写入模式

VDO 支持以下写入模式:

同步

当 VDO 处于 同步 模式时,它假定写入命令将数据写入持久性存储。因此,文件系统或应用程序不需要。例如,要发出 FLUSH 或强制单元访问(FUA)请求,从而导致数据在关键点具有持久性。

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

async

当 VDO 处于同步模式时,VDO 无法保证在确认写入命令时数据被写入持久性存储。文件系统或应用程序必须发出 FLUSH 或 FUA 请求,以确保每个事务的关键点上确保数据持久性。

如果底层存储无法保证在 write 命令完成时写入持久性存储,则必须将 VDO 设置为 async 模式。也就是说,当存储有易变的写回缓存时。

async-unsafe

这个模式具有与 async 相同的属性,但它与 Atomicity、Consistency、Isolation、Durability(ACID)不兼容。与异步 进行比较,async-unsafe 具有更好的性能。

警告

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

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

27.2.4.2. VDO 写入模式的内部处理

VDO 的写入模式是 syncasync。以下信息描述了这些模式的操作。

如果 kvdo 模块在同步(synch)模式下运行:

  1. 它会在请求中临时将数据写入分配块中,然后确认请求。
  2. 完成确认后,会尝试通过计算块数据的 MurmurHash-3 签名来重复数据删除块,后者会被发送到 VDO 索引。
  3. 如果 VDO 索引包含一个具有相同签名块的条目,kvdo 会读取指定的块,并对两个块进行字节字节的比较来验证它们是否相同。
  4. 如果它们实际上是相同的,则 kvdo 会更新其块映射,以便逻辑块指向对应的物理块,并释放分配的物理块。
  5. 如果 VDO 索引没有包含所写入块的签名条目,或者指定块实际上不包含相同的数据,kvdo 会更新其块映射以使临时物理块持久。

如果 kvdo 以异步(async)模式运行:

  1. 它将立即确认请求而不是写数据。
  2. 然后它会尝试使用与上述步骤相同的方法来复制块。
  3. 如果块变为重复,kvdo 会更新其块映射并释放分配的块。否则,它会将请求中的数据写入分配的块,并更新块映射使物理块持久。

27.2.4.3. 检查 VDO 卷中的写入模式

此流程列出了所选 VDO 卷中的主动写入模式。

流程

  • 使用以下命令查看 VDO 卷使用的写入模式:

    # vdo status --name=my-vdo

    输出列表:

    • 配置的写入策略,这是从同步、syncauto中选择的选项
    • 写入策略 (即 VDO 应用的特定写入模式)是 同步或 async

27.2.4.4. 检查易变的缓存

这个过程决定块设备是否有易变的缓存。您可以使用信息在 同步 和异步 VDO 写入模式 之间进行选择。

流程

  1. 使用以下方法之一确定某个设备是否有写回缓存:

    • 读取 /sys/block/block-device/device/scsi_disk/标识符/cache_type sysfs 文件。例如:

      $ cat '/sys/block/sda/device/scsi_disk/7:0:0:0/cache_type'
      
      write back
      $ cat '/sys/block/sdb/device/scsi_disk/1:2:0:0/cache_type'
      
      None
    • 另外,你可以在内核引导日志中找到上述设备是否有写缓存:

      sd 7:0:0:0: [sda] Write cache: enabled, read cache: enabled, does not support DPO or FUA
      sd 1:2:0:0: [sdb] Write cache: disabled, read cache: disabled, supports DPO and FUA
  2. 在上例中:

    • 设备 sda 表示 它具有 回写缓存。为它使用 async 模式。
    • 设备 sdb 表示 它没有 回写缓存。为 它使用同步 模式。

    如果 cache_type 值是 None,则应该将 VDO 配置为使用 同步 写入模式

27.2.4.5. 设置 VDO 写入模式

此流程为 VDO 卷设置写入模式,可以是现有或创建新卷时的写入模式。

重要

使用不正确的写入模式可能会导致电源失败后、系统崩溃或任何与磁盘联系的意外丢失。

先决条件

流程

  • 您可以在现有 VDO 卷上或创建新卷时设置写入模式:

    • 要修改现有的 VDO 卷,请使用:

      # vdo changeWritePolicy --writePolicy=sync|async|async-unsafe|auto \
                              --name=vdo-name
    • 要在创建 VDO 卷时指定写入模式,在 vdo create 命令中添加 --writePolicy=sync|async|async-unsafe|auto 选项。

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

您可以在未清除关闭后恢复 VDO 卷,以便继续操作。该任务大多是自动化的。另外,您可以清理 VDO 卷失败后因为进程中失败。

27.2.5.1. VDO 写入模式

VDO 支持以下写入模式:

同步

当 VDO 处于 同步 模式时,它假定写入命令将数据写入持久性存储。因此,文件系统或应用程序不需要。例如,要发出 FLUSH 或强制单元访问(FUA)请求,从而导致数据在关键点具有持久性。

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

async

当 VDO 处于同步模式时,VDO 无法保证在确认写入命令时数据被写入持久性存储。文件系统或应用程序必须发出 FLUSH 或 FUA 请求,以确保每个事务的关键点上确保数据持久性。

如果底层存储无法保证在 write 命令完成时写入持久性存储,则必须将 VDO 设置为 async 模式。也就是说,当存储有易变的写回缓存时。

async-unsafe

这个模式具有与 async 相同的属性,但它与 Atomicity、Consistency、Isolation、Durability(ACID)不兼容。与异步 进行比较,async-unsafe 具有更好的性能。

警告

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

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

27.2.5.2. VDO 卷恢复

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

  • 验证卷元数据的一致性。
  • 如果需要,重建一个元数据的一部分以修复它。

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

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

同步
如果 VDO 在同步存储上运行,并且写入策略被设置为 同步,则完全恢复写入卷的所有数据。
async
如果写入策略是 async,如果写入策略没有持久化,则可能无法恢复一些写入。这可以通过发送 VDO a FLUSH 命令或带有 FUA(强制单元访问)标记的写入 I/O 完成。您可以通过调用 fsyncfdatasyncsyncumount 等数据完整性操作来达到此目的。

在这两种模式下,一些在未确认或之后的写入可能也会被重建。

自动和手动恢复

当 VDO 卷进入 恢复操作 模式时,VDO 会在重新上线后自动重建未清除 VDO 卷。这叫做 在线恢复

如果 VDO 无法成功恢复 VDO 卷,它会将卷置于 只读 操作模式,并在卷重启后保留。您需要强制重新构建来手动解决这个问题。

其它资源

27.2.5.3. VDO 操作模式

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

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

Normal
这是默认的操作模式。VDO 卷总是处于 常规 模式,除非以下状态之一强制使用不同的模式。新创建的 VDO 卷以 正常 模式启动。
恢复

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

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

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

您可以在 恢复 模式下安全地关闭 VDO 卷。如果恢复在关闭前没有完成,该设备会再次进入 恢复 模式。

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

只读

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

只读 模式下,数据读取通常会正常工作,但数据写入总会失败。VDO 卷 处于只读模式,直到管理员解决了这个问题。

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

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

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

27.2.5.4. 在线恢复 VDO 卷

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

流程

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

    # vdo start --name=my-vdo

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

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

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

此流程执行 VDO 卷元数据的强制离线重建,以便在未清除关闭后进行恢复。

警告

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

先决条件

  • 已启动 VDO 卷。

流程

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

    # vdo status --name=my-vdo

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

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

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

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

27.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

27.2.6. 优化 UDS 索引

您可以配置特定的 UDS 索引设置以便在您的系统中优化它。

重要

创建 VDO 卷后,您无法更改 UDS 索引的属性。

27.2.6.1. VDO 卷的组件

VDO 使用块设备作为后备存储,它包括由一个或多个磁盘、分区甚至平面文件组成的物理存储聚合。当存储管理工具创建 VDO 卷时,VDO 为 UDS 索引和 VDO 卷保留卷空间。UDS 索引和 VDO 卷会一起交互,以提供重复的块存储。

图 27.6. VDO 磁盘机构

VDO 磁盘机构

VDO 解决方案包括以下组件:

kvdo

载入 Linux 设备映射器层的内核模块提供删除重复数据的、压缩和精简置备的块存储卷。

kvdo 模块公开一个块设备。对于块存储,您可以直接访问块存储或通过 Linux 文件系统(如 XFS 或 ext4)呈现它。

kvdo 收到一个读取 VDO 卷中数据的逻辑块的请求时,它会将请求的逻辑块映射到底层的物理块上,然后读取并返回请求的数据。

kvdo 收到一个向 VDO 卷写数据块的请求时,它首先检查请求是 DISCARD 还是 TRIM 请求,或者数据是否统一为零。如果其中任何一个条件为真,则 kvdo 会更新其块映射,并确认请求。否则,VDO 会处理并优化数据。

uds

与卷上通用的去除重复数据服务(UDS)索引通信的内核模块,并分析数据的重复内容。对于每个新的数据,UDS 可以快速地判断该数据是否与之前存储的数据相同。如果索引发现匹配项,则存储系统可在内部引用现有项,以避免多次保存相同的信息。

UDS 索引作为 uds 内核模块运行在内核中。

命令行工具
用于配置和管理优化的存储。

27.2.6.2. UDS 索引

VDO 使用名为 UDS 的高性能 deduplication 索引来检测正在存储的数据重复块。

UDS 索引提供了 VDO 产品的基础。对于每个新数据段,它会快速确定该数据段是否与之前存储的任何数据段相同。如果索引发现匹配项,则存储系统可在内部引用现有项,以避免多次保存相同的信息。

UDS 索引作为 uds 内核模块运行在内核中。

去除重复数据窗口 是索引记住的之前写入的块的数量。可配置去除重复数据窗口窗口的大小。对于给定的窗口大小,索引需要特定数量的 RAM 以及特定数量的磁盘空间。窗口的大小通常通过使用 --indexMem=size 选项指定索引内存的大小来决定。然后,VDO 决定自动使用的磁盘空间量。

UDS 索引由两个部分组成:

  • 在内存中使用紧凑表示,每个唯一块最多包含一个条目。
  • 记录在索引发生时的相关块名称的磁盘组件,按顺序记录。

UDS 在内存中平均每个条目使用 4 个字节,包括缓存。

磁盘上的组件维护传递给 UDS 的数据的相关历史记录。UDS 为属于这个去除重复数据窗口中的数据提供去除重复数据建议,其中包括最近看到的块的名称。去除重复数据窗口允许 UDS 尽可能高效地索引数据,同时限制索引大型数据存储库所需的内存量。尽管去除重复数据窗口具有局限性,但大部分具有大量去除重复数据的数据集也表现出高度的时间局部性 - 换句话说,大多数去除重复数据发生在几乎同时写入的块集合中。另外,通常要写入的数据通常可能会与最近写入的数据重复。因此,对于给定时间间隔的工作负载,去除重复数据比率通常相同,无论 UDS 仅索引了最新的数据还是所有数据。

由于重复数据往往会表现出时间局部性,因此很少需要对存储系统中的每个块进行索引。否则,索引内存的成本会耗尽导致复制性能降低的存储成本。索引大小要求与数据刷新率紧密相关。例如,假设存储系统的总容量为 100 TB,但每周的摄取率为 1 TB 。UDS 窗口的 deduplication 窗口为 4TB,UDS 可探测到上个月写入的数据的最大冗余度。

27.2.7. 在 VDO 中启用或禁用 deduplication

在某些情况下,您可能希望临时禁用写入 VDO 卷的删除重复数据功能,同时仍可保留从卷读取和写入的功能。禁用 deduplication 可防止后续写入操作被删除重复数据,但已经删除重复数据的数据会一直保留。

27.2.7.1. VDO 中的删除重复数据

删除重复数据(Deduplication)是通过删除重复块的多个副本来减少存储资源消耗的技术。

VDO 检测每个重复块,并将其记录为对原始块的引用,而不是多次写相同的数据。VDO 维护一个从逻辑块地址(由 VDO 上面的存储层使用)到物理块地址(被 VDO 下的存储层使用)的映射。

在进行删除重复数据后,可将多个逻辑块地址映射到相同的物理块地址。这些被称为共享块。块共享对存储用户是不可见的,用户会像 VDO 不存在一样读写块。

当共享块被覆盖时,VDO 为保存新块数据分配一个新的物理块,以确保映射到共享物理块的其他逻辑块地址不会被修改。

27.2.7.2. 在 VDO 卷中启用 deduplication

此流程重启关联的 UDS 索引,并通知 VDO 卷再次激活了 deduplication。

注意

默认启用 deduplication。

流程

  • 要在 VDO 卷上重启 deduplication,请使用以下命令:

    # vdo enableDeduplication --name=my-vdo

27.2.7.3. 禁用 VDO 卷上的重复数据删除

此流程停止关联的 UDS 索引,并通知 VDO 卷 deduplication 不再处于活动状态。

流程

  • 要在 VDO 卷上停止 deduplication,请使用以下命令:

    # vdo disableDeduplication --name=my-vdo
  • 您还可以通过在 vdo create 命令中添加 --deduplication=disabled 选项,在创建新 VDO 卷时禁用 deduplication。

27.2.8. 在 VDO 中启用或禁用压缩

VDO 提供数据压缩。禁用它可以最大限度地提高性能,并加快不太可能压缩的数据的处理。重新启用它可以节省空间。

27.2.8.1. VDO 中的压缩

除了块级 deduplication 外,VDO 还提供使用 HIOPS 压缩™ 技术的内联块级压缩。

VDO 卷压缩默认是 on。

虽然 deduplication 对虚拟机环境和备份应用程序是最佳解决方案,但压缩非常适合结构化和非结构化的文件格式,这些文件格式通常不会展示块级冗余,如日志文件和数据库。

压缩对未识别为重复的块进行操作。当 VDO 首次看到唯一数据时,它会压缩数据。已存储的数据的后续副本会复制,而无需额外的压缩步骤。

压缩功能基于一种基于并行的打包算法,其允许一次处理许多压缩操作。在首先存储块并响应请求者后,最佳打包算法会找到多个块,当压缩时,这些块可以放入一个物理块中。确定特定的物理块不太可能保存其他压缩块后,它将被写入存储,并且未压缩块的被释放并被重复使用。

在已经响应请求者后执行压缩和打包操作,使用压缩会带来最小的延迟损失。

27.2.8.2. 在 VDO 卷中启用压缩

此流程启用了 VDO 卷的压缩来提高空间节能。

注意

默认启用压缩。

流程

  • 要再次启动它,请使用以下命令:

    # vdo enableCompression --name=my-vdo

27.2.8.3. 禁用 VDO 卷上的压缩

此流程停止 VDO 卷的压缩,以最大化性能或加快对数据进行压缩的速度。

流程

  • 要停止在现有 VDO 卷中压缩,请使用以下命令:

    # vdo disableCompression --name=my-vdo
  • 另外,在创建新卷时,您可以在 vdo create 命令中添加 --compression=disabled 选项来禁用压缩。

27.2.9. 增大 VDO 卷的大小

您可以增加 VDO 卷的物理大小,以利用更多的底层存储容量,或者增加逻辑大小以在卷上提供更多的容量。

27.2.9.1. VDO 卷的物理和逻辑大小

VDO 使用以下方法利用物理、可用物理和逻辑大小:

物理大小

这与底层块设备的大小相同。VDO 使用这个存储用于:

  • 用户数据,这些数据可能会进行重复数据删除和压缩
  • VDO 元数据,如 UDS 索引
可用物理大小

这是 VDO 可用于用户数据的物理大小的一部分

它等同于物理大小减去元数据的大小,再减去将卷根据指定的 slab 的大小分为 slab 后剩余的值。

逻辑大小

这是 VDO 卷在应用程序中的置备大小。它通常大于可用的物理大小。如果没有指定 --vdoLogicalSize 选项,则逻辑卷的调配现在被配置为 1:1 的比率。例如,如果将 VDO 卷放在 20GB 块设备之上,则为 UDS 索引保留 2.5 GB(如果使用默认索引大小)。剩余的 17.5 GB 为 VDO 元数据和用户数据提供。因此,要消耗的可用存储不超过 17.5 GB,且可能会因为组成实际 VDO 卷的元数据而减少。

VDO 目前支持任意逻辑卷大小最多为物理卷的 254 倍,但不能超过 4PB。

图 27.7. VDO 磁盘机构

VDO 磁盘机构

在这个图表中,VDO 重复数据删除存储对象完全位于块设备之上,这意味着 VDO 卷的物理大小与基本块设备大小相同。

其他资源

27.2.9.2. VDO 中的精简置备

VDO 是一个精简配置的块存储目标。VDO 卷使用的物理空间量可能与为存储用户显示的卷大小有所不同。您可以使用它来节约存储成本。

没有可用空间条件

如果写入的数据没有达到预期的性能率,请小心会意外出现存储空间耗尽的问题。

每当逻辑块(虚拟存储)的数量超过物理块(实际存储)的数量时,文件系统和应用程序可能会意外地遇到没有存储空间的问题。因此,使用 VDO 的存储系统必须为您提供一个监控 VDO 卷中可用池大小的方法。

您可以使用 vdostats 工具来确定此空闲池的大小。这个工具的默认输出会列出所有运行 VDO 卷的信息,其格式与 Linux df 工具列出的格式类似。例如:

Device                1K-blocks   Used        Available   Use%
/dev/mapper/vdo-name  211812352   105906176   105906176   50%

当 VDO 卷的物理存储容量接近满时,VDO 在系统日志中报告警告,如下所示:

Oct  2 17:13:39 system lvm[13863]: Monitoring VDO pool vdo-name.
Oct  2 17:27:39 system lvm[13863]: WARNING: VDO pool vdo-name is now 80.69% full.
Oct  2 17:28:19 system lvm[13863]: WARNING: VDO pool vdo-name is now 85.25% full.
Oct  2 17:29:39 system lvm[13863]: WARNING: VDO pool vdo-name is now 90.64% full.
Oct  2 17:30:29 system lvm[13863]: WARNING: VDO pool vdo-name is now 96.07% full.
注意

这些警告消息只有在 lvm2-monitor 服务运行时才会出现。它会被默认启用。

如何防止没有空间的问题

如果可用池的大小低于一定级别,可以执行以下操作:

  • 删除数据。当删除的数据不再被重复时,可能重新获得可用空间。只有发出了签发后,删除数据才可以释放空间。
  • 添加物理存储
重要

监控 VDO 卷的物理空间,以防止出现空间不足的情况。物理块不足可能会导致 VDO 卷中最近写入的数据丢失。

精简配置以及 TRIM 和 DISCARD 命令

要从精简配置节省的存储中受益,物理存储层需要知道数据何时被删除的。与精简配置存储一起工作的文件系统会发送 TRIMDISCARD 命令,来在不再需要逻辑块时通知存储系统。

有几种发送 TRIM 或 DISCARD 命令的方法:

  • 通过 discard 挂载选项,文件系统可以在删除块时发送这些命令。
  • 您可以通过使用 fstrim 等工具以受控的方式发送命令。这些工具告诉文件系统检测哪些逻辑块未使用,并以 TRIMDISCARD 命令的形式向存储系统发送信息。

对未使用的块使用 TRIM 或 DISCARD 并不是 VDO 独有的。任何精简置备的存储系统也会遇到同样的问题。

27.2.9.3. 增大 VDO 卷的逻辑卷大小

这个过程会增加给定 VDO 卷的逻辑大小。它允许您首先创建具有逻辑大小足够小的 VDO 卷,使其安全而无法耗尽空间。一段时间后,您可以评估实际的数据减少率,如果足够的话,您可以增大 VDO 卷的逻辑大小以利用节省的空间。

不可能缩小 VDO 卷的逻辑卷大小。

流程

  • 要增大逻辑大小,请使用:

    # vdo growLogical --name=my-vdo \
                      --vdoLogicalSize=new-logical-size

    当逻辑卷增大时,VDO 会报告有新的大小卷上的任何设备或文件系统。

27.2.9.4. 增加 VDO 卷的物理大小

此流程增加 VDO 卷可以使用的物理存储量。

不可能以这种方式缩小 VDO 卷。

先决条件

  • 基础块设备的容量大于 VDO 卷的当前物理大小。

    如果不是这样,您可以尝试增加设备的大小。确切的流程取决于设备的类型。例如:要调整 MBR 或 GPT 分区的大小,请参阅 管理存储设备 指南中的 重新调整分区大小 部分。

流程

  • 为 VDO 卷添加新物理存储空间:

    # vdo growPhysical --name=my-vdo

27.2.10. 删除 VDO 卷

您可以删除系统中的现有 VDO 卷。

27.2.10.1. 删除一个有效的 VDO 卷

此流程移除 VDO 卷及其关联的 UDS 索引。

流程

  1. 卸载文件系统并停止使用 VDO 卷中的存储的应用程序。
  2. 要从您的系统中删除 VDO 卷,请使用:

    # vdo remove --name=my-vdo

27.2.10.2. 删除失败创建的 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.