Справочная информация по ZFS
Поддержка 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
8
9
10
11
12
13
14
15
16
|
$ 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 из него одного:
1
2
3
4
5
6
7
8
9
10
11
|
$ 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’ов:
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 < ~/projects-snap.zfs
|
Репликация метаданных 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
7
8
9
10
11
12
13
14
15
|
$ 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
|
Теперь заполним его некоторыми данными и подсчитаем их контрольную сумму:
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
11
12
13
14
15
16
17
18
19
20
21
|
$ 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
|
Далее, давайте удалим устройство из пула:
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, так как он значительно быстрее всех остальных вариантов при хорошей производительности.