Поддержка ZFS была добавлена в Ubuntu 15.10 Wily как предварительный анонс технологии, а затем стала полностью поддерживаемой в Ubuntu 16.04 Xenial. Обратите внимание, что ZFS поддерживается только 64-битными архитектурами.
Для установки ZFS используйте:
1 |
sudo apt-get install zfsutils-linux |
Ниже представлен краткий обзор ZFS, который можно рассматривать как начальный пример.
Содержание[Скрыть]
- 1 Виртуальные устройства ZFS (ZFS VDEV)
- 2 Пулы ZFS
- 3 RAID
- 4 Журнал регистрации намерений ZFS
- 5 Кэширующие устройства ZFS
- 6 Файловые системы ZFS
- 7 Моментальные снимки (снапшоты) ZFS
- 8 Клоны ZFS
- 9 Передача и получение ZFS
- 10 Репликация метаданных ZFS
- 11 Дедупликация ZFS
- 12 Явная очистка данных в пуле ZFS
- 13 Восстановление данных, простой пример
- 14 Сжатие данных ZFS
Виртуальные устройства 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» из трех физических устройств:
1 |
$ sudo zpool create pool-test /dev/sdb /dev/sdc /dev/sdd |
Чередование производится динамически, поэтому создается RAID-0 пул с нулевой избыточностью.
Примечание: если вы управляете множеством устройств, то можете их легко спутать, и, возможно, предпочтете имена /dev/disk/by-id/, которые часто используют серийные номера устройств. Приведенные здесь примеры не означают, что стоит использовать имена «sd_», они просто облегчают чтение.
Для просмотра состояния пула можно использовать следующую команду:
1 |
$ sudo zpool status pool-test |
Для удаления можно воспользоваться такой командой:
1 |
$ sudo zpool destroy pool-test |
Пример зеркального zpool размером 2 x 2
В следующем примере мы создадим zpool, содержащий VDEV из двух зеркальных устройств:
1 |
$ sudo zpool create mypool mirror /dev/sdc /dev/sdd |
Далее мы добавим в пул еще один VDEV из двух зеркальных устройств:
1 2 3 4 5 6 7 |
$ 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 |
В это примере:
- /dev/sdc, /dev/sdd, /dev/sde, /dev/sdf — физические устройства
- mirror-0, mirror-1 — VDEV’ы
- mypool — имя пула
Есть множество вариантов организации VDEV’ов в zpool.
Пример zpool на базе единственного файла
В следующем примеры мы используем один двухгигабайтный файл как VDEV и создадим zpool из него одного:
1 2 3 4 5 6 7 |
$ 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 |
В этом примере: * /home/user/example.img — VDEV на базе файла * pool-test — имя пула
RAID
ZFS предлагает различные варианты RAID:
VDEV’ы с чередованием
Эквивалент RAID0, без выделенного диска четности и без зеркалирования для пересборки данных. Не рекомендуется из-за риска потери данных при отказе устройства. Пример создания пула с чередованием из четырех VDEV’ов:
1 |
$ sudo zpool create example /dev/sdb /dev/sdc /dev/sdd /dev/sde |
Зеркалированные VDEV’ы
Как и в RAID1, можно использовать 2 и более VDEV’ов. Для N VDEV’ов из строя может выйти N-1 прежде, чем будут утрачены данные. Пример создания зеркального пула из двух VDEV’ов:
1 |
$ sudo zpool create example mirror /dev/sdb /dev/sdc |
Зеркальные VDEV’ы с чередованием
Как и RAID10 хорошо подходит для операций случайного чтения небольшими блоками. Создаются зеркальные пары, а затем данные записываются с чередованием поверх зеркальных копий. Пример создания зеркального пула размером 2 x 2:
1 |
sudo zpool create example mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde |
или
1 2 |
sudo zpool create example mirror /dev/sdb /dev/sdc sudo zpool add example mirror /dev/sdd /dev/sde |
RAIDZ
Как и RAID5, использует динамически изменяемый размер страйпа для блоков четности. Позволяет получить наибольший доступный объем от устройств, с контролем четности, но за счет некоторого снижения производительности. Допускается выход из строя одного диска без потери данных. Пример создания RAIDZ из четырех VDEV’ов:
1 |
$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde |
RAIDZ2
Как и RAID6, с двумя контрольными суммами и сохранностью данных при выходе из строя двух устройств, при производительности близкой к RAIDZ. Пример создания пула с двойной четностью из пяти VDEV’ов:
1 |
$ sudo zpool create example raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf |
RAIDZ3
При тройной четности допускается выход трех устройств из строя без потери данных, с производительностью на уровне RAIDZ2 и RAIDZ. Пример создания пула с тройной четностью из шести VDEV’ов:
1 |
$ 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:
1 2 |
$ 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 можно использовать одни или несколько устройств.
К примеру, для добавления двух SSD в пул «mypool», используйте команду:
1 |
$ sudo zpool add mypool log mirror /dev/sdb /dev/sdg -f |
Кэширующие устройства ZFS
Кэширующие устройства предоставляют дополнительный слой кэширования между оперативной памятью и диском. Они особенно полезны для повышения производительности при чтении преимущественно статичных данных случайными блоками.
К примеру, для добавления кэширующего устройства в пул «mypool» используйте команду:
1 |
$ sudo zpool add mypool cache /dev/sdh -f |
Файловые системы ZFS
ZFS позволяет создать в пуле до 2^64 файлов систем. В следующем примере мы создадим две файловые системы в пуле «mypool»:
1 2 |
sudo zfs create mypool/tmp sudo zfs create mypool/projects |
Для удаления файловой системы можно использовать команду:
1 |
sudo zfs destroy mypool/tmp |
Каждой файловой системе ZFS можно настроить отдельные параметры, например, установить квоту в размере 10 гигабайт:
1 |
sudo zfs set quota=10G mypool/projects |
Или добавить сжатие:
1 |
sudo zfs set compression=on mypool/projects |
Моментальные снимки (снапшоты) ZFS
Снапшот ZFS — это копия файловой системы ZFS или тома ZFS с доступом только для чтения. Он может использоваться для сохранения состояния файловой системы в определенный момент времени и для отката к этому состоянию позднее. Из снапшота можно извлечь файлы без необходимости выполнять полный откат.
В следующем примере мы создадим снапшот файловой системы mypool/projects:
1 |
$ sudo zfs snapshot -r mypool/projects@snap1 |
Мы можем посмотреть список снапшотов:
1 2 3 |
$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT mypool/projects@snap1 8.80G - 8.80G - |
Давайте теперь «случайно» удалим все файлы, а затем выполним откат:
1 2 |
$ rm -rf /mypool/projects $ sudo zfs rollback mypool/projects@snap1 |
Удалить снапшот можно так:
1 |
$ sudo zfs destroy mypool/projects@snap1 |
Клоны ZFS
Клон ZFS — это копия файловой системы с возможностью записи, в которой исходное содержимое идентично исходной файловое системе. Клон ZFS может быть создан только из снапшота ZFS и такой снапшот не может быть уничтожен, пока не уничтожены все клоны, созданные на его основе.
К примеру, для клонирования mypool/projects сначала создадим снапшот, а потом склонируем:
1 2 |
$ sudo zfs snapshot -r mypool/projects@snap1 $ sudo zfs clone mypool/projects@snap1 mypool/projects-clone |
Передача и получение ZFS
ZFS send отправляет снапшот файловой системы, который может быть переслан в файл или на другую машину в потоковом режиме. ZFS receive принимает такой поток и записывает копию снапшота обратно в файловую систему ZFS. Это отлично подходит для создания бэкапов или отправки копий по сети (к примеру, через ssh) для копирования файловой системы.
Для примера, создадим снапшот и сохраним его в файл:
1 2 |
sudo zfs snapshot -r mypool/projects@snap2 sudo zfs send mypool/projects@snap2 > ~/projects-snap.zfs |
И вернем его обратно:
1 |
sudo zfs receive -F mypool/projects-copy |
Репликация метаданных ZFS
При репликации метаданных создается больше избыточных копий метаданных, просто для повышения избыточности. В пуле с хранилищем из единственного устройства, реплицируемые метаданные распределяются по всему устройству, пытаясь поместить блоки хотя бы на 1/8 части диска. При наличии нескольких устройств в пуле, ZFS пытается распределить блоки с метаданными по отдельным VDEV’ам. Можно настроить от одной до трех копий. Для примера, настроим 3 копии в mypool/projects:
1 |
$ sudo zfs set copies=3 mypool/projects |
Дедупликация ZFS
ZFS dedup уберет блоки, которые идентичны существующим блокам, и вместо них будет использовать ссылку на существующий блок. Это освобождает место на устройстве, но за счет больших объемов оперативной памяти. Таблица дедупликации «in-memory» использует примерно по 320 байт на блок. Чем больше размер таблицы, тем медленнее становится запись.
Для примера, включим дедупликацию на mypool/projects:
1 |
$ sudo zfs set dedup=on mypool/projects |
Явная очистка данных в пуле ZFS
Для инициирования принудительной проверки целостности пула используется команда zfs scrub. Пример вызова явной очистки данных пула «mypool»:
1 |
$ sudo zpool scrub mypool |
Для проверки состояния явной очистки можно использовать zpool status:
1 |
$ sudo zpool status -v mypool |
Восстановление данных, простой пример
Представим, что у нас есть зеркальный zpool размером 2 x 2:
1 2 3 4 5 6 |
$ 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 |
Теперь заполним его некоторыми данными и подсчитаем их контрольную сумму:
1 2 3 |
$ dd if=/dev/urandom of=/mypool/random.dat bs=1M count=4096 $ md5sum /mypool/random.dat f0ca5a6e2718b8c98c2e0fdabd83d943 /mypool/random.dat |
Теперь мы можем симулировать масштабную потерю данных путем заполнения одного из устройств VDEV нулями:
1 |
$ sudo dd if=/dev/zero of=/dev/sde bs=1M count=8192 |
А сейчас инициируем явную очистку данных:
1 |
$ sudo zpool scrub mypool |
Проверим статус:
1 2 3 4 5 6 7 8 9 10 |
$ 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 |
Далее, давайте удалим устройство из пула:
1 |
$ sudo zpool detach mypool /dev/sde |
Выполним горячее извлечение и добавим новое:
1 |
$ sudo zpool attach mypool /dev/sdf /dev/sde -f |
Инициируем явную очистку для восстановления зеркала 2 x 2:
1 |
$ sudo zpool scrub mypool |
Сжатие данных ZFS
Как уже упоминалось ранее, ZFS позволяет автоматически сжимать данные. Учитывая мощность современных процессоров, это — полезная опция, так как уменьшенный размер данных означает, что меньше данных будут физически прочитаны и записаны, из чего следует более быстрые операции ввода/вывода. ZFS предоставляет широкий набор методов сжатия. По умолчанию используется lz4 (высокопроизводительная замена для lzjb), что дает более быстрые сжатие и распаковку по сравнению с lzjb при несколько большей степени сжатия. Для смены уровня компрессии можно использовать команду:
1 |
sudo zfs set compression=gzip-9 mypool |
Или даже можно сменить тип сжатия:
1 |
sudo zfs set compression=lz4 mypool |
Просмотр уровеня компрессии:
1 |
sudo zfs get compressratio |
Самый безопасный выбор — это lz4, так как он значительно быстрее всех остальных вариантов при хорошей производительности.
Ваш комментарий будет первым