我有一个现有的 LVM 卷组,其中有一个 10 TB 逻辑卷安装为 ext4 系统,并且正在使用中。
lvconvert --type cache --cachepool storage/lvmcache-data storage/data
当 ext4 文件系统已安装时运行该命令是否安全storage/data
?(storage/lvmcache-data
之前已经配置过,lvconvert --type cache-pool --cachemode writeback --poolmetadata storage/lvmcache-metadata storage/lvmcache-data
以防产生影响。)
我认为是的,将缓存动态添加到已安装文件系统的在线卷是安全的,但我无法找到任何文档。
LVM 的作者在任何地方都没有明确记录这一点,但根据https://blog.delouw.ch/2020/01/29/using-lvm-cache-for-storage-tiering/
这意味着只要您使用
dm-cache
module 而不是dm-writecache
module,在逻辑卷已安装的情况下添加和删除 LVM 缓存应该是安全的。请注意,LVM
cachemode
设置writeback
与dm-writecache
.此外,RedHat 文档https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/administration_guide/sect-lvm_cache#idm140401735629408说明如下:
我还通过以下测试验证了这一点:
在虚拟机上创建 4 个附加存储设备:
sda
(2 GB)、sdb
(4 GB)、sdc
(4 GB)、sdd
(1 GB)。这些设备的大小并不重要,我在这里使用不同大小的设备来说明 LVM 的灵活性。您可以假装较小的设备sdd
是最快的设备,并将用作缓存。使用 sda、sdb、sdc 构建一个 LVM 存储,获取所有设备的所有盘区(本例中调用卷组
storage
并调用逻辑卷data
):在现实世界中,我建议创建比整个设备短一点的分区,并将这些分区用于 LVM 物理卷。这样可以更轻松地更换设备,因为来自不同制造商的“1 TB”设备可能会存在几兆字节的差异。我更喜欢保留最后约 100 MB 未分区的 SSD,以便能够在不同的 SSD 设备上创建相同大小的分区。作为奖励,SSD 设备可以使用磁盘上从未使用过的区域作为额外的磨损均衡区域。如果您使用廉价驱动器,我建议保留 10-20% 从未使用过,因为廉价驱动器通常在用户可访问区域之外的磨损均衡区域要少得多。保留一些用户可访问区域不变(或通过
TRIM
)允许固件拥有更多的磨损均衡区域,从而延长驱动器的使用寿命并通常提高其性能。在目录中的两个单独终端上并行启动两个 fio 测试循环
/root/test
:第一个循环:
第二个循环(在另一个终端中):
它们创建两个名为 和 的文件
fio-tempfile.dat
,并fio-tempfile2.dat
通过总共 5 个进程连续写入和验证,并验证文件的内容。我测试过dd
,如果修改单个字节,循环将检测到错误:一旦检测到错误,您可以重新启动循环,它将继续测试和验证存储,直到停止或发现错误。
将新的缓存设备 (
sdd
) 添加到此现有存储,同时不断运行上述测试循环以证明访问文件系统是安全的:最后一个命令会动态添加 LVM 缓存设备,而不会导致数据损坏。缓存也将在系统重新启动后持续存在,不会出现任何问题。仅分配 98% 的数据缓存和 50% 的剩余空间 (1%) 的元数据缓存的原因是,用这些空间构建缓存池需要卷组中有一些可用空间,否则会失败。您也可以使用
cachevol
替代方法cachepool
,但第三方软件通常仅支持cachepool
,因为它是较旧的方法。两者具有相同的性能,cachepool
只是构建起来更复杂,但与第三方修复和诊断软件具有更好的互操作性,这就是我更喜欢使用它的原因。这cachepool
模式还支持使用单独的设备来存储元数据和数据,如果您有多个非常快的设备,这可以提高性能。如果您随后想要删除缓存设备,您可以即时执行以下操作,而不会损坏数据:
如果 LVM 缓存处于活动使用状态(例如上面的示例中正在运行测试循环),这将需要相当长的时间,并且它将继续显示状态,例如
看来刷新可能会停滞很长时间并继续显示相同数量的未刷新块,但你只需要继续等待。安装在 LVM 之上的文件系统始终保持工作状态。
uncache
我没有验证如果在操作过程中断电会发生什么。我假设 LVM 启动时缓存仍在使用中,您只需再次重新运行该uncache
操作即可。请注意,在该
uncache
命令之后,数据缓存和元数据缓存逻辑卷都将丢失(释放而没有任何历史记录),因此如果您想重新附加缓存设备,则必须从头开始构建它(所有 和lvcreate
命令lvconvert
)步骤4)。操作完成后,缓存设备仍将是卷组的一部分,uncache
因此您无需重做。和往常一样,在弄乱任何重要数据之前,请务必完成并验证最新的备份!
根据以下内容,上述 LVM 缓存设置将如下所示
lsblk -sp
:有关 LVM 缓存使用的一些其他提示:
即使选择保留在缓存中的内容的逻辑是全自动的,您也可以稍微调整 LVM 缓存。请参阅
man lvmcache
了解完整详细信息。一些例子:列出当前缓存设置(不会列出默认值):
清除所有缓存设置(所有内容均使用默认值):
当超过 10% 的缓存用于写缓冲时,调整缓存以始终开始将写缓存刷新到后备存储:
调整缓存以在因任何原因开始刷新后有任何内容需要刷新时继续刷新写入缓存:
调整缓存以在访问后备存储时自动暂停刷新 50 毫秒(避免引入刷新延迟)
当数据在缓存中超过 60 秒时,即使少量数据也会自动刷新到后备存储: