---
contributors:
    - ["sarlalian", "http://github.com/sarlalian"]
    - ["A1EF", "https://github.com/A1EF"]
translators:
    - ["A1EF", "https://github.com/A1EF"]
---


[ZFS](http://open-zfs.org/wiki/Main_Page)
представляет собой переосмысление системы хранения данных, комбинирующее в едином инструменте
традиционные файловые системы и системы управления томами. 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](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8), снапшоты, квоты, сжатие и дедубликацию.


### Ограничения

Один каталог может содержать до 2^48 файлов, каждый до 16 эксабайт. Один пул хранения может содержать до 256 зеттабайт (2^78) данных
и может быть распределён по 2^64 устройствам. А один хост может иметь 2^64 пула хранения. Лимиты огромны.


## Команды

### Пулы хранения

Действия:

* Просмотр
* Статус
* Удаление
* Получение/установка свойств

Просмотр пулов

```bash
# Создание пула типа 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%
```

Статус пулов

```bash
# Получение информации о статусе пулов
$ 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
```

Свойства пулов

```bash
# Получение свойств пула, свойства могут быть заданы пользователем или системой.
$ 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
```

Удаление пула

```bash
$ zpool destroy test
```


### Датасеты

Действия:

* Создание
* Просмотр
* Переименование
* Удаление
* Получение/установка свойств

Создание датасетов

```bash
# Создание датасета
$ 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  -
```

Просмотр датасетов

```bash
# Просмотр всех датасетов
$ 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  -
```

Переименование датасетов

```bash
$ zfs rename zroot/root/home zroot/root/old_home
$ zfs rename zroot/root/new_home zroot/root/home
```

Удаление датасета

```bash
# Датасеты не могут быть удалены, если у них имеются какие-то снапшоты
$ zfs destroy zroot/root/home
```

Получение / установка свойств датасета

```bash
# Получение всех свойств
$ 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

* Место, которое они занимают, равно разнице данных между файловой системой и её снапшотом
* Время создания занимает считанные секунды
* Восстановление настолько быстро, насколько позволяет вам запись данных
* Они очень просты в автоматизации

Действия:

* Создание
* Удаление
* Переименование
* Получение доступа к снапшотам
* Отправка / Получение
* Клонирование


Создание снапшотов

```bash
# Создание снапшота единственного датасета
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  -
...
```

Удаление снапшотов

```bash
# Как удалить снапшот
$ zfs destroy zroot/home/sarlalian@now

# Удаление снапшота в родительском и дочерних датасетах
$ zfs destroy -r zroot/home/sarlalian@now
```

Переименование снапшотов

```bash
# Переименование снапшота
$ zfs rename zroot/home/sarlalian@now zroot/home/sarlalian@today
$ zfs rename zroot/home/sarlalian@now today

$ zfs rename -r zroot/home@now @yesterday
```

Получение доступа к спапшотам

```bash
# CD в каталог снапшота
$ cd /home/.zfs/snapshot/
```

Отправка и получение

```bash
# Сохранение снапшота в файл
$ 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'
```

Клонирование снапшотов

```bash
# Клонирование снапшота
$ zfs clone zroot/home/sarlalian@now zroot/home/sarlalian_new

# Повышение клона, чтобы он больше не зависел от снапшота
$ zfs promote zroot/home/sarlalian_new
```

### Собираем всё вместе

Нижеследующий скрипт использует FreeBSD, jails и ZFS для автоматизации
подготовки чистой копии стейджинговой базы mysql с живой реплики слейв-ноды.

```bash
#!/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
```


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

* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs)
* [FreeBSD Handbook on ZFS](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/zfs.html)
* [BSDNow's Crash Course on ZFS](http://www.bsdnow.tv/tutorials/zfs)
* [Oracle's Tuning Guide](http://www.oracle.com/technetwork/articles/servers-storage-admin/sto-recommended-zfs-settings-1951715.html)
* [OpenZFS Tuning Guide](http://open-zfs.org/wiki/Performance_tuning)
* [FreeBSD ZFS Tuning Guide](https://wiki.freebsd.org/ZFSTuningGuide)