zfs.md

Личный сайт Go-разработчика из Казани

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

Почитать дополнительно