Назад | Перейти на главную страницу

Как восстановить кешированный LVM с кешем на ram-диске?

В этот В статье есть хороший рецепт, как использовать RAM-диск в качестве кеш-устройства для классического LVM-тома.

Предполагая, что у вас есть более старый диск, много ОЗУ и нет SSD, вы можете повысить производительность диска до собственной пропускной способности ОЗУ, используя этот метод.

Я сделал это на LVM, который используется для моей виртуальной виртуальной машины под управлением Windows 10. Вуаля: пропускная способность диска внутри виртуальной машины была в 4 раза выше (средняя пропускная способность, лучше всего использовать при установке исправлений для Windows).

Все было хорошо - пока я не выключил свою Linux-систему (CentOS 7).

Потеря данных!

Завершение работы не приведет к дизассемблированию этого кеша. То же самое будет верно в случае сбоя питания (да - будет потеря данных).

Однако должен быть способ вернуть то, что осталось. Но LVM не позволит вам работать с VG с отсутствующими дисками.

Итак - есть ли рецепт на этот случай?

подобно

На последнем шаге нужно будет восстановить файловую систему и восстановить отсутствующие / поврежденные файлы из резервной копии (с помощью rsync).

вы можете повысить производительность диска до собственной пропускной способности ОЗУ, используя этот метод

Нет, не совсем так. Когда кэш заполнен записями, пропускная способность записи снижается до того, что может делать базовый диск. И первые чтения с резервного диска все еще медленные. Ввод / вывод в кеш, да быстрее.


Этот метод очень рискованный, потому что это не постоянный диск. Я скептически отношусь к утилите, когда вы можете просто получить быстрый твердотельный диск или аппаратный кэш записи, но режимы сбоя проверять интересно.

ЭТО ПРИВЕДЕТ ПОТЕРЮ ДАННЫХ. ВЫПОЛНЯЙТЕ ТОЛЬКО ПРИ ЕСТЬ РЕЗЕРВНАЯ КОПИЯ ДАННЫХ.

Во-первых, без кеша.

# 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

Вы даже не можете принудительно отключить его, потому что в метаданных есть ошибка ввода-вывода.

[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.

Но вы можете вызвать потерю данных, создав новый PV с тем же UUID. Разблокируйте его, чтобы удалить PV виртуального диска, который, по мнению LVM, все еще содержит данные, но был утерян. Вы можете повторно добавить новый кеш с помощью 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

Его можно принудительно отключить. Не позволяйте выводу «Flushing 0 Blocks» вас успокоить, записи в полете уже были потеряны. Затем недостающий RAM-диск можно удалить, снова сделав 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