Red Hat Training

A Red Hat training course is available for RHEL 8

2.4. 选择 VDO 写入模式

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

2.4.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.4.2. VDO 写入模式的内部处理

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

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

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

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

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

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

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

流程

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

    # vdo status --name=my-vdo

    输出列表:

    • 配置的写入策略,它是从 syncasyncauto 中选择的选项
    • 写入策略,其是 VDO 应用的特定的写模式,即 syncasync

2.4.4. 检查易变的缓存

这个过程决定块设备是否有易变的缓存。您可以使用这些信息在 syncasync 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, doesn't support DPO or FUA
      sd 1:2:0:0: [sdb] Write cache: disabled, read cache: disabled, supports DPO and FUA
  2. 在上例中:

    • 设备 sda 表示它 一个回写缓存。对其使用 async 模式。
    • 设备 sdb 表示 它没有 一个回写缓存。对其使用 sync 模式。

    如果 cache_type 的值是 Nonewritethrough,您应该将 VDO 配置为使用 sync 写模式。

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 选项。