Преимущества и недостатки ZFS

ZFS кардинально отличается от всех существующих "классических" файловых
систем. Об её устройстве можно писать целые книги. Здесь я попытался
привести очень краткий список фактов об этой ФС.

Какие преимущества она имеет для простого пользователя дома или на работе?

* *Полная* замена не только файловой системы, но и менеджеров томов
  (EVMS, LVM, итд), RAID-массивов (как программных, так и аппаратных),
  средств кэширования (flashcache, гибридные диски). Удобство, малое
  затрачиваемое время на администрирование/обслуживание хранилищ.

* Прозрачная online проверка *целостности* данных (контрольные суммы, в
  том числе и криптографические), исправление ошибок на лету
  (self-healing, если есть избыточность). Классические файловые системы
  *вообще* не блюдут целостность ваших данных! ZFS имеет сильнейшие
  средства защиты и обнаружения порчи данных. Гарантированная
  *консистентность* файловых систем, нет нужды в fsck.

* Прозрачная LZ4/Zstandard *компрессия* данных может *существенно*
  повысить производительность (за счёт меньшего объёма обмениваемых с
  диском данных и того, что ARC кэш хранит, зачастую, в разы или даже на
  порядок больше фактических данных в памяти за счёт компрессии) и
  сэкономить место, лишь незначительно нагружая CPU.

* Мгновенно создаваемые снимки (*snapshots*) с возможностью
  моментального отката до любого состояния ФС. Делайте неизменяемые
  снимки хоть ежесекундно! Возможность чтения данных из снимков без
  полного отката ФС.

* Моментально создаваемые файловые системы (например, в виде
  поддиректорий к уже текущим) с независимыми друг от друга настройками
  и требованиями компрессии, избыточности, контроля целостности,
  обработке fsync-операций, квотами, резервирования места, свойств имён
  файлов (чувствительность к регистру, Unicode-нормализация),
  кэширования, управления доступом, итд.

* Возможность резервного копирования/восстановления полностью всех
  данных с одной или нескольких файловых систем (zfs send/recv) всего
  одной командой. В том числе, с созданием инкрементальных бэкапов.

* Возможность хранить не только файлы/файловые системы, но и просто
  эмулируемые блочные устройства (*zvol*), без ненужного overhead от
  файловой системы.

* Возможность моментального создания записываемых снимков файловых
  систем или блочных устройств (*clones*) -- клонов. Например их можно
  эффективно (не делая полной копии) использовать как основу для образов
  виртуальных машин, chroot-ов, jail-ов, контейнеров, и т.д..

* Возможность создания *надёжного* RAID5/RAID6 аналога без использования
  дорогостоящих vendor-lockin-ed контроллеров с батарейками (для
  предотвращения, так называемого, write-hole).

* Сборка/пересборка массивов, как правило, происходит значительнее
  быстрее чем на обычных RAID-ах, так как передаются только
  действительно хранимые данные, либо разница между ними, а не весь
  объём дисков.

ZFS можно сравнить с "классическими" ФС (пускай даже совместно с LVM и
RAID) как удобство использования DVCS по сравнению с полностью ручным
слежением за кодом программ.

А что она даст пользователям более серьёзных и крупных систем, в
дополнение к предыдущему списку?

* При использовании большого количества дисков и большого размера
  блоков, RAIDZ* будет иметь существенно меньше избыточной информации
  чем аналогичные уровни RAID5/6.

* Поддерживаемые уровни RAID: stripe -- аналог RAID0, mirror -- аналог
  RAID1, RAIDZ1 -- аналог RAID5, RAIDZ2 -- аналог RAID6, RAIDZ3 --
  аналогов не имеющий.

* Возможность создания многоуровневых массивов. Например 10 JBOD-ов с
  24-мя дисками можно объединить в stripe из 24-х RAIDZ2 массивов по 10
  дисков в каждом -- целых две полки полностью могут отказать при
  сохранении доступности данных.

* Возможность использование промежуточного кэша (*L2ARC*) для чтения. А
  также возможность использования отдельных (SSD)-дисков (*SLOG*) для
  существенного ускорения fsync-тяжёлых операций (СУБД, почтовые
  системы). "Жирные" ZFS системы с множеством дисков, L2ARC/SLOG
  устройствами и достаточным количеством оперативной памяти, как
  правило, превосходят по производительности остальных.

* Очень быстрая запись данных, в том числе параллельных потоков -- почти
  вся запись на диски происходит последовательно.

* Моментальное добавление дисков в массивы на лету и расширение его размера.

* Нет практических ограничений на размер файловой системы.

* Опциональная дедупликация данных.

Но ведь должны быть недостатки? Безусловно!

* Это сложная система тесно интегрирующаяся в уровень как блочных
  устройств, так и файловых систем. Поэтому ZFS до сих пор отсутствует в
  => пригодном
  для промышленного использования виде в Linux и пока это прерогатива
  Solaris и BSD систем.

* ZFS имеет огромное количество настроек -- производительность "из
  коробки" может в разы (или даже порядки) отличаться.

* ZFS сильно проседает по производительности при малом доступном объёме
  оперативной памяти. Это "дорогая" система, не пригодная для маломощных
  компьютеров. Однако это *не* означает что ZFS более медленная -- во
  многих случаях она будет работать быстрее остальных!

* ZFS может потребовать больше свободного места на дисках (или больше
  дисков) для: уменьшения негативного эффекта фрагментации данных;
  уменьшения избыточных данных на RAIDZ-массивах; уменьшения времени
  пересборки массивов. Это дорогая система!

* Вы не можете уменьшить размер массивов или убрать диски из
  stripe/RAIDZ, а также добавить диски в vdev.

* Использование аппаратных RAID-контроллеров или умных HBA (например с
  кэшем), как правило, будет только вредить, но никогда не помогать.

Не смотря на все эти недостатки и дороговизну, даже домашнему
пользователю преимущества удобства работы, создания бэкапов и мгновенных
снимков, контроль целостности данных должны перевесить.

Для удобства прикидывания конфигураций массивов (производительность
чтения/записи, IOPS чтения/записи, полезного места), привожу таблицу из
=> https://www.michaelwlucas.com/os/fmzfs FreeBSD Mastery: ZFS

+-------------------------------------------------------------------------------------------+
|Disks|Config| ReadIOPS | WriteIOPS | ReadMB/s | WriteMB/s | Usable Space | Fault Tolerance |
|-----+------+----------+-----------+----------+-----------+--------------+-----------------|
|1    |Stripe| 250      | 250       | 100      | 100       | 1 TB (100%)  | none            |
+-------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------+
|Disks|Config           |ReadIOPS|WriteIOPS|ReadMB/s|WriteMB/s|Usable Space|Fault Tolerance |
|-----+-----------------+--------+---------+--------+---------+------------+----------------|
|2    |2 x Stripe       |500     |500      |200     |200      |2 TB (100%) |none            |
|-----+-----------------+--------+---------+--------+---------+------------+----------------|
|2    |1 x 2 disk Mirror|500     |250      |200     |100      |1 TB (50%)  |1               |
+-------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------+
|Disks|Config            |ReadIOPS|WriteIOPS|ReadMB/s|WriteMB/s|Usable Space|Fault Tolerance|
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|3    |1 x 3 disk Mirror |750     |250      |300     |100      |1 TB (33%)  |2              |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|3    |1 x 3 disk RAID-Z1|250     |250      |200     |200      |2 TB (66%)  |1              |
+-------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------+
|Disks|Config            |ReadIOPS|WriteIOPS|ReadMB/s|WriteMB/s|Usable Space|Fault Tolerance|
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|4    |2 x 2 disk Mirror |1000    |500      |400     |200      |2 TB (50%)  |2 (1/VDEV)     |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|4    |1 x 4 disk RAID-Z1|250     |250      |300     |300      |3 TB (75%)  |1              |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|4    |1 x 4 disk RAID-Z2|250     |250      |200     |200      |2 TB (50%)  |2              |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|5    |1 x 5 disk RAID-Z1|250     |250      |400     |400      |4 TB (80%)  |1              |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|5    |1 x 5 disk RAID-Z2|250     |250      |300     |300      |3 TB (60%)  |2              |
|-----+------------------+--------+---------+--------+---------+------------+---------------|
|5    |1 x 5 disk RAID-Z3|250     |250      |200     |200      |2 TB (40%)  |3              |
+-------------------------------------------------------------------------------------------+

+--------------------------------------------------------------------------------------------+
|Disks|Config             |ReadIOPS|WriteIOPS|ReadMB/s|WriteMB/s|Usable Space|Fault Tolerance|
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|6    |3 x 2 disk Mirror  |1500    |750      |600     |300      |3 TB (50%)  |3 (1/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|6    |2 x 3 disk Mirror  |1500    |500      |600     |200      |2 TB (33%)  |4 (2/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|6    |1 x 6 disk RAID-Z1 |250     |250      |500     |500      |5 TB (83%)  |1              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|6    |1 x 6 disk RAID-Z2 |250     |250      |400     |400      |4 TB (66%)  |2              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|6    |1 x 6 disk RAID-Z3 |250     |250      |300     |300      |3 TB (50%)  |3              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |6 x 2 disk Mirror  |3000    |1500     |1200    |600      |6 TB (50%)  |6 (1/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |4 x 3 disk Mirror  |3000    |1000     |1200    |400      |4 TB (33%)  |8 (2/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |1 x 12 disk RAID-Z1|250     |250      |1100    |1100     |11 TB (92%) |1              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |2 x 6 disk RAID-Z1 |500     |500      |1000    |1000     |10 TB (83%) |2 (1/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |3 x 4 disk RAID-Z1 |750     |750      |900     |900      |9 TB (75%)  |3 (1/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |1 x 12-disk RAID-Z2|250     |250      |1000    |1000     |10 TB (83%) |2              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |2 x 6-disk RAID-Z2 |500     |500      |800     |800      |8 TB (66%)  |4 (2/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |1 x 12-disk RAID-Z3|250     |250      |900     |900      |9 TB (75%)  |3              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|12   |2 x 6-disk RAID-Z3 |500     |500      |600     |600      |6TB (50%)   |6 (3/VDEV)     |
+--------------------------------------------------------------------------------------------+

+--------------------------------------------------------------------------------------------+
|Disks|Config             |ReadIOPS|WriteIOPS|ReadMB/s|WriteMB/s|Usable Space|Fault Tolerance|
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |18 x 2 disk Mirror |9000    |4500     |3600    |1800     |18 TB (50%) |18 (1/VDEV)    |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |12 x 3 disk Mirror |9000    |3000     |3600    |1200     |12 TB (33%) |24 (2/VDEV)    |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |1 x 36 disk RAID-Z2|250     |250      |3400    |3400     |34 TB (94%) |2              |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |2 x 18 disk RAID-Z2|500     |500      |3200    |3200     |32 TB (89%) |4 (2/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |4 x 9 disk RAID-Z2 |1000    |1000     |2800    |2800     |28 TB (78%) |8 (2/VDEV)     |
|-----+-------------------+--------+---------+--------+---------+------------+---------------|
|36   |6 x 6 disk RAID-Z2 |1500    |1500     |2400    |2400     |24 TB (66%) |12 (2/VDEV)    |
+--------------------------------------------------------------------------------------------+