6

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

Я подумал, что хотел бы создать настройку «Зеркало zfs», однако я не хотел бы постоянно носить с собой резервный диск для удобства, а скорее периодически синхронизировать любые изменения. Предоставляет ли ZFS способ сделать это, или это неправильное использование? Если так, что канонический ZFS-способ сделать это? (Я не хочу разбивать накопитель, проверяя каждый сектор на предмет изменений каждый раз, когда я хочу обновить резервный накопитель, например)

1 ответ1

8

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

На практике то, что вы предлагаете, почти наверняка потребовало бы каждый раз полного пересчета, потому что временные изменения привели бы к тому, что прошло бы слишком много ревизий уберблока, поэтому не было бы общей базовой точки для добавочного пересчета. Если во время этого процесса произойдет сбой, вероятно, у вас возникнут серьезные проблемы с данными. Также имейте в виду, что из-за формата данных на диске дерева Merkle ресиверы ZFS могут (и выполняются) "в порядке уменьшения важности данных", а не последовательно, как RAID-системы, не основанные на файловой системе. Конечно, "важность данных" здесь касается ZFS, а не того, что вы считаете важным или стоит сохранить. Результирующая поисковая активность может легко создать серьезную нагрузку, особенно на один диск.

Канонический способ синхронизировать две файловые системы ZFS - использовать zfs send | zfs receive между ними. Это требует, чтобы обе файловые системы были доступны (но вы можете сохранить выходные данные zfs send и использовать их в качестве входных данных для zfs, получаемых позже, если вы будете слишком склонны, но вы должны знать, что это сопровождается огромным предостережением: zfs receive не предпринимает попыток восстановления из частично поврежденного потока данных и просто прерывает работу при обнаружении ошибок).

  • Есть один пул для каждого резервного диска. Давайте назовем их танком и трубой. Допустим, у нас есть данные о резервуаре, которые мы хотим скопировать в трубу.
  • Подключите оба привода, и zpool import оба бака и трубы. Вы можете передать -N в zpool import, чтобы он не монтировал файловые системы.
  • Сделайте снимок исходной файловой системы, танк. zfs snapshot tank@current1984 -r
  • Найдите самый последний снимок, который объединяет и танк, и трубу. Используйте что-то вроде zfs list tank pipe -t snapshot чтобы получить необработанный список для работы. Скажем, последний общий снимок, который у них есть, это current1948 .
  • Запустите что-то вроде zfs send -R -I tank@current1948 tank@current1984 | zfs receive pipe для постепенной передачи дельты между current1948 и current1984 из резервуара в pipe. Прочтите справочную страницу zfs для более подробной информации о подкомандах send и receive.
  • Подождите, пока это не закончится, затем при необходимости удалите все снимки, которые больше не нужны. Убедитесь, что у вас есть хотя бы один снимок (например, current1984), который объединяет оба пула (скорее, файловые системы), чтобы использовать его в качестве базы в следующий раз.

На этом этапе оба пула будут иметь одинаковое содержимое, вплоть до используемого снимка. Если все сделано правильно, это также должно потребовать только передачи различий; Я не могу представить сценарий, в котором пошаговая zfs send | zfs receive нужно сделать что-либо, например, полное зеркальное преобразование. Это также позволяет позже добавить избыточность в резервные пулы, если вы захотите это сделать. Если во время копирования происходит сбой исходного диска, старая резервная копия все равно должна быть доступна; будут потеряны только те различия, которые вы пытались перенести.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .