AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 771818
Accepted
Mikko Rantalainen
Mikko Rantalainen
Asked: 2024-03-07 22:55:16 +0800 CST2024-03-07 22:55:16 +0800 CST 2024-03-07 22:55:16 +0800 CST

挂载文件系统时将 LVM 缓存设备添加到现有 LVM 卷组是否安全?

  • 772

我有一个现有的 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
  • 1 1 个回答
  • 34 Views

1 个回答

  • Voted
  1. Best Answer
    Mikko Rantalainen
    2024-03-08T22:44:42+08:002024-03-08T22:44:42+08:00

    LVM 的作者在任何地方都没有明确记录这一点,但根据https://blog.delouw.ch/2020/01/29/using-lvm-cache-for-storage-tiering/

    dm-cache相对于 dm-writecache的另一个好处是可以在线创建、激活和销毁缓存。

    这意味着只要您使用dm-cachemodule 而不是dm-writecachemodule,在逻辑卷已安装的情况下添加和删除 LVM 缓存应该是安全的。

    请注意,LVMcachemode设置writeback与dm-writecache.

    此外,RedHat 文档https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/administration_guide/sect-lvm_cache#idm140401735629408说明如下:

    19.8.3。配置 LVM 缓存
    ...即使在使用已挂载的文件系统的情况下,也
    可以在活动卷上添加或删除缓存池。但是,操作会产生开销,并且会出现性能影响 ,尤其是在回写模式下删除缓存卷时,因为需要进行完整数据同步。

    我还通过以下测试验证了这一点:

    1. 在虚拟机上创建 4 个附加存储设备:sda(2 GB)、sdb(4 GB)、sdc(4 GB)、sdd(1 GB)。这些设备的大小并不重要,我在这里使用不同大小的设备来说明 LVM 的灵活性。您可以假装较小的设备sdd是最快的设备,并将用作缓存。

    2. 使用 sda、sdb、sdc 构建一个 LVM 存储,获取所有设备的所有盘区(本例中调用卷组storage并调用逻辑卷data):

      pvcreate /dev/sda /dev/sdb /dev/sdc
      vgcreate storage /dev/sda /dev/sdb /dev/sdc
      lvcreate -l100%FREE -n data storage
      mkfs.ext4 /dev/mapper/storage-data
      mkdir -p /root/test
      mount /dev/mapper/storage-data /root/test
      

      在现实世界中,我建议创建比整个设备短一点的分区,并将这些分区用于 LVM 物理卷。这样可以更轻松地更换设备,因为来自不同制造商的“1 TB”设备可能会存在几兆字节的差异。我更喜欢保留最后约 100 MB 未分区的 SSD,以便能够在不同的 SSD 设备上创建相同大小的分区。作为奖励,SSD 设备可以使用磁盘上从未使用过的区域作为额外的磨损均衡区域。如果您使用廉价驱动器,我建议保留 10-20% 从未使用过,因为廉价驱动器通常在用户可访问区域之外的磨损均衡区域要少得多。保留一些用户可访问区域不变(或通过TRIM)允许固件拥有更多的磨损均衡区域,从而延长驱动器的使用寿命并通常提高其性能。

    3. 在目录中的两个单独终端上并行启动两个 fio 测试循环/root/test:

      第一个循环:

      while fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randwrite --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=1 --direct=1 --numjobs=1 --group_reporting --verify=sha1 --do_verify=0 --verify_state_save=1 --verify_backlog=1024 && fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=1 --direct=1 --numjobs=1 --group_reporting --verify=sha1 --do_verify=1 --verify_state_save=1 --verify_backlog=1024 --verify_dump=1 --verify_only ; do printf "\nOK -- %s\n\n\n" "$(date --iso=sec)"; done
      

      第二个循环(在另一个终端中):

      while fio --name TEST --eta-newline=5s --filename=fio-tempfile2.dat --rw=randwrite --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=4 --direct=1 --numjobs=4 --group_reporting --verify=sha1 --do_verify=0 --verify_state_save=1 --verify_backlog=1024 && fio --name TEST --eta-newline=5s --filename=fio-tempfile2.dat --rw=randread --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=2 --direct=1 --numjobs=8 --group_reporting --verify=sha1 --do_verify=1 --verify_state_save=1 --verify_backlog=1024 --verify_dump=1 --verify_only ; do printf "\nOK -- %s\n\n\n" "$(date --iso=sec)"; done
      

      它们创建两个名为 和 的文件fio-tempfile.dat,并fio-tempfile2.dat通过总共 5 个进程连续写入和验证,并验证文件的内容。我测试过dd,如果修改单个字节,循环将检测到错误:

      dd if=/dev/zero of=fio-tempfile.dat seek=1000000 count=1 bs=1
      

      一旦检测到错误,您可以重新启动循环,它将继续测试和验证存储,直到停止或发现错误。

    4. 将新的缓存设备 ( sdd) 添加到此现有存储,同时不断运行上述测试循环以证明访问文件系统是安全的:

      pvcreate /dev/sdd
      vgextend storage /dev/sdd
      lvcreate -n lvmcache-data -l 98%FREE storage /dev/sdd
      lvcreate -n lvmcache-metadata -l 50%FREE storage /dev/sdd
      lvconvert --type cache-pool --cachemode writeback --poolmetadata storage/lvmcache-metadata storage/lvmcache-data
      lvconvert --type cache --cachepool storage/lvmcache-data storage/data
      

      最后一个命令会动态添加 LVM 缓存设备,而不会导致数据损坏。缓存也将在系统重新启动后持续存在,不会出现任何问题。仅分配 98% 的数据缓存和 50% 的剩余空间 (1%) 的元数据缓存的原因是,用这些空间构建缓存池需要卷组中有一些可用空间,否则会失败。您也可以使用cachevol替代方法cachepool,但第三方软件通常仅支持cachepool,因为它是较旧的方法。两者具有相同的性能,cachepool只是构建起来更复杂,但与第三方修复和诊断软件具有更好的互操作性,这就是我更喜欢使用它的原因。这cachepool模式还支持使用单独的设备来存储元数据和数据,如果您有多个非常快的设备,这可以提高性能。

    5. 如果您随后想要删除缓存设备,您可以即时执行以下操作,而不会损坏数据:

      lvconvert --uncache storage/data
      

      如果 LVM 缓存处于活动使用状态(例如上面的示例中正在运行测试循环),这将需要相当长的时间,并且它将继续显示状态,例如

      Flushing 15610 blocks for cache storage/data.
      Flushing 11514 blocks for cache storage/data.
      Flushing 7418 blocks for cache storage/data.
      Flushing 5481 blocks for cache storage/data.
      ...
      Flushing 1 blocks for cache storage/data.
      Logical volume "lvmcache-data_cpool" successfully removed
      Logical volume storage/data is not cached.
      

      看来刷新可能会停滞很长时间并继续显示相同数量的未刷新块,但你只需要继续等待。安装在 LVM 之上的文件系统始终保持工作状态。

      uncache我没有验证如果在操作过程中断电会发生什么。我假设 LVM 启动时缓存仍在使用中,您只需再次重新运行该uncache操作即可。

    请注意,在该uncache命令之后,数据缓存和元数据缓存逻辑卷都将丢失(释放而没有任何历史记录),因此如果您想重新附加缓存设备,则必须从头开始构建它(所有 和lvcreate命令lvconvert)步骤4)。操作完成后,缓存设备仍将是卷组的一部分,uncache因此您无需重做。

    和往常一样,在弄乱任何重要数据之前,请务必完成并验证最新的备份!

    根据以下内容,上述 LVM 缓存设置将如下所示lsblk -sp:

    NAME                                             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    /dev/mapper/storage-data                         253:3    0    10G  0 lvm  /root/test
    ├─/dev/mapper/storage-lvmcache--data_cpool_cdata 253:0    0   996M  0 lvm  
    │ └─/dev/sdd                                       8:48   0     1G  0 disk 
    ├─/dev/mapper/storage-lvmcache--data_cpool_cmeta 253:1    0    12M  0 lvm  
    │ └─/dev/sdd                                       8:48   0     1G  0 disk 
    └─/dev/mapper/storage-data_corig                 253:2    0    10G  0 lvm  
      ├─/dev/sda                                       8:0    0     2G  0 disk 
      ├─/dev/sdb                                       8:16   0     4G  0 disk 
      └─/dev/sdc                                       8:32   0     4G  0 disk 
    

    有关 LVM 缓存使用的一些其他提示:

    即使选择保留在缓存中的内容的逻辑是全自动的,您也可以稍微调整 LVM 缓存。请参阅man lvmcache了解完整详细信息。一些例子:

    • 列出当前缓存设置(不会列出默认值):

      lvs -o cachesettings storage/data
      
    • 清除所有缓存设置(所有内容均使用默认值):

      lvchange --cachesettings '' storage/data
      
    • 当超过 10% 的缓存用于写缓冲时,调整缓存以始终开始将写缓存刷新到后备存储:

      lvchange --cachesettings 'high_watermark=10' storage/data
      
    • 调整缓存以在因任何原因开始刷新后有任何内容需要刷新时继续刷新写入缓存:

      lvchange --cachesettings 'low_watermark=0' storage/data
      
    • 调整缓存以在访问后备存储时自动暂停刷新 50 毫秒(避免引入刷新延迟)

      lvchange --cachesettings 'pause_writeback=50' storage/data
      
    • 当数据在缓存中超过 60 秒时,即使少量数据也会自动刷新到后备存储:

      lvchange --cachesettings 'autocommit_time=60000' storage/data
      
    • 2

相关问题

  • 修改 LVM 时未更新 LVM 快照

  • grub2-mkconfig 没有生成正确的挂载路径(以及如何摆脱不再使用的额外内核?)

  • lvm 和一个分区问题

  • 调整设备 /dev/sdb 上的 LVM 物理卷的大小

  • 以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve