ZFS представляет собой переосмысление системы хранения данных, комбинирующее в едином инструменте традиционные файловые системы и системы управления томами. ZFS обладает некоторой специфичной терминологией, которая отличает её от более традиционных систем хранения данных, однако имеет отличный набор возможностей, акцентированных на удобстве использования системными администраторами.
Концепции ZFS ¶
Виртуальные устройства ¶
Виртуальное устройство (VDEV) подобно устройству RAID, представляемого RAID-контроллером. Есть несколько типов виртуальных устройств (VDEV), которые предлагают различные преимущества, включая отказоустойчивость и скорость доступа. В основном виртуальные устройства (VDEV) предоставляют лучшую отказоустойчивость и безопасность, нежели RAID-контроллеры. Не рекомендуется использовать установку RAID с ZFS, поскольку ZFS рассчитывает непосредственно управлять дисками.
Типы виртуальных устройств (VDEV)
- mirror (поддерживается n-кратное зеркалирование)
- raidz
- raidz1 (1-диск четности, аналог RAID 5)
- raidz2 (2-диска четности, аналог RAID 6)
- raidz3 (3-диска четности, нет имеет аналогичного RAID-массива)
- disk
- file (не рекомендовано для промышленного применения из-за добавления нежелательного промежуточного слоя иной файловой системы)
Ваши данные распределяются среди всех виртуальных устройств (VDEV), представленных в пуле хранения, так что увеличив число виртуальных устройств (VDEV), вы увеличите количество IOPS.
Пулы хранения ¶
ZFS использует пулы хранения как абстракцию над нижним уровнем провайдера хранения (VDEV), позволяя вам отделить видимые пользователю файловые системы от физического их размещения.
ZFS датасеты ¶
ZFS датасеты подобны традиционным файловым системам, но имеют гораздо больше возможностей, обеспечивающих обилие преимуществ ZFS. Датасеты поддерживают Copy on Write, снапшоты, квоты, сжатие и дедубликацию.
Ограничения ¶
Один каталог может содержать до 2^48 файлов, каждый до 16 эксабайт. Один пул хранения может содержать до 256 зеттабайт (2^78) данных и может быть распределён по 2^64 устройствам. А один хост может иметь 2^64 пула хранения. Лимиты огромны.
Команды ¶
Пулы хранения ¶
Действия:
- Просмотр
- Статус
- Удаление
- Получение/установка свойств
Просмотр пулов
1# Создание пула типа raidz
2$ zpool create zroot raidz1 gpt/zfs0 gpt/zfs1 gpt/zfs2
3
4# Просмотр пулов
5$ zpool list
6NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
7zroot 141G 106G 35.2G - 43% 75% 1.00x ONLINE -
8
9# Просмотр детализованной информации о конкретном пуле
10$ zpool list -v zroot
11NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
12zroot 141G 106G 35.2G - 43% 75% 1.00x ONLINE -
13 gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 141G 106G 35.2G - 43% 75%
Статус пулов
1# Получение информации о статусе пулов
2$ zpool status
3 pool: zroot
4 state: ONLINE
5 scan: scrub repaired 0 in 2h51m with 0 errors on Thu Oct 1 07:08:31 2015
6config:
7
8 NAME STATE READ WRITE CKSUM
9 zroot ONLINE 0 0 0
10 gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0
11
12errors: No known data errors
13
14# Скрабинг пула для исправления любых ошибок
15$ zpool scrub zroot
16$ zpool status -v zroot
17 pool: zroot
18 state: ONLINE
19 scan: scrub in progress since Thu Oct 15 16:59:14 2015
20 39.1M scanned out of 106G at 1.45M/s, 20h47m to go
21 0 repaired, 0.04% done
22config:
23
24 NAME STATE READ WRITE CKSUM
25 zroot ONLINE 0 0 0
26 gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0
27
28errors: No known data errors
Свойства пулов
1# Получение свойств пула, свойства могут быть заданы пользователем или системой.
2$ zpool get all zroot
3NAME PROPERTY VALUE SOURCE
4zroot size 141G -
5zroot capacity 75% -
6zroot altroot - default
7zroot health ONLINE -
8...
9
10# Установка значения свойства пула
11$ zpool set comment="Storage of mah stuff" zroot
12$ zpool get comment
13NAME PROPERTY VALUE SOURCE
14tank comment - default
15zroot comment Storage of mah stuff local
Удаление пула
1$ zpool destroy test
Датасеты ¶
Действия:
- Создание
- Просмотр
- Переименование
- Удаление
- Получение/установка свойств
Создание датасетов
1# Создание датасета
2$ zfs create zroot/root/data
3$ mount | grep data
4zroot/root/data on /data (zfs, local, nfsv4acls)
5
6# Создание дочернего датасета
7$ zfs create zroot/root/data/stuff
8$ mount | grep data
9zroot/root/data on /data (zfs, local, nfsv4acls)
10zroot/root/data/stuff on /data/stuff (zfs, local, nfsv4acls)
11
12
13# Создание тома
14$ zfs create -V zroot/win_vm
15$ zfs list zroot/win_vm
16NAME USED AVAIL REFER MOUNTPOINT
17zroot/win_vm 4.13G 17.9G 64K -
Просмотр датасетов
1# Просмотр всех датасетов
2$ zfs list
3NAME USED AVAIL REFER MOUNTPOINT
4zroot 106G 30.8G 144K none
5zroot/ROOT 18.5G 30.8G 144K none
6zroot/ROOT/10.1 8K 30.8G 9.63G /
7zroot/ROOT/default 18.5G 30.8G 11.2G /
8zroot/backup 5.23G 30.8G 144K none
9zroot/home 288K 30.8G 144K none
10...
11
12# Просмотр конкретного датасета
13$ zfs list zroot/home
14NAME USED AVAIL REFER MOUNTPOINT
15zroot/home 288K 30.8G 144K none
16
17# Просмотр снапшотов
18$ zfs list -t snapshot
19zroot@daily-2015-10-15 0 - 144K -
20zroot/ROOT@daily-2015-10-15 0 - 144K -
21zroot/ROOT/default@daily-2015-10-15 0 - 24.2G -
22zroot/tmp@daily-2015-10-15 124K - 708M -
23zroot/usr@daily-2015-10-15 0 - 144K -
24zroot/home@daily-2015-10-15 0 - 11.9G -
25zroot/var@daily-2015-10-15 704K - 1.42G -
26zroot/var/log@daily-2015-10-15 192K - 828K -
27zroot/var/tmp@daily-2015-10-15 0 - 152K -
Переименование датасетов
1$ zfs rename zroot/root/home zroot/root/old_home
2$ zfs rename zroot/root/new_home zroot/root/home
Удаление датасета
1# Датасеты не могут быть удалены, если у них имеются какие-то снапшоты
2$ zfs destroy zroot/root/home
Получение / установка свойств датасета
1# Получение всех свойств
2$ zfs get all zroot/usr/home
3NAME PROPERTY VALUE SOURCE
4zroot/home type filesystem -
5zroot/home creation Mon Oct 20 14:44 2014 -
6zroot/home used 11.9G -
7zroot/home available 94.1G -
8zroot/home referenced 11.9G -
9zroot/home mounted yes -
10...
11
12# Получения свойства для датасета
13$ zfs get compression zroot/usr/home
14NAME PROPERTY VALUE SOURCE
15zroot/home compression off default
16
17# Установка значения свойства на датасете
18$ zfs set compression=lz4 zroot/lamb
19
20# Получение значений выбранных свойств всех датасетов
21$ zfs list -o name,quota,reservation
22NAME QUOTA RESERV
23zroot none none
24zroot/ROOT none none
25zroot/ROOT/default none none
26zroot/tmp none none
27zroot/usr none none
28zroot/home none none
29zroot/var none none
30...
Снапшоты ¶
ZFS снапшоты – одна из очень важных особенностей zfs
- Место, которое они занимают, равно разнице данных между файловой системой и её снапшотом
- Время создания занимает считанные секунды
- Восстановление настолько быстро, насколько позволяет вам запись данных
- Они очень просты в автоматизации
Действия:
- Создание
- Удаление
- Переименование
- Получение доступа к снапшотам
- Отправка / Получение
- Клонирование
Создание снапшотов
1# Создание снапшота единственного датасета
2zfs snapshot zroot/home/sarlalian@now
3
4# Создание снапшота для родительского и дочерних датасетов
5$ zfs snapshot -r zroot/home@now
6$ zfs list -t snapshot
7NAME USED AVAIL REFER MOUNTPOINT
8zroot/home@now 0 - 26K -
9zroot/home/sarlalian@now 0 - 259M -
10zroot/home/alice@now 0 - 156M -
11zroot/home/bob@now 0 - 156M -
12...
Удаление снапшотов
1# Как удалить снапшот
2$ zfs destroy zroot/home/sarlalian@now
3
4# Удаление снапшота в родительском и дочерних датасетах
5$ zfs destroy -r zroot/home/sarlalian@now
Переименование снапшотов
1# Переименование снапшота
2$ zfs rename zroot/home/sarlalian@now zroot/home/sarlalian@today
3$ zfs rename zroot/home/sarlalian@now today
4
5$ zfs rename -r zroot/home@now @yesterday
Получение доступа к спапшотам
1# CD в каталог снапшота
2$ cd /home/.zfs/snapshot/
Отправка и получение
1# Сохранение снапшота в файл
2$ zfs send zroot/home/sarlalian@now | gzip > backup_file.gz
3
4# Отправка снапшота в другой датасет
5$ zfs send zroot/home/sarlalian@now | zfs recv backups/home/sarlalian
6
7# Отправка снапшота на удаленный хост
8$ zfs send zroot/home/sarlalian@now | ssh root@backup_server 'zfs recv zroot/home/sarlalian'
9
10# Отправка полного датасета со снапшотами на новый хост
11$ zfs send -v -R zroot/home@now | ssh root@backup_server 'zfs recv zroot/home'
Клонирование снапшотов
1# Клонирование снапшота
2$ zfs clone zroot/home/sarlalian@now zroot/home/sarlalian_new
3
4# Повышение клона, чтобы он больше не зависел от снапшота
5$ zfs promote zroot/home/sarlalian_new
Собираем всё вместе ¶
Нижеследующий скрипт использует FreeBSD, jails и ZFS для автоматизации подготовки чистой копии стейджинговой базы mysql с живой реплики слейв-ноды.
1#!/bin/sh
2
3echo "==== Остановка стейджингового сервера баз данных ===="
4jail -r staging
5
6echo "==== Очистка существующих стейджингового сервера и снапшота ===="
7zfs destroy -r zroot/jails/staging
8zfs destroy zroot/jails/slave@staging
9
10echo "==== Фиксация базы на слейве ===="
11echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slave
12
13echo "==== Сохранение снапшота файлов базы слейва как zroot/jails/slave@staging ===="
14zfs snapshot zroot/jails/slave@staging
15
16echo "==== Запуск слейв-ноды сервера баз данных ===="
17jail -c slave
18
19echo "==== Клонирование снапшота слейва на стейджинговый сервер ===="
20zfs clone zroot/jails/slave@staging zroot/jails/staging
21
22echo "==== Установка конфига стейджингово mysql ===="
23mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slave
24cp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnf
25
26echo "==== Настройка стейджингового файла rc.conf ===="
27mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slave
28mv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.local
29
30echo "==== Запуск стейджингово сервера баз данных ===="
31jail -c staging
32
33echo "==== Отключение синхронизации стейджинговой базы с мастером ===="
34echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging
35echo "RESET SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging