Глава 2. Виртуальные устройства

В данной главе мы будем вникать в то, как сделана колбаса. Это свинина - Я имею в виду диск. Диски являются физическим воплощением хранения. Диски - зло. Они лгут о своих характеристиках и своем построении, они прячут ошибки и они отказывают самым неожиданным образом. ZFS предназначена для того, чтобы у вас не было страха что ваши диски находятся в тайном заговоре против вас. Да, ваши диски в заговоре против вас, однако ZFS разоблачает их предательство и приводит к его окончанию.

Для наиболее эффективного применения с ZFS имеющихся у вас дисков вам потребуются основы понимания того, как операционная система представляет диски ZFS и как ZFS упорядочивает данные на этих дисках.

 Диски и другие носители информации

ZFS может работать с носителями информации, отличными от дисков. Все что является поставщиком для хранилища GEOM FreeBSD может стать носителем хранения ZFS. {Прим. пер.: GEOM - модульная структурная система преобразования запросов ввода- вывода, позволяющая создавать стеки из разных уровней обработки (посредством создания цепочки "потребителей" и "поставщиков". Веден во FreeBSD 5).} ZFS даже имеет поддержку для применения файлов в качестве основы хранения, что действительно великолепно для целей тестирования, однако не предназначено для промышленного применения. ZFS может применять любое блочное устройство для своего физического хранения, однако каждый тип имеет свои преимущества и недостатки.

  Хранилище на "сырых" дисках

Применение всего физического диска целиком сокращает сложность. К тому же отсутствуют разделы о которых стоит беспокоиться, а также отсутствуют какие бы то ни было программное обеспечение и настройки между ZFS и физическим диском. Однако недостатки обычно перевешивают преимущества.

Загрузка с диска требует чтобы диск имел начальный загрузчик. Начальный загрузчик может располагаться только на дисках с разделами. У вас нет возможности загружаться с неподготовленного {"сырого"} диска. FreeBSD поддерживает полезные метки работающих дисков, однако эти метки живут внутри информации разделов.

Хуже того, любые диски для замены должны быть точно того же размера, что и оригинальный диск или иметь больший размер. Не все диски 6ТБ имеют одинаковый размер - диски различных производителей различаются на несколько мегабайт. Вы не заботитесь об этих различиях при установке системы, однако они критичны при замене диска. Большинство каталогов не приводят данных о количестве секторов на каждом диске, только его размер, так что поиск подходящей замены может занять несколько попыток. Замена диска, который использует традиционные сектора 512 байт диском, который использует 4096 байт (4К, также известный как Advanced Format {AF, Прим. пер.: на самом деле все выпускаемые в настоящее время диски физически имеют сектора размера 4К, однако некоторые из них эмулируют сектора в 512 байт (512e), остальные имеют формат 4Kn. Хорошее объяснение AF и возникающих проблем дает специалист IBM Илья Крутов в своем Обзоре технологии Расширенного формата жестких дисков}). Весьма вероятно, что первоначальный диск имел число секторов не кратное 8. Благодаря специальной математике применяемой дисковыми драйверами новый диск может оказаться на пару байт меньше старого диска, даже если он на пару байт больше.

  Хранилище на разделах

Вместо применения всего неподготовленного диска вы можете создать разделы диска и затем использовать один из разделов для ZFS. Самым большим преимуществом этого будет то, что вы теперь можете грузиться с диска, который содержит раздел ZFS, создав небольшой загрузочный раздел вместо требования отдельного загрузочного устройства. Применение разделов также позволяет вам использовать часть дискового пространства для других целей, таких как неподготовленный раздел подкачки, другая файловая система или просто оставление некого пространства для маневра в конце диска с тем, чтобы диск на замену не должен иметь соответствующее число секторов. Разбиение на разделы также позволяет вам "укоротить перемещения" дисковых головок для увеличения производительности.

Многие исходные руководства по администрированию Solaris ZFS рекомендовали применять разделы (или в терминах Solaris slices - срезы) по причинам производительности. В Solaris применение раздела для файловой системы запрещает кэширование записи. Во FreeBSD запрет кэширования записи полностью отделен от рабиения диска на разделы или файловые системы. FreeBSD дает полную производительность при применении ZFS разделов.

FreeBSD поддерживает ряд схем разбиения на разделы, однако настоятельно рекоменуетсЯ GPT. Более старая система разбиения на разделы, MBR, ограничивает число первичных разделов четырьмя, в то время как GPT поддерживает до 128 разделов. MBR может управлять дисками только до размера в 2ТБ, в то время как GPT может управлять до 8 ЗеттаБайт при дисках с 512- байтовыми секторами и до 64 ЗеттаБайт при 4K - секторных дисках. Книга FreeBSD Mastery: Storage Essentials описывает поддержку FreeBSD для обоих методов разбиения дисков. (Если вы храните ваши данные на глиняных табличках , вы можете применять разделы bsdlabel(8))

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

  Хранилище на GEOM устройствах

ZFS также может использовать различные классы в качестве основы системы хранения. Они расположены между файловой системой и физическими устройствами и выполняют различные функции. Классы GEOM предоставляют функциональные возможности такие, как шифрование всего диска (GELI, GBDE), высокая доступность, метки множественные пути и подключаемые расписания. Класс GEOM может быть создан на основе всего диска или поверх другого класса GEOM, такого как раздел, устройство с множеством путей или закодированный диск.

GELI (система шифрования FreeBSD) является лучшим способом достижения зашифрованного пула ZFS. GELI кодирует и декодирует по мере их пропуска назад и вперед между ZFS и физическими дисками, тем самым не требуется от ZFS выполнять что- то отличное от обычной работы. GELI поддерживает ряд различных алгоритмов шифрования, однако используемый по умолчанию AES-XTS предлагает наилучшую производительность, в особенности с применением современных центральных процессоров, которые поддерживают новые инструкции AES (AES-NI). С помощью этой особенности разгрузки аппаратуры, GELI может кодировать данные примерно со скоростью 1ГБ/с, а декодировать даже еще быстрее, что означает, что добавление шифрования не уменьшает вашу производительность даже при использовании SSD. GELI может также дополнительно выполнять аутентификацию данных (проверка цеслостности), при сохранении с каждым сектором хэшированного кода аутентификации сообщений (HMAC, Hashed Message Authentication Code). Она применяет такой HMAC для проверки целостности (данные не были подделаны) и аутентификации (эти данные подписаны вами) данных. Если при чтении исходного сектора HMAC не подтверждает данные, возвращается ошибка. По умолчанию функциональная особенность HMAC не включена и вероятно является излишней для ZFS, поскольку ZFS поддерживает собственные контрольные суммы для каждого блока данных.

Технология хранения высокой доступности (HAST, High Availability Storage Technology) является решением FreeBSD распределенного хранилища. Она делает возможным зеркалировать блочные устройства между компьютерами поверх сетевой среды. Применение HAST в качестве основы хранения для пула ZFS позволяет вам делать зеркало любого основного диска на другой машине. Преимуществом HAST является то, он а выполняется в масштабе реального времени; блок не рассматривается записанным пока он не записан на все хосты в кластере HAST. Репликации ZFS, с другой стороны, на периодической синхронизации снимков. Однако при использовании HAST вторая машина не может иметь импортированный или смонтированный пул в то же время, что и первая машина. По сравнению с репликациями ZFS, при которых вы можете иметь активный реплицированный пул (однако только в режиме чтения) все время, HAST имеет смысл только в некоторых случаях.

Метки GEOM предоставляют удобный способ прилагать значимые сведения к каждому диску или разделу. Существует много типов меток, включающих стандартные, такие как идентификатор диска, gptid (идентификатор раздела), метки GPT и особенные для GEOM метки (glabel). Лучший метод для пометки дисков описан в Главе 0.

GEOM также поддерживает множество путей для высокой доступности. Иногда умирают не только диски, но также и платы контроллеров, объединительные платы или кабели. С применением множества путей промышленные диски, которые являются "двухпортовыми" могут быть подключены к более чем одному HBA (контроллеру дисков без каких бы то ни было функций RAID). Если каждый диск имеет пути к двум различным контроллерам хранения, он может пережить утрату одного из контроллеров. Однако, когда каждый диск подключен к двум различным контроллерам, операционная система видит каждый диск дважды, по разу через каждый контроллер. Класс множества путей GEOM (multipath) позволяет вам записать метку на каждый диск, так что может быть обнаружен последующий путь к тому же самому диску. Таким образом вы получает одно представление каждого диска, снабженного множеством путей к этому диску через различные контроллеры. Мы обсудим множество путей в книге FreeBSD Mastery: Advanced ZFS.

Модуль расписаний GEOM делает возможным администратору описывать различные алгоритмы ввода/ вывода при попытке достичь лучшей производительности. На момент написания, текущими доступными расписаниями являются "as", простейшая форма упреждающих расписаний (anticipatory scheduling) с только одной очередью и "rr", упреждающее расписание с карусельным (round-robin) обслуживанием каждого клиента в очереди. Для получения дополнительных подробностей ознакомьтесь с gsched(8). Система GEOM делает относительно простым написание дополнительных модулей расписания для специфичных нагрузок.

  Хранилище на основе файлов

Вы можете использовать виртуальный диск на основе файла в качестве устройства хранения ZFS. Хотя мы несомненно не рекомендуем это для промышленного применения, диски на основе фала могут быть полезны для тестирования и экспериментов.

  Поставщики против дисков

"Поставщик" является техническим термином в FreeBSD. Поставщик хранения GEOM является вещью, который предлагает хранилище данных. Это может быть диск. Это может быть класс GEOM, который преобразует хранилище каким-то образом. Технически говоря, данная книга должна использовать слово поставщик (provider) вместо слова диск почти везде. Вы можете использовать любого поставщика GEOM как основу для ZFS. Проблема с этим состоит в том, что один физический диск может предлагать нескольких различных поставщиков. Ваш пул может иметь несколько различных поставщиков, однако если они все находятся на одном диске, вы должны просто пристрелить свою избыточность в вашей голове. (Гибкая система хранения FreeBSD дает вам возможность делать глупые вещи. Бросьте!)

Там, где эта книга обсуждает "диски", мы имеем в виду "некоторый вид поставщика поверх диска". Этот диск не должен быть целиком выделен ZFS - вы можете иметь раздел подкачки и раздел ZFS на одном диске и прекрасно себя чувствовать. Однако вы не можете иметь два раздела ZFS на одном физическом диске, зеркалировать их и иметь физическое резервирование.

 VDEV: виртуальные устройства

Виртуальное устройство, или VDEV, является логической единицей хранения ZFS. Каждый VDEV состоит из одного или более поставщиков GEOM. ZFS поддерживает несколько различных типов VDEV, которые дифференцированы по типу резервирования, который предлагает VDEV. Общий зеркалированный диск, в котором каждый диск содержит копию другого диска это один тип VDEV. Простые диски, без избыточности являются другим типом VDEV. А ZFS, включающий в себя три различных вида сложных RAID называется RAID-Z.

Такие VDEV организованы в пулы хранения, обсуждаемые в Главе 3. Фактические данные выходят на первое место, что охватывает Глава 4. Однако организация ваших виртуальных устройств предписывает то, насколько пул производителен и как хорошо он противостоит физическим повреждениям. Практически вся избыточность ZFS проистекает от виртуальных устройств.

Пул хранения состоит из одного или более VDEV, причем данные пула распределяются по этим VDEV без избыточности. (Вы можете добавить некоторую избыточность при помощи свойства copies, как описано в Главе 4, однако это не обеспечивает защиты от общего отказа диска.) ZFS рассматривает VDEV как отдельную единицу, которая предоставляет пространство хранения. Пул хранения не может выдержать потери VDEV, следовательно важно чтобы вы применяли VDEV c избыточностью или приняли заранее решение, что будет нормальной потеря данных в этом пуле.

Применение множества VDEV в пуле создает системы, аналогичные современным RAID массивам. Массив RAID-Z2 аналогичен RAID-6, однако пул ZFS с двумя RAID-Z2 VDEV аналогичен RAID-60. Зеркальные VDEV выглядят как RAID-1, однако их группа аналогична RAID-10. В обоих данных случаях ZFS разделяет данные по каждому VDEV без избыточности. Избыточность предоставляют независимые VDEV.

 Избыточность VDEV

VDEV? который содержит более одного диска может применять ряд различных схем резервирования для обеспечения устойчивости к сбоям. Отдельный диск сидящий на всем ничего не может сделать в отношении своей избыточности. ZFS поддерживает использование зеркальных дисков и различные массивы на основе контроля четности.

Для самовосстановления ZFS применяет избыточность. VDEV без избыточности не может поддерживать самовосстановление. Вы можете обойти это на уровне набора данных (применив свойство copies), тем не менее, избыточные VDEV поддерживают самовосстановление автоматически.

Область чередования (1 поставщик)

VDEV состоящий из отдельного диска называется чередующейся областью (полосой, stripe), и оно не имеет резервирования. Как вы можете ожидать, утрата единого поставщика означает что все данные на диске пропадут. Пул чередования содержит только отдельные диски.

Пул ZFS чередует данные между всеми VDEV в пуле и полагается на то что VDEV обеспечивает резервирование. Если отказывает одно устройство чередования, отказывает весь пул. Пропадают все хранимые в пуле данные. Это хорошо для рабочих разделов, однако если вы заботитесь о своих данных, воспользуйтесь VDEV, который предлагает отказоустойчивость.

Зеркала (2+ поставщики)

Зеркалированные VDEV хранят полную копию всех данных для каждого диска. Вы можете потерять все, но только на одном диске поставщика и все еще будете иметь свои данные доступными. В зеркале вы можете применять любое число дисков.

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

RAID-Z1 (3+ поставщики)

ZFS содержит три современных VDEV с резервированием в стиле RAID, называемые RAID-Z. RAID-Z1 напоминает RAID-5, но включает в себя вычисление контрольной суммы для обеспечения целостности файлов. Имея одновременные функциональности контрольных сумм и копирования-при-записи ZFS (Глава 7.), RAID-Z гарантирует, что незавершенная запись не приведет к несогласованности файловой системы.

RAID-Z разделяет данные и информацию контрольных сумм по всем дискам. Если поставщик в RAID-Z погибает или начинает выдавать испорченные данные, RAID-Z использует информацию контрольных сумм для повторного вычисления утраченных данных. Вы могли бы услышать, что RAID-Z использует поставщика для хранения информации контрольных сумм, однако не существует отдельного поставщика контрольных сумм - роль контрольных сумм переходит от поставщика к поставщику, распределяя данные.

VDEV RAID-Z1 может выдержать отказ каждого отдельного поставщика. Если второй поставщик отказывает до того как заменен отказавший диск, все данные будут утрачены. Восстановление дискового массива из данных контрольных сумм может занимать длительное время. Если вы используете большие диски, скажем, 2ТБ - существует большая вероятность того, что второй диск откажет в процессе вашего восстановления первого диска. Для больших дисков вам вероятно следует рассмотреть RAID-Z2.

RAID-Z2 (4+ поставщик)

RAID-Z2 имеет сходство с RAID-Z1, но имеет две контрольные суммы на каждое VDEV. Как и RAID-6, RAID-Z2 позволяет продолжать работу даже с двумя отказавшими поставщиками. Он слегка медленнее RAID-Z1, но позволяет вам быть несколько более ленивыми при замене ваших дисков.

RAID-Z3 (5+ поставщик)

Наиболее параноидальная форма RAID-Z, RAID-Z3 применяет три диска с контрольными суммами на VDEV. Да, вы можете иметь три отказавших диска в вашем дисковом массиве из пяти дисков. Это еще слегка медленнее, чем RAID-Z2. Отказ четвертого диска имеет результатом полную потерю данных.

Дисковые конфигурации RAID-Z

Одна важная вещь, которую следует помнить при использовании любой версии RAID-Z заключается в том, что число поставщиков в RAID-Z полностью фиксировано. Вы не можете добавлять диски в RAID-Z VDEV для его расширения. Вы можете расширить пул добавлением VDEV, но вы не можете расширить VDEV добавлением дисков. Не существует планов добавления такой функциональности.

Предположим, у вас есть хост, который может принимать 20 жестких дисков. Вы устанавливаете 12 дисков и используете их как отдельный RAID-Z2, полагая что вы добавите еще дисков в свой пул позже по мере возникновения потребности в этом. Такие добавленные новые диски должны будут пойти в отдельное RAID-Z2 VDEV.

Более того, ваши VDEV будут несбалансированными. Ваш пул будет иметь одно VDEV с 12ю дисками и второе VDEV с 8ю дисками. Одно будет медленнее другого. ZFS позволит вам принудить эти устройства к объединению в один пул, однако в действительности это плохая идея.

Планируйте заранее. Посмотрите на ваше физическое оборудование, число дисков, которое вы имеете для начала и то, как вы будете расширять это хранилище. Наш пример сервера будет отличным с пулом, содержащим одно VDEV RAID-Z и полностью отдельный пул, содержащий другие восемь дисков с любой удобной вам организацией. Не наступайте на свое горло еще до того как вы начали!

Правило RAID-Z кратного 2

Одна из наиболее часто обсуждаемых конфигураций состоит в наличии числа дисков данных равного кратному двум плюс число дисков для хранения контрольных сумм, необходимое для данного уровня RAID-Z. То есть, это правило говорит, что RAID-Z1 должен использовать 2n+1 дисков, или три, пять, семь, девять и так далее. RAID-Z2 должен применять 2n+2 дисков (четыре, шесть, восемь и так далее), а RAID-Z3 должен иметь 2n+3 (пять, семь, девять и далее).

Это правило оаботает - если и только если ваши данные состоят из малых блоков с размером, который является степенью двойки. Другие множители, однако, создают гораздо бОльшую разницу. Сжатие обычно рассматривается как более эффективное. Сжате ваших данных уменьшает в размере блоки, устраняя эту выгоду.

Восстановление VDEV

При отказе поставщика, относящегося в VDEV с резервированием, VDEV, к которому он относился, становится "деградировавшим". Деградировавшее VDEV все еще содержит все свои данные, но его производительность может понизиться. Глава 5 охватывает замену отказавших поставщиков.

После того как поставщик заменен, система должна сохранить данные на новом поставщике. Зеркало делает это просто: читает данные с оставшегося диска (дисков) и записывает их для обновления. Для RAID-Z должны вычисляться из контрольных сумм.

Таким образом сочетание в ZFS RAID и файловой системы означает что ZFS знает какие блоки содержат данные, а какие свободны. Вместо обязанности записывать все байты на новый диск, ZFS нужно записывать только те блоки, которые используются на самом деле. Обычные RAID контроллеры не имеют понимания или представления об уровне файловой системы, следовательно они не представляют какое пространство используется, а какое свободно. Когда RAID контроллер заменяет диск, он должен скопировать все байты на новый диск. Это означает, что поврежденный RAID-Z ZFS вернется к жизни гораздо быстрее, понижая вероятность одновременного отказа, который мог бы вызвать потерю данных. Мы обсудим восстановление ZFS в Главе 5.

 RAID-Z против обычного RAID

RAID-Z имеет ряд преимуществ по сравнению с традиционным RAID, однако основное проистекает из того факта, что ZFS является администратором томов и файловой системой дополнительно к уровню резервирования дисков.

В недавнем прошлом файловые системы могли работать только на одном диске. Если у вас было два диска, вам нужны были две отдельные файловые системы. Традиционный RAID позволял объединять несколько дисков в один виртуальный диск, делая возможным создание массива дисков выше 100МБ, или даже еще больше! Затем операционные системы поместили свои собственные файловые системы поверх этого без какого бы то ни было понимания как будут разложены блоки на физические диски. В то же время RAID может обеспечить отказоустойчивость. Учитывая существовавшие в то время аппаратные и программные ограничения, RAID казался хорошей ставкой.

Объединяя файловую системы и управление томами, ZFS может увидеть точно где расположены все данные и то, как взаимодействуют уровни хранения и данных. Это позволяет ZFS принимать ряд важных решений, таких как обеспечение того, что дополнительные копии важных данных, таких как блоки вторых экземпляров (ditto blocks, Глава 3), сохраняются на отдельных дисках. Не очень хорошая идея иметь две или три копии ваших важных данных целиком на одном создающем основу поставщике хранения, который может быть уничтожен одним аппаратным отказом. ZFS заходит настолько далеко, что помещает дублирующие блоки на соседние диски, поскольку статистически менее вероятно, что если два диска откажут одновременно, то они будут соседями {Прим. пер.: спорное утверждение!}.

Обычные RAID могут от недостатка, называемого "дырой записи" ("write hole"), при котором операции в два шага обрываются на полпути {нарушение атомарности}. RAID 5 и 6 разбивают данные на куски, которые будут записаны на все диски данных. Когда операция завершается, вычисляется блок контрольной суммы и сохраняется на диск контрольных сумм. Если файловая система отказывает или отключается питание после того, как записаны данные, но до записи контрольной суммы, диск завершается в неопределенном состоянии. Когда система возвращается, данные не соответствуют контрольной сумме. Такая же вещь может случиться с зеркалированными дисками если один завершил обновление, а другой нет.

Проблемы дыры в записи не заметны пока вы не замените отказавший диск. Неправильная контрольная сумма или не верное зеркало приведут в результате к тому, что устройство RAID вернет в файловую систему мусорные данные. Обычная файловая система возвращает эти мусорные данные как содержимое файла.

ZFS решает эту проблему копированием-при-записи и контрольными суммами. Копирование-при-записи (Глава 7) означает, что данные никогда не переписываются нв их местонахождении. Каждое обновление является транзакцией, и либо выполняется полностью, либо не выполняется совсем, возвращая систему в состояние до ее обновления. ZFS также имеет контрольные суммы, следовательно она может обнаруживать когда диск возвращает неверные данные. Когда ZFS определяет неверные данные, она замещает эти данные правильными данными из другого источника, такого как дополнительная копия данных, зеркалированные диски или контрольная сумма RAID-Z. Совместно это создает свойство самовосстановления ZFS.

 Специальные VDEV

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

Выделенный журнал намерений (SLOG, ZIL)

ZFS поддерживает журнал намерений ZFS (ZIL, ZFS Intent Log) в качестве части пула. Аналогично журналам в некоторых других файловых системах, это то место, куда записываются операции, находящиеся в процессе выполнения, следовательно, они могут быть завершены или отыграны назад в случае отказа системы или отказа питания. ZIL является субъектом для условий нормальной работы диском. Пул может иметь внезапные всплески при использовании или латентность, связанную с задержкой, которые приводят к меньшей производительности.

Одним из способов поддержки производительности заключается в выделении ZIL из нормальных операций пула. Вы можете использовать выделенное устройство в качестве отдельного преднамеренного протоколирования (SLOG, Separate Intent Log) вместо применения обычной части пула. Выделенное устройство обычно небольшое, но очень быстрое, такое как SSD с большим числом перезаписей {Прим. пер.: eMLC SSD, также, если позволяют соедства, лучше использовать устройство с интерфейсом PCIe (см. Справочные данные о характерных временах латентности).}

Вместо копирования данных из SLOG в пул основного хранения при получении запроса, ZFS может собирать данные в разумные группы и записывать их более эффективно.

Некоторые виды программного обеспечения настаивают на получении подтверждения того, что записанные ими на диск данные действительно находятся на диске до его отправления. Базы данных часто это делают чтобы избежать порчи записываемых ими на диск данных в случае краха системы или отключения питания. Некоторые операции NFS делают то же самое. Путем записи таких запросов в более быстрое устройство ведения журнала и сообщения "все сделано", ZFS ускоряет эти операции. База данных завершает транзакцию и движется дальше. Вы получаете производительность почти на уровне SSD при использовании недорогих дисков в качестве носителей информации.

Вы можете зеркалировать ваш ZIL для предотвращения потери данных.

Кэш (L2ARC)

Когда файл считывается с диска, система сохраняет его в памяти пока память не понадобится для других целей. Это старая технология, использовавшаяся даже еще в первые дни BSD. Посмотрите top(1) в BSD системе на основе UFS и вы увидите кусочек памяти, помеченный как Buf. Это буфер кэша.

Традиционные буферы кэша, однако, разрабатывались десятилетия назад. ZFS имеет адаптивный кэш замещения, или ARC (Adaptive Replacement Cache), разработанный для современного оборудования, которое предоставляет бОльшие скорости. ARC остается самой последней и наиболее часто применяемой для доступа к файлам.

Очень немногие современные системы, однако, имеют достаточно оперативной памяти для кэширования в тех объемах, в которых он хотят это делать. Точно так же как ARC может применять SLOG для ускорения записи, он может использовать очень быстрые диски для ускорения чтений. Это называется ARC 2 уровня, или L2ARC.

Когда объект используется достаточно часто, для того, чтобы извлечь выгоду из кэширования, однако недостаточно часто для хранения в оперативной памяти, ZFS может хранить его в устройстве кэширования. L2ARC обычно является устройством с очень быстрым и предусматривающим многократное перезаписывание SSD или NVM.

 Как VDEV воздействуют на производительность

Все различные типы VDEV имеют различную производительность. Эталонное тестирование и разбиение производительности диска является сложной темой, заслуживающей очень большого учебника, если кто-то потрудится прочитать его. Любой конкретный совет, который мы бы должны были дать здесь, очень быстро устарел бы, так что давайте просто рассмотрим некоторые общие вопросы.

Одним из наиболее распространенных измерений является число операций ввода/ вывода в секунду, или IOPS (Input/Output Per Second), число отдельных операций, которые диск может выполнять каждую секунду. IOPS шпиндельных дисков обычно физически ограничены тем, насколько часто головеи чтения / записи могут перемещаться с места на место над поверхностью. Твердотельные диски имеют столь исключительную производительность благодаря тому, что им нет нужды физически перемещать что бы то ни было.

Число шпинделей без контрольных сумм также сдерживает потоковые чтение и запись в пуле без повреждений. "потоковая" производительность сводится к количеству мегабайт в секунду (МБ/с), которые данный диск может читать или записывать. Когда какой-то диск читает или записывает данные последовательно, его головки не должны осуществлять поиск вперед или назад для различных местоположений. Именно в этих условиях диск достигает своей наилучшей возможной потоковой производительности, выдавая максимальную пропускную способность. Количество шпинделей влияет как на случайную, так и на последовательную производительности. Массив из 12 одно-терабайтных (12x 1ТБ) дисков обычно превосходит по производительности массив из шести двух-терабайтных (6x 2ТБ) дисков, поскольку большее число шпинделей и головок повышает и IOPS и потоковую производительности. Наличие большего числа головок означает, что ZFS сможет читать с- и записывать в- большее число различных местоположений на диске за один раз, в результате приводя к бОльшей производительности IOPS. Большее число шпинделей означает, что большее число дисков работает со своей максимальной пропускной способностью для чтения и записи ваших данных. Однако, большее число дисков требует больших стеллажей или шасси, большего электропотребления и большего числа контроллеров.

Другие обычные измерения включают пропускную способность на чтение, на запись, эффективность использования пространства и потоковую производительность.

Говоря в общем, зеркала могут предоставлять лучшие IOPS и пропускную способность при чтении, однако RAID-Z могут обеспечивать лучшую производительность при записи и гораздо более эффективное использование пространства.

Пул с несколькими VDEV разделяет свои данные по всем VDEV. Это увеличивает производительность, но может стоить пространства, поскольку каждое индивидуальное VDEV имеет свои собственные диски резервирования. Пул с несколькими VDEV, скорее всего, увеличивает надежность и отказоустойчивость. В то время как резервирование ZFS все выполняется на уровне VDEV, пул с несколькими избыточными VDEV скорее всего сможет выдержать большее число отказов. Чем больше VDEV вы имеете в пуле, тем лучше его производительность.

Давайте пройдемся по некоторым общим конфигурациям VDEV и рассмотрим как различные возможные параметры воздействуют на производительность и емкость. Предположим, что мы применяем скромные общедоступные шпиндельные диски 1ТБ. Каждый диск способен выполнять 250 IOPS и потоковые чтение/ запись составляют 100 МБ/с.

Один диск

Когда есть только один диск, существует только одна возможная конфигурация, одиночного VDEV чередования ZFS. Это самая основная конфигурация, причем не обеспечивающя никакой отказоустойчивости. Если этот единственный диск погибнет, все данные будут утрачены.

Таблица 1: Конфигурация одно- дискового виртуального устройства
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

1

Stripe

250

250

100

100

1ТБ (100%)

нет

Характеристики одно-дискового устройства чередования выглядят подозрительно похоже на характеристики лежащего в основе диска. Странно, да?

Два диска

Если ваша система имеет два диска, вы можете построить свой пул состоящим из двух VDEV чередования или единственного зеркалированного VDEV.

VDEV чередования удваивают доступное хранилище и пропускную способность, но одновременно удваивают риск отказа. ZFS раскладывает блоки каждого файла на два диска. Если хотя бы один диск откажет, все данные станут неиспользуемыми.

Использование отдельного зеркалированного VDEV сохраняет каждый блок данных на обоих дисках. Это обеспечивает лучшую производительность чтения, поскольку блоки могут считываться с обоих дисков одновременно. Но вы получите емкость наименьшего диска. Производительность на запись будет ограничена скоростью самого медленного диска. Один диск может отказать, однако пул все еще можно будет использовать.

Таблица 2: Конфигурации двух- дискового виртуального устройства
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

2

2x Stripe

500

500

200

200

2ТБ (100%)

нет

2

1x 2 дисковое зеркало

500

250

200

100

1ТБ (50%)

1

Как показывает таблица, наш пул зеркала дает половинную производительность записи от пула с чередующимися областями и имеет половинную емкость пространства.

Три диска

Три диска означают больше возможностей, включая более глубокое зеркалирование и RAID-Z. Вы можете таже использовать пул из трех чередующихся дисков, однако вероятность отказа является еще более высокой

Более глубокое зеркалирование имеет больше дисков, предоставляя большую отказоустойчивость и улучшает производительность чтения. Большее число шпинделей и головок означает, что VDEV может читать данные с наименее занятых из трех дисков, обслуживающее случайные чтения более быстро. Производительность записи в зеркало все еще ограничена самым медленным из дисков в зеркале.

RAIDZ-1 предлагает лучшуюю эффективность использования пространства, при том что отказоустойчивость требует только один из дисков в VDEV. Данные распределяются по всем дискам, следовательно они могут работать вместе при выполнении чтения и записи. Распространение данных по всем дискам улучшает производительность потоковой записи. В отличие от зеркала, в RAID-Z все диски могут записывать свои совместные данные одновременно, вместо того, чтобы каждый диск записывал идентичные данные.

Таблица 3: Конфигурации трех- дискового виртуального устройства
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

3

1x 3 диска зеркало

750

250

300

100

1ТБ (33%)

2

3

1x 3 диска RAID-Z1

250

250

200

200

2ТБ (66%)

1

Отметим, что IOPS не обязательно масштабируется до действительной производительности чтения / записи. Зеркальное VDEV в троекратно превосходит IOS RAID-Z1, поскольку головки каждого устройства могут работать независимо, в то время как в RAID-Z1 головки должны работать совместно. В мегабайтах в секунду зеркала имеют преимущество применения пропускной способности всех своих дисков, в то время как RAID-Z1 теряет значимость пропускной способности одного диска из-з необходимости в контрольных суммах. Трех- дисковое зеркало также пишет вдвое меньше МБ/с, поскольку оно записывает одни и те же данные на все диски, в то время как RAID-Z1 может записывать на все свои диски, однако частично теряя пропускную способность на записи контрольных сумм.

Четыре или пять дисков

С четырьмя или пятью дисками вы получаете еще больше вариантов.

Множество зеркалированных VDEV (аналогичных традиционному RAID10) предоставляют наилучшую из возможных производительность для произвольных нагрузок ввода / вывода подобных базам данных. Когда вы делите четыре диска на два зеркалированных VDEV по два диска в каждом, ZFS разделяет записи по обоим зеркалам. Одно зеркало хранит одну половину ваших данных, а второе оставшуюся половину. Это помогает расшить узкое место при записи для зеркал, в то же время продолжая обеспечивать впечатляющую производительность чтения.

При четырех дисках появляется вариант RAID-Z2. Две контрольные суммы RAID-Z2 означают, что VDEV могут продолжать работать при потери любых двух дисков. В сравнении с зеркалом с тем же числом дисков производительность хуже; однако уже нет проблем при одновременном отказе двух дисков.

С пятью дисками мы можем развернуть RAID-Z3. VDEV RAID-Z2 может выдерживать утрату трех дисков. RAID-Z3 разменивает производительность на отказоустойчивость {Прим. пер.: хотя, наверное, найдутся апологеты улучшения на треть надежности за счет 10% пространства при сохранении производительности.}

А RAID-Z1 продолжает оставаться вариантом, естественно.

Таблица 4: Конфигурации четырех- или пяти- дискового виртуального устройства
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

4

2x 2 диска зеркало

1000

500

400

200

2ТБ (50%)

2 (1/VDEV)

4

1x 4 диска RAID-Z1

250

250

300

300

3ТБ (75%)

1

4

1x 4 диска RAID-Z2

250

250

200

200

2ТБ (50%)

2

5

1x 5 дисков RAID-Z1

250

250

400

400

4ТБ (80%)

1

5

1x 5 дисков RAID-Z2

250

250

300

300

3ТБ (60%)

2

5

1x 5 дисков RAID-Z3

250

250

200

200

2ТБ (40%)

3

Обратите внимание на то, как сопоставляются потоковые (МБ/с) производительности чтения и записи RAID-Z1 с RAID-Z2 и как RAID-Z3 соотносится с ними обоими. Добавление диска контрольных сумм означает жертвоприношение пропускной способности этого диска.

Отказоустойчивость множества зеркальных VDEV слегка мудреная. Следует помнить, избыточность рассчитывается на основе VDEV, а не всего пула. Каждое зеркалированное VDEV все еще обеспечивает устойчивость к отказам n-1. Если по одному диску в каждом из зеркалированных VDEV продолжат свою работу, все данные останутся доступными. при наличии в вашем пуле двух зеркалированнх VDEV с двумя дисками в каждом, вы можете потерять по одному диску в каждом VDEV и продолжать работать. Однако, если вы потеряете оба диска в одном VDEV, пул умрет и вы потеряете все данные.

От шести до двенадцати дисков

При большом количестве дисков решение переносится к балансировке отказоустойчивости, эффективности использования пространства и производительности.

Шесть дисков могут стать тремя двухдисковыми зеркалированными VDEV, предоставляя вам достаточный объем хранения и хорошую производительность на запись. Вы можете выбрать пару трех-дисковых зеркалированных VDEV, предоставляющих вам меньшее пространство, однако допускающих отказ дух дисков в каждом из наборов по три без риска потери данных. Или они могут стать RAID-Z VDEV.

При наличии более шести дисков вы можете получить в одном пуле несколько VDEV RAID-Z. Дюжина дисков может работать совместно, как единое VDEV, предоставляя вам больше доступного пространства, или могут быть разделены на два VDEV, давая меньше полезного пространства, но при этом лучшую производительность и бОльшую отказоустойчивость.

Таблица 5: Конфигурации от шести- до двенадцати- дисковых виртуальных устройств
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

6

3x 2 диска зеркал

1500

750

600

300

3ТБ (50%)

3 (1/VDEV)

6

2x 3 диска зеркал

1500

500

600

200

2ТБ (33%)

4 (2/VDEV)

6

1x 6 дисковый RAID-Z1

250

250

500

500

5ТБ (83%)

1

6

1x 6 дисковый RAID-Z2

250

250

400

400

4ТБ (66%)

2

6

1x 6 дисков RAID-Z1

250

250

400

400

4ТБ (80%)

1

6

1x 6 дисков RAID-Z2

250

250

300

300

3ТБ (60%)

2

6

1x 6 дисков RAID-Z3

250

250

300

300

3ТБ (50%)

3

12

6x 2 диска зеркал

3000

1500

1200

600

6ТБ (50%)

6 (1/VDEV)

12

4x 3 диска зеркал

3000

1000

1200

400

4ТБ (33%)

8 (2/VDEV)

12

1x 12 дисков RAID-Z1

250

250

1100

1100

11ТБ (92%)

1

12

1x 12 дисков RAID-Z1

250

250

1100

1100

11ТБ (92%)

1

12

2x 6 дисков RAID-Z1

500

500

1000

1000

10ТБ (83%)

2 (1/VDEV)

12

3x 4 диска RAID-Z1

750

750

900

900

9ТБ (75%)

3 (1/VDEV)

12

1x 12 дисков RAID-Z2

250

250

1000

1000

10ТБ (83%)

2

12

2x 6 дисков RAID-Z2

500

500

800

800

8ТБ (66 %)

4 (2/VDEV)

12

1x 12 дисков RAID-Z3

250

250

900

900

9ТБ (75%)

3

12

2x 6 дисков RAID-Z3

500

500

600

600

6ТБ (50%)

6 (3/VDEV)

Применение множества RAID-Z устройств в пуле во многом аналогично применению множества зеркалированных устройств в нем. Устойчивость к отказам дисков измеряется в показателе на VDEV, не на пул. Ваш массив из 12 дисков, состоящий из двух шести-дисковых VDEV RAID-Z2 может обработать утрату четырех дисков, при этом предусматривая потерю вами двух дисков на VDEV.

Много дисков

Общий совет заключается в применении не более чем от 9 до 12 дисков на VDEV. Вы можете использовать и больше, однако ZFS не предназначен для этого. Давайте рассмотрим массив из 36 дисков, чтобы увидеть некоторые возможные механизмы и их влияние на производительность.

Таблица 6: Конфигурации c {36}- дисковыми виртуальными устройствами
ДискиРежим Чтение IOPSЗапись IOPS Чтение МБ/сЗапись МБ/с Используемое пространствоОтказо- устойчивость

36

18x 2 диска зеркал

9000

4500

3600

1800

18ТБ (50%)

18 (1/VDEV)

36

12x 3 диска зеркал

1200

3000

3600

1800

12ТБ (33%)

24 (2/VDEV)

36

1x 36 дисковый RAID-Z1

250

250

3400

3400

34ТБ (94%)

2

36

2x 18 дисков RAID-Z2

500

500

3200

3200

32ТБ (89%)

4 (2/VDEV)

36

4x 9 дисков RAID-Z2

1000

1000

2800

2800

28ТБ (78%)

8 (2/VDEV)

36

6x 6 дисков RAID-Z2

1500

1500

2400

2400

36ТБ (66%)

12 (2/VDEV)

При использовании большего числа VDEV вы можете создавать поразительно быстрые пулы. Пул из 18 двухдисковых зеркалированных VDEV способен читать данные может считывать данные быстрее чего бы то ни было еще {Прим. пер.: построенного на этих дисках} - и он может потерять до 18 дисков до отказа! Да, они должны быть реальными 18 дисками, но если у вас есть дисковые полки с различными блоками питания, это вполне возможно. {Прим. пер.: можем вам помочьразместить по 48x и/или 60x 3.5" дисков (до 8ГБ каждый, итого 480ТБ "сырых" данных) на шасси}. С другой стороны, выход из строя двух дисков в пуле может повлечь смерть всего пула.

Добавление контрольных сумм или зеркалирований в каждое VDEV увеличивает надежность. Большее число VDEV увеличивает производительность. Ваша задача заключается в манипулировании этими двумя параметрами для поддержки вашей среды.

Каждое VDEV ограничено производительностью произвольных чтений и записи самого медленного диска, так что если у вас очень много дисков в одном VDEV, вы уступаете росту производительности всего лишь ради небольшого прироста эффективности использования пространства. Хотя вы можете добавить устройства L2ARC и SLOG для улучшения производительности, лучше избежать этих совместных проблем.

Следовательно, если большее число VDEV всегда лучше, почему пул 6x 6 дисков RAID-Z2 настолько медленнее по чтению и записи в сравнении с пулом 1x 36 RAID-Z2 дисков? Ответ находится в столбце отказоустойчивости. При наличии у вас большего числа VDEV RAID-Z2, вы получаете бОльшую отказоустойчивость и вы можете выживать в случае бОльшего числа отказов. Когда ваш диск обеспечивает отказоустойчивость, он сохраняет дополнительные копии ваших данных, следовательно он может восстановить утраченную в случае отказа диска копию. Система повторно вычисляет и сохраняет контрольные суммы при каждом изменении данных. Контрольные суммы не используются при чтении файлов, пока не утрачены первоначальные копии. Диски, применяемые для хранения контрольных сумм больше не способствуют потоковой производительности. Вы можете восстановить производительность добавив еще дисков. Пул RAID-Z2 из 6x 8 дисков будет эквивалентен 36 дискам с данными и 12 дискам с контрольными суммами и будет в состоянии превзойти по производительности пул RAID-Z2 дисков 1x 36

Давайте примем во внимание то, что вы знаете о VDEV и создадим некоторые рабочие пулы с ними.