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
    • 最新
    • 标签
主页 / server / 问题 / 932247
Accepted
Nils
Nils
Asked: 2018-09-24 02:48:52 +0800 CST2018-09-24 02:48:52 +0800 CST 2018-09-24 02:48:52 +0800 CST

如何在 ram-disk 上恢复缓存的 LVM?

  • 772

在本文中,有一个很好的秘诀,说明如何将 RAM 磁盘用作经典 LVM 卷的缓存设备。

假设您有一个较旧的磁盘、大量 RAM 并且没有 SSD,您可以使用此技术将磁盘性能提高到本机 RAM 吞吐量。

因此,我在用于运行 Windows 10 的虚拟 VM 的 LVM 上执行此操作。瞧:VM 内的磁盘吞吐量快 4 倍(平均吞吐量,最好在修补 Windows 时使用)。

一切都很好——直到我关闭了我的 linux 系统(CentOS 7)。

数据丢失!

关机不会反汇编该缓存。在电源故障情况下也是如此(是的 - 会有数据丢失)。

但是 - 必须有一种方法来恢复剩下的东西。但是 LVM 不允许您在缺少磁盘的 VG 上进行操作。

那么 - 这个案子有收据吗?

喜欢

  • 使用新磁盘恢复丢失的 LVM 缓存磁盘
  • 强制清洁状态
  • 再次访问缓存的LV

在最后一步中,将进行文件系统修复并从备份中恢复丢失/损坏的文件(使用 rsync)。

cache
  • 1 1 个回答
  • 4433 Views

1 个回答

  • Voted
  1. Best Answer
    John Mahowald
    2018-09-24T05:15:08+08:002018-09-24T05:15:08+08:00

    您可以使用此技术将磁盘性能提高到本机 RAM 吞吐量

    不,不完全是。一旦缓存充满了写入,写入吞吐量就会降低到底层磁盘的能力。并且从支持磁盘的第一次读取仍然很慢。缓存的 I/O,是的更快。


    这种方法非常危险,因为它非常不是永久性磁盘。当您可以获得快速固态磁盘或硬件写入缓存时,我对该实用程序持怀疑态度,但测试故障模式很有趣。

    这将导致数据丢失。只有在您有数据备份的情况下才能继续。

    首先,没有缓存。

    # Create volume
    pvcreate /dev/sdb
    vgcreate vg /dev/sdb
    lvcreate --size 400g --name lv vg
    mkfs.xfs /dev/vg/lv
    mkdir /mnt/lv
    mount /dev/vg/lv /mnt/lv
    # Write test
    dd bs=1M if=/dev/zero of=/mnt/lv/zero count=10000
    

    添加缓存。

    # Create a RAM disk
    modprobe brd rd_nr=1 rd_size=4585760 max_part=0
    pvcreate /dev/ram0
    vgextend vg /dev/ram0
    # Create a cache
    lvcreate -L 300M -n cache_meta vg /dev/ram0
    lvcreate -L 4G -n cache_vol vg /dev/ram0
    lvconvert –type cache-pool –poolmetadata vg/cache_meta –cachemode=writeback vg/cache_vol -y
    # Add cache to a LV
    lvconvert –type cache –cachepool vg/cache_vol vg/lv
    # Write test
    dd bs=1M if=/dev/zero of=/mnt/lv/zero2 count=10000
    # Crash test
    echo 'c' > /proc/sysrq-trigger
    

    当它回来时,LVM 很不高兴,卷不可访问。

    [root@sf ~]# lvs
      WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
      LV   VG Attr       LSize   Pool        Origin     Data%  Meta%  Move Log Cpy%Sync Convert
      lv   vg Cwi---C-p- 400.00g [cache_vol] [lv_corig]
    [root@sf ~]# mount /dev/vg/lv /mnt/lv/
    mount: special device /dev/vg/lv does not exist
    [root@sf ~]# pvs
      WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
      PV         VG Fmt  Attr PSize    PFree
      /dev/sdb   vg lvm2 a--  <500.00g 99.70g
      [unknown]  vg lvm2 a-m     4.37g 80.00m
    

    您甚至不能强制取消缓存它,因为元数据有 I/O 错误。

    [root@sf ~]# lvconvert --uncache vg/lv --force -y
      WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
      WARNING: Cache pool data logical volume vg/cache_vol_cdata is missing.
      WARNING: Cache pool metadata logical volume vg/cache_vol_cmeta is missing.
      WARNING: Uncaching of partially missing writethrough cache volume vg/lv might destroy your data.
      /dev/mapper/vg-cache_vol_cmeta: read failed: Input/output error
      Failed to active cache locally vg/lv.
    

    但是您可以通过创建具有相同 UUID 的新 PV 来强制丢失数据。取消缓存它以删除 LVM 认为其中仍有数据但丢失的 ramdisk PV。你可以用 重新添加新的缓存lvconvert,但我不打算在这个实验的结果之后。

    pvcreate --norestore --uuid YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R  /dev/ram0
    lvconvert --uncache vg/lv
    

    最后,检查任何文件系统损坏。需要从备份中恢复才能使您的数据恢复到良好状态。

    xfs_repair /dev/vg/lv
    

    编辑:添加一个具有相同 UUID 的空 PV 似乎超级 hacky。毕竟,lvconvert 拒绝取消缓存它。相反,如果您将元数据 LV 放在永久磁盘上,那么清理起来会更容易一些。

    # Same procedure but meta is on persistent storage.
    lvcreate -L 300M -n cache_meta vg /dev/sdb
    

    可以强制取消缓存。不要让“Flushing 0 blocks”输出让您放心,正在进行的写入已经丢失。然后可以删除丢失的 ramdisk,使 VG 再次保持一致。

    [root@sf ~]# lvconvert --uncache vg/lv --force -y
      WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
      WARNING: Cache pool data logical volume vg/cache_vol_cdata is missing.
      WARNING: Uncaching of partially missing writethrough cache volume vg/lv might destroy your data.
      Flushing 0 blocks for cache vg/lv.
      Logical volume "cache_vol" successfully removed
      Logical volume vg/lv is not cached.
    [root@sf ~]# vgreduce --removemissing vg
      WARNING: Device for PV YpvOB5-PZLO-POFL-3Cf4-G1IB-gep8-6eU10R not found or rejected by a filter.
      Wrote out consistent volume group vg.
    [root@sf ~]# pvs
      PV         VG Fmt  Attr PSize    PFree
      /dev/sdb   vg lvm2 a--  <500.00g <100.00g
    
    • 4

相关问题

  • 缩放大文件下载?

  • Gzip 与反向代理缓存

  • 如何禁用tomcat缓存?我遇到了奇怪的静态文件问题

  • mod_mem_cache 提供错误的内容!

  • NFS 缓存导致间歇性滞后

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve