Снапшоты, клоны и реплики в ZFS on Linux

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

Добавить комментарий