Ramadoni: оригинал
Перевод: Алексей Федорчук
Пошаговое руководство по работе со снапшотами, клонами и репликами ZFS — самыми мощными её функциями.
Снапшоты ZFS: обзор
Снапшот — моментальная копия файловой системы или тома, не требующая дополнительного места в пуле ZFS. Дисковое пространство требуется только для записи изменённых блоков: записываются только различия между текущим набором данных и предыдущей его версией.
Типичный пример использования снапшота — быстрое получение резервной копии файловой системы перед выполнением рискованных действий вроде установки нового софта или обновления системы.
Создание и удаление снапшотов
Снимки томов напрямую недоступны, но их можно клонировать, бэкапить и восстанавливать. Для создания и удаления снапшотов используются команды zfs snapshot
и zfs destroy
Создаём пул с именем datapool
:
# zpool create datapool mirror /dev/sdb /dev/sdc # zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT datapool 1.98G 65K 1.98G - 0% 0% 1.00x ONLINE -
Имея пул с именем datapool
, надо создать файловую систему ZFS для моделирования функций снапшота:
# zfs create datapool/docs -o mountpoint=/docs # zfs list -r datapool NAME USED AVAIL REFER MOUNTPOINT datapool 93.5K 1.92G 19K /datapool datapool/docs 19K 1.92G 19K /docs
Для создания снапшота используется команда zfs snapshot
с указанием имени пула и имени снапшота. Имя снапшота должно выглядеть так:
filesystem@snapname
или
volume@snapname
То есть:
# zfs snapshot datapool/docs@version1 # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@version1 0 - 19.5K -
Теперь снапшот datapool/docs
создан.
Для удаления снапшота используется команда zfs destroy
:
# zfs destroy datapool/docs@version1 # zfs list -t snapshot no datasets available
Откат снапшота
Для моделирования процесса нужно создать тестовый файл в каталоге /docs
:
# echo "version 1" > /docs/data.txt # cat /docs/data.txt version 1
Затем:
# zfs snapshot datapool/docs@version1 # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@version1 9K - 19.5K -
Теперь изменим содержимое файла data.txt
:
# echo "version 2" > /docs/data.txt # cat /docs/data.txt version 2
И теперь можно вернуть файловую систему в то состояние, в котором она была в момент создания предыдущей копии:
# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@version1 9.50K - 19.5K - # zfs rollback datapool/docs@version1 # cat /docs/data.txt version 1
Из вывода последней команды можно видеть, что содержимое файла data.txt
стало прежним (то есть соответствует версии 1).
Для переименования снапшота можно использовать команду zfs rename
:
# zfs rename datapool/docs@version1 datapool/docs@version2 # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@version2 9.50K - 19.5K -
Примечание: набор данных нельзя удалить, если существуют его снапшоты. Но это можно сделать, используя опцию -r
. То есть так не получится:
# zfs destroy datapool/docs cannot destroy 'datapool/docs': filesystem has children use '-r' to destroy the following datasets: datapool/docs@version2
А получится так:
# zfs destroy -r datapool/docs # zfs list -t snapshot no datasets available
Клоны ZFS: обзор
Клон — это том или файловая система, доступные для записи, содержимое которых совпадает с набором данных, из которых они были созданы.
Создание и удаление клонов
Клон можно создать только из снапшота, и снапшот нельзя удалить, пока не удалён его клон. Для создания клона используется команда zfs clone
.
Создание файловой системы:
# zfs create datapool/docs -o mountpoint=/docs # zfs list -r datapool NAME USED AVAIL REFER MOUNTPOINT datapool 93.5K 1.92G 19K /datapool datapool/docs 19K 1.92G 19K /docs
Создание её контента:
# mkdir /docs/folder{1..5} # ls /docs/ folder1 folder2 folder3 folder4 folder5
Создание снапшота:
# zfs snapshot datapool/docs@today # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@today 0 - 19K -
Создание клона снапшота datapool/docs@today
:
# zfs clone datapool/docs@today datapool/pict # zfs list NAME USED AVAIL REFER MOUNTPOINT datapool 166K 1.92G 19K /datapool datapool/docs 19K 1.92G 19K /docs datapool/pict 1K 1.92G 19K /datapool/pict
Процесс клонирования закончен, снапшот datapool/docs@today
был клонирован в datapool/pict
. Проверка показывает, что содержимое их одинаково:
# ls /datapool/pict folder1 folder2 folder3 folder4 folder5
После клонирования снапшота его нельзя удалить, пока не удалён клон:
# zfs destroy datapool/docs@today cannot destroy 'datapool/docs@today': snapshot has dependent clones use '-R' to destroy the following datasets: datapool/pict
Удаление клона:
# zfs destroy datapool/pict
Теперь, наконец, можно удалить снапшот:
# zfs destroy datapool/docs@today # zfs list -t snapshot no datasets available
Реплики ZFS: обзор
Репликация ZFS основана на снапшотах, которые можно создавать в любое время и в любом количестве. Постоянно создавая, перемещая и восстанавливая снапшоты, можно обеспечить синхронизацию между одной или несколькими машинами. ZFS предоставляет встроенную функцию сериализации, которая может отправлять потоковое представление данных на стандартный вывод.
Конфигурирование реплик
В этом разделе я хочу показать вам, как реплицировать набор данных из datapool
в backuppool
. Но можно не только хранить данные одного пула в другом локальном пуле, но и отправлять по сети в другую систему. Для репликации данных используются команды zfs send
и zfs receive
.
Создание нового пула с именем backuppool
:
# zpool create backuppool mirror sde sdf # zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT backuppool 1.98G 50K 1.98G - 0% 0% 1.00x ONLINE - datapool 1.98G 568K 1.98G - 0% 0% 1.00x ONLINE -
Проверка статуса пулов:
# zpool status pool: datapool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM datapool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors pool: backuppool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM backuppool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
Создание набора данных для репликации:
# zfs snapshot datapool/docs@today # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@today 0 - 19K - # ls /docs/ folder1 folder2 folder3 folder4 folder5
Настало время репликации:
# zfs send datapool/docs@today | zfs receive backuppool/backup # zfs list NAME USED AVAIL REFER MOUNTPOINT backuppool 83K 1.92G 19K /backuppool backuppool/backup 19K 1.92G 19K /backuppool/backup datapool 527K 1.92G 19K /datapool datapool/docs 19K 1.92G 19K /docs
Проверка результата:
# ls /backuppool/backup folder1 folder2 folder3 folder4 folder5
Набор данных datapool/docs@today
успешно реплицирован в backuppool/backup
.
Реплицирование набора данных на другую машину выполняется так:
# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup
Готово.
Заключение
Снапшоты, ктоны и реплиуи — самые мощные функции ZFS. Снапшоты используются для периодического создания копий файловых систем, клоны — для создания дублирующих наборов данных, реплики — для переноса набора данных из одного пула данных в другой на той же машине, или для переноса между машинами.