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