web-dev-qa-db-ja.com

ram-disk上のキャッシュでキャッシュされたLVMを回復する方法は?

this の記事には、従来のLVMボリュームのキャッシュデバイスとしてRAMディスクを使用する方法についての素晴らしいレシピがあります。

古いディスクがあり、RAMでSSDがない場合)、この手法を使用してディスクのパフォーマンスをネイティブのRAMスループットまで向上させることができます。

だから私は私の仮想に使用されているLVMでこれを行いましたVM Windows 10を実行しています。出来上がり:ディスクスループットはVM(平均スループット、Windowsにパッチを適用する際に最適です)。

すべてが順調だった-私がlinux-system(CentOS 7)をシャットダウンするまで。

データ損失!

シャットダウンはそのキャッシュを分解しません。電源障害の状況でも同じことが言えます(はい-データが失われます)。

ただし、残っているものを回復する方法が必要です。ただし、LVMでは、ディスクが欠落しているVGを操作できません。

だから-このケースのレシピはありますか?

お気に入り

  • 不足しているLVMキャッシュディスクを新しいディスクで回復する
  • 強制的にクリーンな状態
  • キャッシュされたLVに再度アクセスする

最後のステップでは、ファイルシステムを修復し、失われたファイルや破損したファイルをバックアップから回復します(rsyncを使用)。

2
Nils

この手法を使用して、ディスクのパフォーマンスをネイティブ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がまだデータを持っていると考えているが失われたRAMディスクPVを削除します。 lvconvertを使用して新しいキャッシュを再度追加することもできますが、この実験の結果については説明しません。

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

最後に、ファイルシステムの損傷がないか確認します。データを良好な状態に戻すには、バックアップから復元する必要があります。

xfs_repair /dev/vg/lv

編集:空のPVを同じUUIDで追加して戻すのは非常にハッキリしているようです。結局のところ、lvconvertはキャッシュを解除することを拒否しました。代わりにメタデータLVを永続ディスクに置くと、少し簡単にクリーンアップできます。

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

強制的にキャッシュを解除できます。 「0ブロックをフラッシュしています」の出力で安心させないでください。処理中の書き込みはすでに失われています。次に、欠落している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
3
John Mahowald