Справочная информация по ZFS

ZFS

Поддержка ZFS была добавлена в Ubuntu 15.10 Wily как предварительный анонс технологии, а затем стала полностью поддерживаемой в Ubuntu 16.04 Xenial. Обратите внимание, что ZFS поддерживается только 64-битными архитектурами.

Для установки ZFS используйте:

sudo apt-get install zfsutils-linux

Ниже представлен краткий обзор ZFS, который можно рассматривать как начальный пример. Для дальнейшего изучения ZFS вы можете воспользоваться прекрасной документацией за авторством Aaron Toponce.


Виртуальные устройства ZFS (ZFS VDEV)

VDEV - это мета-устройство, которое представляет собой одно или несколько устройств. ZFS поддерживает 7 различных типов VDEV: * Файл - предварительно размеченный файл * Физическое устройство (HDD, SDD, PCIe NVME и т.д.) * Зеркало - стандартное зеркало RAID1 * Программные массивы ZFS raidz1, raidz2, raidz3 - "распределенные" массивы RAID с выделенным диском четности * Горячий резерв (Hot Spare) - горячий резерв для программного RAID-массива ZFS * Кэш - устройство для кэша чтения второго уровня (ZFS L2ARC) * Журнал - журнал регистрации намерений ZFS (ZFS ZIL)

VDEV динамически чередуются в ZFS. Устройство может быть добавлено в VDEV, но не может быть удалено из него.


Пулы ZFS

Под zpool понимается пул хранилищ, созданный из набора VDEV. В пуле ZFS можно создать одну или несколько файловых систем ZFS.

В следующем примере создается пул "pool-test" из трех физических устройств:

$ sudo zpool create pool-test /dev/sdb /dev/sdc /dev/sdd

Чередование производится динамически, поэтому создается RAID-0 пул с нулевой избыточностью.

Примечание: если вы управляете множеством устройств, то можете их легко спутать, и, возможно, предпочтете имена /dev/disk/by-id/, которые часто используют серийные номера устройств. Приведенные здесь примеры не означают, что стоит использовать имена "sd_", они просто облегчают чтение.

Для просмотра состояния пула можно использовать следующую команду:

$ sudo zpool status pool-test

Для удаления можно воспользоваться такой командой:

$ sudo zpool destroy pool-test

Пример зеркального zpool размером 2 x 2

В следующем примере мы создадим zpool, содержащий VDEV из двух зеркальных устройств:

$ sudo zpool create mypool mirror /dev/sdc /dev/sdd

Далее мы добавим в пул еще один VDEV из двух зеркальных устройств:

$ sudo zpool add mypool mirror /dev/sde /dev/sdf -f

$ sudo zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0

В это примере:

  • /dev/sdc, /dev/sdd, /dev/sde, /dev/sdf - физические устройства
  • mirror-0, mirror-1 - VDEV'ы
  • mypool - имя пула

Есть множество вариантов организации VDEV'ов в zpool.

Пример zpool на базе единственного файла

В следующем примеры мы используем один двухгигабайтный файл как VDEV и создадим zpool из него одного:

$ dd if=/dev/zero of=example.img bs=1M count=2048
$ sudo zpool create pool-test /home/user/example.img
$ sudo zpool status
  pool: pool-test
 state: ONLINE
  scan: none requested
config:

        NAME                      STATE     READ WRITE CKSUM
        pool-test                 ONLINE       0     0     0
          /home/user/example.img  ONLINE       0     0     0

В этом примере: * /home/user/example.img - VDEV на базе файла * pool-test - имя пула


RAID

ZFS предлагает различные варианты RAID:

VDEV'ы с чередованием

Эквивалент RAID0, без выделенного диска четности и без зеркалирования для пересборки данных. Не рекомендуется из-за риска потери данных при отказе устройства. Пример создания пула с чередованием из четырех VDEV'ов:

$ sudo zpool create example /dev/sdb /dev/sdc /dev/sdd /dev/sde

Зеркалированные VDEV'ы

Как и в RAID1, можно использовать 2 и более VDEV'ов. Для N VDEV'ов из строя может выйти N-1 прежде, чем будут утрачены данные. Пример создания зеркального пула из двух VDEV'ов:

$ sudo zpool create example mirror /dev/sdb /dev/sdc

Зеркальные VDEV'ы с чередованием

Как и RAID10 хорошо подходит для операций случайного чтения небольшими блоками. Создаются зеркальные пары, а затем данные записываются с чередованием поверх зеркальных копий. Пример создания зеркального пула размером 2 x 2:

sudo zpool create example mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde

или

sudo zpool create example mirror /dev/sdb /dev/sdc
sudo zpool add example mirror /dev/sdd /dev/sde

RAIDZ

Как и RAID5, использует динамически изменяемый размер страйпа для блоков четности. Позволяет получить наибольший доступный объем от устройств, с контролем четности, но за счет некоторого снижения производительности. Допускается выход из строя одного диска без потери данных. Пример создания RAIDZ из четырех VDEV'ов:

$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

RAIDZ2

Как и RAID6, с двумя контрольными суммами и сохранностью данных при выходе из строя двух устройств, при производительности близкой к RAIDZ. Пример создания пула с двойной четностью из пяти VDEV'ов:

$ sudo zpool create example raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

RAIDZ3

При тройной четности допускается выход трех устройств из строя без потери данных, с производительностью на уровне RAIDZ2 и RAIDZ. Пример создания пула с тройной четностью из шести VDEV'ов:

$ sudo zpool create example raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg

Вложенный RAIDZ

Как RAID50 и RAID60 - это тома RAIDZ с чередованием. Показывает большую производительность, чем RAIDZ, но за счет снижения доступного объема. Пример 2 x RAIDZ:

$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde
$ sudo zpool add example raidz /dev/sdf /dev/sdg /dev/sdh /dev/sdi

Журнал регистрации намерений ZFS

Устройства ZIL (журнал регистрации намерений ZFS) могут быть добавлены в пул ZFS для ускорения записи при любом уровне ZFS RAID. Обычно для ZIL используется быстрый SSD. Теоретически, ZIL - это журнал, в который данные и метаданные заносятся перед тем как будут сброшены на диск транзакционной записью. В действительности же ZIL более сложен и детально описывается здесь. Для ZIL можно использовать одни или несколько устройств.

К примеру, для добавления двух SSD в пул "mypool", используйте команду:

$ sudo zpool add mypool log mirror /dev/sdb /dev/sdg -f

Кэширующие устройства ZFS

Кэширующие устройства предоставляют дополнительный слой кэширования между оперативной памятью и диском. Они особенно полезны для повышения производительности при чтении преимущественно статичных данных случайными блоками.

К примеру, для добавления кэширующего устройства в пул "mypool" используйте команду:

$ sudo zpool add mypool cache /dev/sdh -f

Файловые системы ZFS

ZFS позволяет создать в пуле до 2^64 файлов систем. В следующем примере мы создадим две файловые системы в пуле "mypool":

sudo zfs create mypool/tmp
sudo zfs create mypool/projects

Для удаления файловой системы можно использовать команду:

sudo zfs destroy mypool/tmp

Каждой файловой системе ZFS можно настроить отдельные параметры, например, установить квоту в размере 10 гигабайт:

sudo zfs set quota=10G mypool/projects

Или добавить сжатие:

sudo zfs set compression=on mypool/projects

Моментальные снимки (снапшоты) ZFS

Снапшот ZFS - это копия файловой системы ZFS или тома ZFS с доступом только для чтения. Он может использоваться для сохранения состояния файловой системы в определенный момент времени и для отката к этому состоянию позднее. Из снапшота можно извлечь файлы без необходимости выполнять полный откат.

В следующем примере мы создадим снапшот файловой системы mypool/projects:

$ sudo zfs snapshot -r mypool/projects@snap1

Мы можем посмотреть список снапшотов:

$ sudo zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
mypool/projects@snap1   8.80G      -  8.80G  -

Давайте теперь "случайно" удалим все файлы, а затем выполним откат:

$ rm -rf /mypool/projects
$ sudo zfs rollback mypool/projects@snap1

Удалить снапшот можно так:

$ sudo zfs destroy mypool/projects@snap1

Клоны ZFS

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

К примеру, для клонирования mypool/projects сначала создадим снапшот, а потом склонируем:

$ sudo zfs snapshot -r mypool/projects@snap1
$ sudo zfs clone mypool/projects@snap1 mypool/projects-clone

Передача и получение ZFS

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

Для примера, создадим снапшот и сохраним его в файл:

sudo zfs snapshot -r mypool/projects@snap2
sudo zfs send mypool/projects@snap2 > ~/projects-snap.zfs

И вернем его обратно:

sudo zfs receive -F mypool/projects-copy < ~/projects-snap.zfs

Репликация метаданных ZFS

При репликации метаданных создается больше избыточных копий метаданных, просто для повышения избыточности. В пуле с хранилищем из единственного устройства, реплицируемые метаданные распределяются по всему устройству, пытаясь поместить блоки хотя бы на 1/8 части диска. При наличии нескольких устройств в пуле, ZFS пытается распределить блоки с метаданными по отдельным VDEV'ам. Можно настроить от одной до трех копий. Для примера, настроим 3 копии в mypool/projects:

$ sudo zfs set copies=3 mypool/projects

Дедупликация ZFS

ZFS dedup уберет блоки, которые идентичны существующим блокам, и вместо них будет использовать ссылку на существующий блок. Это освобождает место на устройстве, но за счет больших объемов оперативной памяти. Таблица дедупликации "in-memory" использует примерно по 320 байт на блок. Чем больше размер таблицы, тем медленнее становится запись.

Для примера, включим дедупликацию на mypool/projects:

$ sudo zfs set dedup=on mypool/projects

Для более детального изучения плюсов и минусов дедупликации, обратитесь к этой статье. В большинстве случаев дедупликация не стоит такого существенного снижения производительности.


Явная очистка данных в пуле ZFS

Для инициирования принудительной проверки целостности пула используется команда zfs scrub. Пример вызова явной очистки данных пула "mypool":

$ sudo zpool scrub mypool

Для проверки состояния явной очистки можно использовать zpool status:

$ sudo zpool status -v mypool

Восстановление данных, простой пример

Представим, что у нас есть зеркальный zpool размером 2 x 2:

$ sudo zpool create mypool mirror /dev/sdc /dev/sdd mirror /dev/sde /dev/sdf -f
$ sudo zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0

Теперь заполним его некоторыми данными и подсчитаем их контрольную сумму:

$ dd if=/dev/urandom of=/mypool/random.dat bs=1M count=4096
$ md5sum /mypool/random.dat
f0ca5a6e2718b8c98c2e0fdabd83d943  /mypool/random.dat

Теперь мы можем симулировать масштабную потерю данных путем заполнения одного из устройств VDEV нулями:

$ sudo dd if=/dev/zero of=/dev/sde bs=1M count=8192

А сейчас инициируем явную очистку данных:

$ sudo zpool scrub mypool

Проверим статус:

$ sudo zpool status
  pool: mypool
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-9P
  scan: scrub in progress since Tue May 12 17:34:53 2015
    244M scanned out of 1.91G at 61.0M/s, 0h0m to go
    115M repaired, 12.46% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0   948  (repairing)
            sdf     ONLINE       0     0     0

Далее, давайте удалим устройство из пула:

$ sudo zpool detach mypool /dev/sde

Выполним горячее извлечение и добавим новое:

$ sudo zpool attach mypool /dev/sdf /dev/sde  -f

Инициируем явную очистку для восстановления зеркала 2 x 2:

$ sudo zpool scrub mypool

Сжатие данных ZFS

Как уже упоминалось ранее, ZFS позволяет автоматически сжимать данные. Учитывая мощность современных процессоров, это - полезная опция, так как уменьшенный размер данных означает, что меньше данных будут физически прочитаны и записаны, из чего следует более быстрые операции ввода/вывода. ZFS предоставляет широкий набор методов сжатия. По умолчанию используется lz4 (высокопроизводительная замена для lzjb), что дает более быстрые сжатие и распаковку по сравнению с lzjb при несколько большей степени сжатия. Для смены уровня компрессии можно использовать команду:

sudo zfs set compression=gzip-9 mypool

Или даже можно сменить тип сжатия:

sudo zfs set compression=lz4 mypool

Просмотр уровеня компрессии:

sudo zfs get compressratio

Самый безопасный выбор - это lz4, так как он значительно быстрее всех остальных вариантов при хорошей производительности.

Источник: https://wiki.ubuntu.com/Kernel/Reference/ZFS

Статьи и заметки
ЛИЧНЫЙ КАБИНЕТ
На вашу почту отправлено сообщение с кодом подтверждения. Введите его для завершения регистрации.
ВЫПОЛНИТЬ