Это старая версия документа!
Zettabyte File System - ФС с деревом Меркла, от Sun Microsystems, создана в 2004-2005 гг для Solaris.
Поддерживает большие объемы данных, объединяет концепции файловой системы, массивов RAID, менеджера логических томов, принципы легковесных файловых систем, представляет простое управление томами хранения данных
На момент создания была новаторской, есть открытая реализация «OpenZFS»
Обеспечивает полный контроль над физическими носителями и логическими томами и постоянное поддержание консистентности ФС.
Оперируя на разных уровнях абстракции данных ZFS способна обеспечить высокую скорость доступа к ним, контроль целостности. Позволяет в процессе работы менять объем дискового пространства и задавать разный размер блоков данных для разных применений. Обеспечивает параллельность выполнения чтения/записи
Собсна в открытом доступе есть именно «OpenZFS», он появился сразу после закрытия исходников первого, основан основателями ZFS
По сути из-за формальностей, OpenZFS распространяется под лицензией «CDDL» из за чего не может быть включена в ядро Linux по умолчанию, поэтому есть танцы с ее установкой, но в целом у каждой собаки есть инструкция как на нее поставить ZFS
Основные преимущества:
объединенное хранилище
Это про совмещение возможностей ФС и менеджера дисков
ZFS может создать ФС охватив все диски, можно так же добавить хранилище в систему дисков. ZFS займется разделением и форматированием дисков
Copy-on-write
В отличии от большинства других ФС, тут новая инфа записывается в отдельный блок и как только запись завершена, метаданные обновляются к новой точке.
Это гарантирует что пока новая инфа корректно и полностью не запишется, старая инфа будет фиксирована
Не требуется запускать fsck после сбоя
Снапшоты
ZFS использует снапшоты для того чтобы следить за изменениями в файловой системе
Снимок хранит оригинальную версию ФС и текущую, в которой все изменения с момента создания снимка
Снимки разработаны для слежки за изменениями, при записи новой информации блоки распределяются для ее хранения, если же файл был удален то упоминание о нем из снимка исчезает
Снимки могут быть смонтированы RO для восстановления старой версии файла, так же можно откатиться к предыдущему снимку, все изменения будут утрачены
проверка цельности и автопочинка
Для всей информации в ZFS существует чек-сумма (дерево Меркла), создается при записи/изменении. При чтении она подтверждается, в случае не совпадения ZFS понимает ошибку и пытается ее исправить
RAID-Z
Работает с RAID без вспомогательного софта
Имеет собственную реализацию RAID - «RAID-Z», по сути это вариация RAID-5 с попыткой превзойти
Требовательна к ОЗУ, хранит много кешей в памяти, поэтому требуется обычно много, пропорционально нагрузке конечно же
В случае дефицита памяти очень сильно падает производительность
Есть еще ф-я «дедупликации» тоже из этой серии, влияет на объем используемой памяти, вроде выключена по умолчанию
Огромное потребление памяти не прибито гвоздями — его легко можно регулировать переменной vfs.zfs.arc_max. Можете поделиться источниками, откуда взялось утверждение про тормознутость? У нас весь прод, включая реляционную БД, и все личные домашние компы на ZFS. Проблем с тормознутостью не было. Все просто — если это файловое хранилище (для чего ZFS, собственно, и задумывалось) — не трогаем arc_max, если просто поиграться дома — ставим лимит и пользуем все плюшки (шифрование, сжатие, снепшоты и т.п.) в удовольствие, без перерасхода памяти.
Так у каждого инструмента есть свои задачи и требование как следствие ниша. Я не совсем понимаю какой и в чем ваш High load. Но, обратите внимание на особенности, упомянутые в статье, и вы поймете что эта ФС для NAS/SAN и тому подобному использованию. Это ФС для данных где не нужна «спешка», зато в этом классе у нее почти нет конкурентов.
Поэтому она не «тормознутая», а это вы ее не там использовали и сделали таки еже выводы.
Еще замечания
Напомню всем, что, создав единожды vdev в ZFS вы больше не можете с ним сделать ничего: ни добавить диск, ни удалить, ни поменять сдохший диск на диск большего размера: все эти операции требуют одновременного форматирования всех дисков сразу. Поэтому для мелких нужд ZFS очень плохо подходит — дома и в мелком офисе можно столкнутся с проблемой при апгрейде, потому что временно скинуть куда-либо все данные очень неудобно. И долго. Адепты ZFS на /r/DataHoarder любят замалчивать этот факт и навязывать ZFS тем, кто строит свою первую файлопомойку для дома. А потом у людей проблемы: построить новый сервер оказывается дешевле, чем добавить места в старый.
Плюсы ZFS в том, что он знает что и где лежит, группирует это и дает некоторые другие фишки, в частности безопасное хранение данных - эта ФС сделана с упором на целостность
Для достижения хотя бы близкой функциональности надо накрутить много слоев софта (LVM, mdadm, dm-integrity и еще). Что ес-но снижает надежность
ZFS это «copy-on-write» ФС, она никогда не перезаписывает данные. Мы всегда оперируем новым блоком, для обеспечения консистентности данных не нужен журнал, как в большинстве других системах
Сам по себе «copy-on-write» не гарантирует консистентность данных, но в основе работы ZFS лежит «дерево Меркла» (Хеш дерево). Благодаря тому что ZFS всегда использует атомарные транзакции и достигается постоянная консистентность.
Как и любой «copy-on-write» системе, нужно иметь на дисках запас свободного места, чтобы было куда записывать данные, которые всегда пишутся в новое место. К этому добавляется проблема порядка записи, дабы избегать фрагментации
Целостность и консистентность - ZFS сделан для максимальной надежности. По умолчанию на все данные подсчитываются контрольные суммы, а для метаданных записываются минимум по две копии в разных местах диска
Сжатие на лету - при наличии свободного процессорного времени можно использовать его для сжатия, тем самым уменьшив объем для записи, что повысит производительность в многопоточном режиме (?) (как то так..)
Атомарность - благодаря надежности ФС можно отказаться от WAL журналов приложений, но получается что приложение должно уметь работать с этими транзакциями ФС, просто выключить журнал видимо не получится :))
Так же, приложение может использовать эти журналы еще для чего нибудь, но в целом есть пространство для маневра
В целом, работа через дерево Меркла не бесплатна конечно, постоянные подсчеты хеш сумм отнимают процессорное время, но с другой стороны здесь экономия на собственном журнале, ну и упор на надежность все таки
Бесплатные снапшоты - создание снапшота в ZFS по времени константно и не накладывает доп расходов на работу с этим и данными. Их удобно передавать в т.ч. инкрементально, целостность будет проверена и подтверждена на принимающей стороне
Снапшот по сути тег, т.е. ссылка на некую версию, всех данных всех блоков, из которых она состоит, начинаю от корневого блока.
Получение инкрементального среза измененных данных равнозначно получению блоков из транзакции, на которую и указывает снапшот, т.е. не нужна проверка какие блоки изменились, у нас уже есть ссылка только на модифицированные
Есть набор дисков, над ними появляется абстракция в виде виртуального устр-ва (device). В терминологии ZFS это т.н. Vdev (virtual device)
Есть разные реализации Vdev: mirror, raid-z, так же скоро dRaid
т.е. как конкретно мы будем хранить данные - с упором на производительность или на объем, это ответственность Vdev
Из набора виртуальных устр-в составляется общий пул
В классическом понимании mdadm, чтобы собрать Raid10 (набор мирроров), нужно сделать несколько Vdev Mirror и объединить их в один пул
Каждый Vdev это по сути stripe, т.е. отдельная виртуальная единица хранения
В рамках пула, каждый уникальный блок данных будет хранится только на одном Vdev
Делятся на 3 подсистемы
ARC (Adaptive Replacement Cache) - разработан чтобы решить проблему с чтением.
Примечателен тем что делает упор не только на последние объекты (LRU-cache) но и на часто используемые объекты (MFU-cache)
У классического page cache Linux есть проблема «вымывания»: если прочесть файл, размер которого превышает объем оперативной памяти, то старые данные из кеша вымоются, т.к. файл по умолчанию будет загружен в page cache
ARC - это умная замена page cache
Когда создавался ZFS, часто использовали жесткие диски, а у них маленькие IOPS. Чтение copy-on-write данных - по умолчанию случайная операция, чтобы ее ускорить, используют разные ухищрения, например аккумулируют данные, записывают большим блоком и так далее, но это не всегда срабатывает, на этот случай нужно умное кеширование
Нормально если при штатной работе 99% запросов чтения попадает в кэш, если меньше то что то не так, стоит добавить оперативной памяти
Если ARC не всегда помещается в память, есть варианты вынести кэш на более быстрый отдельный SSD - это называется L2ARC (Layer 2 ARC)
Есть своего рода журнал, для того чтобы «набить» каждую транзакцию максимальным кол-вом данных
Этот журнал обычно очень маленький, его записью и занимается ZIL
Запись транзакциями это набор дорогостоящий операций, подсчет хэш-сумм, построение дерева, запись метаданных, которые пишутся для безопасности несколько раз в разные места дисков
Поэтому мы стараемся набить каждую транзакцию максимальным кол-вом данных
Тут и появляется определенного вида журнал, без которого не обойтись, если нужна быстрая синхронная запись и критична задержка
Здесь он вынесен как сущность, что позволяет использовать разные решения для персистентного хранения кусочка синхронной записи
ARC и ZIL хотя и необязательные с технической стороны компоненты, но они нужны для обеспечения высокой производительности хранилища, без них система будет работать медленнее
ZFS в продакшене чаще применяют для крупных инсталляций хранилища данных. Архитектура подразумевает эффективную утилизацию большого кол-ва HDD, SSD, RAM, CPU