mysurik.ru

Proxmox VE: ZFS — Снимок, Целостность и Отказоустойчивость! (Часть 8)

uw

Как я влюбился в ZFS на Proxmox

Долгое время я относился к ZFS с опаской. В интернете про неё пишут умными словами — пулы, датасеты, контрольные суммы, и мне казалось, что это уровень «настоящих админов», а не моя возня с домашним сервером. Но когда я понял, что все мои виртуалки лежат на обычном разделе и никто не проверяет целостность данных, мне стало не по себе. Один битый сектор на диске — и фотоархив, который я копировал неделями, превратится в папку с битыми файлами, а я даже не узнаю об этом сразу.

В этой части моего курса по Proxmox я расскажу, как переехал на ZFS: что он умеет, почему я выбрал его вместо обычного LVM и как настроил всё за один вечер. Спойлер: сложнее оказалось не настроить, а решиться.

Почему ZFS, а не LVM/Ext4

Сначала я думал, что ZFS — это просто ещё одна файловая система, и разница невелика. Оказалось, всё наоборот: это целая система хранения, которая совмещает в себе RAID-контроллер, файловую систему и менеджер томов. Я сделал себе табличку, чтобы самому понять разницу:

Особенность ZFS LVM/Ext4
Целостность данных Проверяет и автоматически исправляет повреждения (bit rot) с помощью контрольных сумм Не проверяет целостность
Снимки Мгновенные, занимают минимум места Возможны, но медленнее и менее гибкие
RAID-функции Встроены (RAID-Z1, RAID-Z2) Нужен отдельный RAID
Производительность Высокая, с кэшированием ARC/L2ARC Стандартная

Главное, что меня зацепило, — контрольные суммы. ZFS проверяет каждый блок при чтении и, если находит повреждение, восстанавливает его из «зеркальной» копии. Диски тихо деградируют годами, и без такой проверки вы узнаете о проблеме, когда файл уже не открыть. С ZFS я сплю спокойнее.

Создаю пул RAID-Z1

Я делал всё по SSH, чтобы видеть каждую команду своими глазами. Перед началом — важное предупреждение, которое я вынес из чужих форумов: ZFS ставится на «голые» диски, все данные на них будут стёрты. Если на диске уже что-то есть — не экспериментируйте.

Сначала посмотрел, какие диски вообще видит система:

ls -l /dev/disk/by-id/

Потом создал пул из трёх дисков в конфигурации RAID-Z1 — она как RAID 5: переживает выход одного диска из строя:

zpool create -f my-zpool raidz1 /dev/disk/by-id/ID_DISK_1 /dev/disk/by-id/ID_DISK_2 /dev/disk/by-id/ID_DISK_3

Заметьте: я использую идентификаторы из /dev/disk/by-id/, а не имена /dev/sda. Я на этом обжёгся, когда после перезагрузки диск поменял букву, и пул не поднялся. Сейчас запомните: имена /dev/sdX меняются, идентификаторы — нет.

Проверил, что всё встало:

zpool status

Увидел желанное ONLINE для всех дисков — и выдохнул. Пул работает.

Кстати, почему я выбрал RAID-Z1, а не зеркало? Потому что у меня три диска одинакового размера, и RAID-Z1 даёт почти полный объём всех трёх. Зеркало из трёх дисков отдало бы только один диск полезной ёмкости, а мне хотелось запаса под виртуалки. Если бы дисков было всего два — я бы не раздумывая взял mirror: он проще, быстрее на записи и даёт лучшую производительность на случайных операциях. Свою конфигурацию стоит выбирать под свою задачу, а не под чужую.

Подключаю ZFS к Proxmox

Теперь нужно было «познакомить» гипервизор с новым пулом. В веб-интерфейсе: Datacenter → Storage → Add → ZFS. Я задал ID zfs-vms, выбрал из списка свой my-zpool и отметил содержимое: Disk image и Container template. После этого виртуалки можно создавать прямо на ZFS-хранилище.

Дальше я сделал отдельный датасет для контейнеров — это как подпапка с собственными настройками квот:

zfs create my-zpool/lxc

И добавил ещё одно хранилище в Proxmox, указав в качестве пула my-zpool/lxc, а содержимое — только Container template. Так я разделил виртуалки и контейнеры по разным датасетам: удобно управлять квотами и снапшотами по отдельности.

Снапшоты — моя суперсила

Самое вкусное в ZFS — мгновенные снимки. Я делаю снапшот перед каждым обновлением системы:

  1. Выбираю VM или контейнер в дереве.
  2. Открываю вкладку Snapshots.
  3. Жму Take Snapshot и называю его before-update.

Всё, процесс занимает меньше секунды, а место снимок не занимает, пока данные не начнут меняться. Если после обновления что-то сломалось — жму Rollback, и система возвращается ровно в то состояние, в котором была. Я как-то обновил пакет для умного дома, и тот перестал запускаться. Вместо танцев с бубном я откатился к снапшоту и вернулся к нормальной жизни за одну минуту. Вот тогда я понял, ради чего всё это затевалось.

Позже я перестал делать снимки руками и настроил автоматические. В Proxmox это делается на уровне хранилища: я добавил для zfs-vms задачу бэкапа с снапшотами по расписанию. Теперь каждую ночь система сама создаёт снимки моих виртуалок, и мне остаётся только иногда проверять, что они появляются. Это как страховка, за которую не надо платить — она просто работает.

Scrub и сжатие: две настройки, которые я включил

Когда пул заработал, я докрутил две вещи, о которых узнал из документации. Первая — регулярная проверка пула, она называется scrub. Это та самая процедура, которая вычитывает все блоки и сверяет контрольные суммы. Я настроил её раз в месяц по ночам через вкладку задач в Proxmox. Первый scrub показал мне, что все данные целы, — и после этого я поверил в ZFS окончательно.

Вторая вещь — сжатие. ZFS умеет сжимать данные прямо на лету, не замедляя работу. Я включил сжатие для датасетов с виртуалками, и на моих бэкапах и дисковых образах экономия места получилась ощутимой — примерно треть. Ничего не пережимается вручную, система делает это сама. Если у вас диски не резиновые — включайте, я пожалел только о том, что не сделал это сразу при создании пула: некоторые вещи нужно включать до записи данных.

Что я понял за вечер работы с ZFS

Первое: ZFS прощает новичкам очень многое, если следовать двум правилам — использовать /dev/disk/by-id/ и не трогать диски с данными. Второе: снапшоты меняют привычку экспериментировать. Раньше я боялся менять настройки, теперь — нет, потому что откат стоит секунду. Третье: производительность меня не разочаровала — на моих старых дисках разницу я не заметил, зато кэш ARC ощутимо ускорил повторные чтения.

Если у вас всего один диск — ZFS тоже полезен хотя бы ради контрольных сумм и снапшотов, просто без зеркала вы не защищены от отказа диска. Но если дисков два или больше — считайте, что вы уже созрели для ZFS.

А если диск всё-таки умрёт

Ради интереса я посмотрел, как ведёт себя RAID-Z1, если диск реально отвалить. Делается это командой zpool offline, но я не стал трогать рабочий пул — прочитал документацию и понял сценарий. Пул переходит в состояние DEGRADED: данные остаются доступными, вы ничего не теряете, а статус честно сообщает, что один диск пропал. Дальше ставите новый диск и добавляете его в пул: zpool replace my-zpool /dev/disk/by-id/OLD /dev/disk/by-id/NEW, и система сама пересобирает данные на новый диск. Всё это время виртуалки продолжают работать, что для меня — главное.

Я даже провёл «репетицию» на запасном старом диске: отключил один диск из тестового пула, убедился, что данные читаются, вернул его обратно и дождался ресилвера. Процесс занял пару часов на моих старых HDD, но прошёл без единой ошибки. Теперь я знаю, что делать, если это случится по-настоящему, и не буду паниковать посреди ночи с гуглом в руках.

Если вкратце

  1. Проверьте диски через ls -l /dev/disk/by-id/ и запомните их идентификаторы.
  2. Создайте пул: zpool create -f my-zpool raidz1 /dev/disk/by-id/... /dev/disk/by-id/....
  3. Проверьте zpool status — все диски должны быть ONLINE.
  4. Добавьте хранилище в Proxmox: Datacenter → Storage → Add → ZFS.
  5. Создавайте датасеты под разные задачи и делайте снапшоты перед экспериментами.

ZFS стал для меня тем рубежом, после которого я перестал бояться за данные. Сначала казалось, что это сложно, а на деле весь вечер ушёл на пару команд и щелчки в интерфейсе. Теперь мои виртуалки лежат на хранилище, которое само следит за своей целостностью, — и это дорогого стоит.

Мои ошибки, чтобы вы их не повторяли

Раз уж я обещал рассказывать честно, перечислю, на чём я спотыкался. Первая ошибка — я сначала создал пул из дисков, на которых уже лежал раздел со старым бэкапом. Хорошо, что я догадался проверить lsblk до того, как запустил zpool create с флагом -f. Если бы не проверил — потерял бы архив, который собирал месяцами. Правило простое: перед созданием пула смотрите, что на дисках, и переносите всё ценное заранее.

Вторая ошибка — я первое время называл датасеты как попало, типа my-zpool/dataset1. Через пару месяцев я уже не помнил, что там лежит. Переименовал всё в осмысленные имена — vms, lxc, backups — и жизнь стала проще. Названия датасетов — это ваша память, не экономьте на них.

Третья — я чуть не удалил лишний датасет, перепутав команды zfs destroy и zfs create. К счастью, в тот момент там не было данных, но испуг был знатный. С тех пор перед destroy я всегда делаю быстрый снапшот и проверяю, что удаляю, дважды.

Пара слов про производительность

Если вы читали, что ZFS «медленный» — не верьте на слово, проверяйте на своих дисках. У меня на старых HDD в RAID-Z1 виртуалки с лёгкими сервисами работают вполне бодро. Секрет в кэше ARC: он держит в памяти часто читаемые данные, и повторные обращения к ним почти мгновенные. Для домашнего сервера этого хватает с головой. Если захотите ещё быстрее — можно добавить SSD в качестве L2ARC, но это уже для тех, кто реально упирается в диск, а не для таких, как я.

А это была последняя часть «базового» курса. Дальше начинается интересное: я объединяю несколько серверов в кластер, чтобы виртуалки переезжали между ними без простоя. Про это — в следующей части.

И последний совет перед тем, как попрощаемся с базой: не откладывайте переход на ZFS на «когда-нибудь». Я откладывал полгода и всё это время хранил данные без контрольных сумм и снапшотов. Одна из первых вещей, которую я сделал после перехода, — перезаписал на ZFS старый архив семейных фото. Он, конечно, был цел, но проверить это можно было только вручную, и то с оговорками. Сейчас такой проблемы просто не существует: пул сам знает, всё ли с ним в порядке.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *