30.4. 管理 VDO
30.4.1. 启动或停止 VDO
要启动给定的 VDO 卷或所有 VDO 卷以及关联的 UDS 索引,存储管理工具应调用其中一个命令:
#
vdo start --name=my_vdo#
vdo start --all
安装 vdo 软件包时,默认安装并启用 VDO systemd 单元。这个单元会在系统启动时自动运行 vdo start --all 命令,以启动所有 激活的 VDO 卷。请参阅 第 30.4.6 节 “在系统引导时自动启动 VDO 卷” 了解更多信息。
要停止给定的 VDO 卷或所有 VDO 卷,以及相关的 UDS 索引,请使用以下命令之一:
#
vdo stop --name=my_vdo#
vdo stop --all
停止 VDO 卷需要根据存储设备速度以及卷需要写入的数据量而有所不同:
- 卷总是为每 1GiB UDS 索引写入大约 1GiB。
- 使用稀疏 UDS 索引,卷还会写入与块映射缓存大小相等的数据量,再加上每个 slab 的 8MiB。
如果在未完全关闭后重启,VDO 将执行重建以验证其元数据的一致性,并在需要时进行修复。重建是自动的,不需要用户干预。有关重建过程的更多信息,请参阅 第 30.4.5 节 “在 Unclean Shutdown 后恢复 VDO 卷”。
VDO 可能会重建不同的写入模式,具体取决于写入模式:
- 在同步模式下,在关闭前被 VDO 确认的所有写入都会被重建。
- 在异步模式中,在最后一次确认刷新请求之前确认的所有写入都会被重新构建。
在任一模式中,一些未确认或未刷新的写入也可能被重建。
有关 VDO 写入模式的详情,请参考 第 30.4.2 节 “选择 VDO 写入模式”。
30.4.2. 选择 VDO 写入模式
VDO 支持三种写入模式、同步、
sync
和 auto
:
- 当 VDO 处于
同步
模式时,它假定写入命令将数据写入持久性存储。因此,文件系统或应用程序不需要发出 FLUSH 或 Force unit Access (FUA)请求,从而导致数据在关键点变为持久。只有当底层存储保证数据在 write 命令完成后写入持久性存储时,才必须将 VDO 设置为sync
模式。也就是说,存储必须没有易变的写缓存,或者不通过缓存进行写入操作。 - 当 VDO 处于
async
模式时,无法保证在确认写命令时写入持久性存储。文件系统或应用程序必须发出 FLUSH 或 FUA 请求,来确保每次事务中数据在关键点上的持久性。如果底层存储无法保证在写命令完成后写入持久性存储,则必须将 VDO 设置为async
模式;也就是说,当存储具有易失性写回缓存时。有关如何查找设备是否使用易失性缓存或未易失性的详情,请参考 “检查 Volatile Cache”一节。警告当 VDO 以async
模式运行时,它与 Atomicity, Consistency, Isolation, Durability (ACID)不兼容。当 VDO 卷之上假设 ACID 合规性的应用程序或文件系统时,sync mode 可能会导致意外的数据丢失。 auto
模式根据每个设备的特性自动选择sync
或async
。这是默认选项。
有关写入策略如何操作的详情,请参考 “VDO 写策略概述”一节。
要设置写入策略,请使用
--writePolicy
选项。这可以在创建 VDO 卷时指定为 第 30.3.3 节 “创建 VDO 卷”,或使用 changeWritePolicy 子命令修改现有 VDO 卷时:
#
vdo changeWritePolicy --writePolicy=sync|async|auto --name=vdo_name
重要
使用不正确的写入策略可能会导致数据丢失。
检查 Volatile Cache
要查看设备是否具有回写缓存,请阅读
/sys/block/block_device/device/scsi_disk/标识符/cache_type
sysfs 文件。例如:
- 设备
sda
表示 它有一个 回写缓存:$
cat '/sys/block/sda/device/scsi_disk/7:0:0:0/cache_type' write back - 设备
sdb
表示 它没有 回写缓存:$
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
有关读取 系统日志的更多信息,请参阅系统管理员指南中的 查看和管理 日志文件章节。
在这些示例中,为 VDO 使用以下写入策略:
sda
设备的async
模式sdb
设备的同步
模式
注意
如果
cache_type
值是 none
或通过 写入,则您应该将 VDO 配置为使用 同步
写入策略
。
30.4.3. 删除 VDO 卷
可运行以下命令来从系统中删除 VDO 卷:
#
vdo remove --name=my_vdo
在删除 VDO 卷前,卸载文件系统并停止使用存储的应用程序。vdo remove 命令删除 VDO 卷及其关联的 UDS 索引,以及它们所在的逻辑卷。
30.4.3.1. 删除 Unsuccessfully Created 卷
如果在
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
30.4.4. 配置 UDS Index
VDO 使用名为 UDS 的高性能 deduplication 索引来检测正在存储的数据重复块。去除重复数据窗口 是索引记住之前写入的块的数量。可配置去除重复数据窗口窗口的大小。对于给定的窗口大小,索引需要特定数量的 RAM 以及特定数量的磁盘空间。窗口的大小通常通过使用
--indexMem=size
选项指定索引内存的大小来确定。然后会自动决定要使用的磁盘空间量。
通常,红帽建议在所有生产用例中使用 稀疏 UDS 索引。这是一个非常高效的索引数据结构,在其去除重复数据窗口中每个块大约需要一字节 DRAM。在磁盘上,每个块大约需要 72 字节磁盘空间。这个索引的最小配置使用 256 MB 的 DRAM 和大约 25 GB 空间。要使用此配置,请在 vdo create 命令中指定
--sparseIndex=enabled --indexMem=0.25
选项。这个配置会导致一个 deduplication 窗口 2.5 TB(也就是说它会记住 2.5 TB 的历史记录)。在大多数用例中,2.5 TB 的去除重复数据窗口适合用于大小高达 10 TB 的去除重复数据存储池。
但是,索引的默认配置是使用 密度 索引。DRAM 中的这个索引效率要低得多(10 倍),但它的最少需要磁盘空间(也是 10 倍)最少需要磁盘空间,使其更便于在受限环境中进行评估。
通常,建议配置一个 VDO 卷的物理大小的 deduplication 窗口。但这不是实际要求。即便是小的去除重复数据窗口(与物理存储量相比)也可以在许多用例中发现大量重复的数据。也可以使用较大的窗口,但多数情况下,这样做将无用。
请联系您的红帽大客户经理代表以获得有关调整此重要系统参数的其他指南。
30.4.5. 在 Unclean Shutdown 后恢复 VDO 卷
如果在不完全关闭的情况下重启卷,VDO 将需要重建一部分元数据才能继续操作,这在卷启动时会自动发生。(另请参阅 第 30.4.5.2 节 “强制重新构建” 在完全关闭的卷中调用此过程。)
数据恢复取决于设备的写入策略:
- 如果 VDO 在同步存储上运行,并且写入策略被设置为
同步
,那么写入卷的所有数据都将完全恢复。 - 如果写入策略是
async
的,则在通过发送 VDO 命令或带有FLUSH
标志(强制单元访问)标记的写入 I/O 时可能无法恢复一些写入。FUA
这可以通过调用fsync
、fdatasync
、sync
或umount
等数据完整性操作来实现。
30.4.5.1. 在线恢复
在大多数情况下,重建未清理的 VDO 卷的大多数工作可以在 VDO 卷恢复在线后执行,同时为读取和写入请求提供服务。最初,写入请求的可用空间量可能会限制。当恢复卷的元数据的更多信息,更多可用空间可能会变得可用。另外,如果数据位于尚未恢复的卷的一部分,则在 VDO 恢复时写入的数据可能无法对崩溃前写入的数据进行重复数据删除。在卷被恢复时,可以压缩数据。之前压缩的块可能仍然被读或覆盖。
在线恢复期间,将无法使用很多统计数据:例如,
使用中的
块和 块 free
。重建完成后,这些统计数据将可用。
30.4.5.2. 强制重新构建
VDO 可以从大多数硬件和软件错误中恢复。如果 VDO 卷无法成功恢复,则会将其置于在卷重启后保留的只读模式。当卷处于只读模式后,就无法保证数据没有丢失或损坏。在这种情况下,红帽建议从只读卷中复制数据,并可能从备份中恢复卷。( vdostats
的操作模式
属性指示 VDO 卷是否处于只读模式。)
如果数据崩溃的风险可以接受,则可以强制离线重新构建 VDO 卷元数据,以便将该卷重新在线并可用。同样,无法保证重建数据的完整性。
要强制重建只读 VDO 卷,如果卷正在运行,首先停止该卷:
#
vdo stop --name=my_vdo
然后,使用
--forceRebuild
选项重启卷:
#
vdo start --name=my_vdo --forceRebuild
30.4.6. 在系统引导时自动启动 VDO 卷
在系统引导过程中,
vdo
systemd 单元会自动启动所有配置为 激活 的 VDO 设备。
要防止某些现有卷自动启动,请运行以下命令来 停用 这些卷:
- 取消激活一个特定卷:
#
vdo deactivate --name=my_vdo - 取消激活所有卷:
#
vdo deactivate --all
相反,要激活卷,请使用以下命令之一:
- 激活一个特定卷:
#
vdo activate --name=my_vdo - 激活所有卷:
#
vdo activate --all
您还可以通过在 vdo create 命令中添加
--activate=disabled
选项来创建不自动启动的 VDO 卷。
对于将 LVM 卷放在 VDO 卷之上以及它们下的系统(例如 图 30.5 “去除重复数据的统一存储”),以正确顺序启动服务非常重要:
- 必须首先启动 LVM 的下层(在大多数系统中,当安装 LVM2 软件包时,会自动配置这个层)。
- 然后,必须启动
vdo
systemd 单元。 - 最后,必须运行其他脚本,以便在现在运行 VDO 卷之上启动 LVM 卷或其他服务。
30.4.7. 禁用和重新启用重复数据删除
在某些情况下,可能需要临时禁用写入 VDO 卷的去除重复数据,同时仍保留从卷读取和写入的功能。禁用 deduplication 可防止后续写入操作被重复数据删除,但已经删除重复数据的数据仍会保留。
- 要在 VDO 卷上停止 deduplication,请使用以下命令:
#
vdo disableDeduplication --name=my_vdo这会停止关联的 UDS 索引,并通知 VDO 卷 deduplication 不再活跃。 - 要在 VDO 卷上重启 deduplication,请使用以下命令:
#
vdo enableDeduplication --name=my_vdo这会重启关联的 UDS 索引,并通知 VDO 卷再次激活 deduplication。
您还可以通过在 vdo create 命令中添加
--deduplication=disabled
选项,在创建新 VDO 卷时禁用 deduplication。
30.4.8. 使用压缩
30.4.8.1. 简介
除了块级 deduplication 外,VDO 还使用 HIOPS Compression™ 技术提供内联块级压缩。虽然 deduplication 对虚拟机环境和备份应用程序是最佳解决方案,但压缩非常适合结构化和非结构化的文件格式,这些文件格式通常不会展示块级冗余,如日志文件和数据库。
压缩对未识别为重复的块进行操作。第一次看到唯一数据时,它将被压缩。已存储的数据的后续副本会复制,而无需额外的压缩步骤。压缩功能基于一种基于并行的打包算法,其允许一次处理许多压缩操作。在首先存储块并响应请求者后,最佳打包算法会找到多个块,当压缩时,这些块可以放入一个物理块中。确定特定的物理块不太可能保存其他压缩块后,它将被写入存储,并且未压缩块的被释放并被重复使用。在已经响应请求者后执行压缩和打包操作,使用压缩会带来最小的延迟损失。
30.4.8.2. 启用和禁用压缩
VDO 卷压缩默认是 on。
在创建卷时,您可以通过在 vdo create 命令中添加
--compression=disabled
选项来禁用压缩。
如果需要,可以在现有 VDO 卷上停止压缩,也可以加快对性能的处理速度,不太可能压缩。
- 要停止 VDO 卷上的压缩,请使用以下命令:
#
vdo disableCompression --name=my_vdo - 要再次启动它,请使用以下命令:
#
vdo enableCompression --name=my_vdo
30.4.9. 管理可用空间
因为 VDO 是一个精简配置的块存储目标,所以 VDO 使用的物理空间量可能与提供给存储用户的卷大小不同。整合商和系统管理员可以利用这种差异化,以节省存储成本,但如果写入的数据无法达到预期去除重复数据率,则必须小心地避免意外耗尽存储空间。
每当逻辑块(虚拟存储)的数量超过物理块(实际存储)的数量时,文件系统和应用程序可能会意外地遇到没有存储空间的问题。因此,使用 VDO 的存储系统必须为存储管理员提供监控 VDO 空闲池大小的方法。这个可用池的大小可以通过使用
vdostats
工具来决定 ; 详情请查看 第 30.7.2 节 “vdostats”。此工具的默认输出列出所有运行 VDO 卷的信息,其格式与 Linux df
实用程序类似。例如:
Device 1K-blocks Used Available Use% /dev/mapper/my_vdo 211812352 105906176 105906176 50%
当 VDO 卷的物理存储容量接近满时,VDO 在系统日志中报告警告,如下所示:
Oct 2 17:13:39 system lvm[13863]: Monitoring VDO pool my_vdo. Oct 2 17:27:39 system lvm[13863]: WARNING: VDO pool my_vdo is now 80.69% full. Oct 2 17:28:19 system lvm[13863]: WARNING: VDO pool my_vdo is now 85.25% full. Oct 2 17:29:39 system lvm[13863]: WARNING: VDO pool my_vdo is now 90.64% full. Oct 2 17:30:29 system lvm[13863]: WARNING: VDO pool my_vdo is now 96.07% full.
如果 VDO 的可用池大小低于某个级别,则存储管理员可以通过删除数据来采取行动(当删除的数据没有重复时回收空间)、添加物理存储甚至删除 LUN。
重要
监控 VDO 卷的物理空间,以防止出现空间不足的情况。物理块不足可能会导致 VDO 卷中最近写入的数据丢失。
在文件系统上重新声明空间
除非文件系统使用
DISCARD
、TRIM
或 UNMAP
命令告知块是空闲的,否则 VDO 无法回收空间。对于不使用 DISCARD
、TRIM
或 UNMAP
的文件系统,可以通过存储由二进制零组成的文件手动回收空闲空间,然后删除该文件。
文件系统通常配置为以以下两种方式之一发出
DISCARD
请求:
- 实时丢弃(也在线丢弃或内联丢弃)
- 启用实时丢弃时,当用户删除文件和释放空间时,文件系统会将
REQ_DISCARD
请求发送到块层。VDO 会检索这些请求,并将空间返回到其空闲池,假设块没有共享。对于支持在线丢弃的文件系统,您可以在挂载时设置discard
选项来启用它。 - 批量丢弃
- 批量丢弃是一种用户发起的操作,可导致文件系统通知块层(VDO)任何未使用的块。这可以通过向文件系统发送名为
FITRIM
的ioctl
请求来完成。您可以使用fstrim
工具(例如从cron
)将此ioctl
发送到文件系统。
有关丢弃功能的详情,请参考 第 2.4 节 “丢弃未使用的块”。
在没有文件系统的情况下重新声明空间
当存储被用作没有文件系统的块存储目标时,也可以管理可用空间。例如,可以通过在其上安装逻辑卷管理器(LVM),将单个 VDO 卷划分为多个子卷。在取消置备卷前,可以使用 blkdiscard 命令来释放该逻辑卷之前使用的空间。LVM 支持
REQ_DISCARD
命令,并在适当的逻辑块地址上将请求转发到 VDO,以释放空间。如果使用其他卷管理器,它们还需要支持 REQ_DISCARD
,或者等效地支持 SCSI 设备的 UNMAP
或用于 ATA 设备的 TRIM
。
在光纤通道或以太网网络中回收空间
VDO 卷(或卷部分)也可以置备到光纤通道存储结构上的主机,或使用 SCSI 目标框架(如 LIO 或 SCST)的主机。SCSI 启动器可以使用
UNMAP
命令在精简配置的存储目标上释放空间,但需要配置 SCSI 目标框架来公告对这个命令的支持。这通常是通过在这些卷上启用 精简配置 来完成的。运行以下命令,可以在基于 Linux 的 SCSI 启动器上验证对 UNMAP
的支持:
#
sg_vpd --page=0xb0 /dev/device
在输出中,验证 "Maximum unmap LBA count" 值是否大于零。
30.4.10. 增加逻辑卷大小
管理应用程序可以使用 vdo growLogical 子命令增加 VDO 卷的逻辑大小。卷增大后,管理应告知 VDO 卷的新大小之上的任何设备或文件系统。卷可能会增大,如下所示:
#
vdo growLogical --name=my_vdo --vdoLogicalSize=new_logical_size
使用此命令可让存储管理员初始创建 VDO 卷,其逻辑大小足够小,以便安全地耗尽空间。一段时间后,可以评估实际数据缩减率,如果足够,可以增大 VDO 卷的逻辑大小以利用空间节省。
30.4.11. 增加物理卷大小
增加 VDO 卷可用的物理存储量:
- 增加底层设备的大小。确切的流程取决于设备的类型。例如:要调整 MBR 分区的大小,请使用
fdisk
工具,如 第 13.5 节 “使用 fdisk 重新定义分区大小” 所述。 - 使用
growPhysical
选项将新的物理存储空间添加到 VDO 卷中:#
vdo growPhysical --name=my_vdo
无法使用这个命令缩小 VDO 卷。
30.4.12. 使用 Ansible 自动化 VDO
您可以使用 Ansible 工具自动部署和管理 VDO。详情请查看:
- Ansible 文档: https://docs.ansible.com/
- VDO Ansible 模块文档: https://docs.ansible.com/ansible/latest/modules/vdo_module.html