Введение в технологию. (Часть 4)
Исходным обещанием технологии RAID было обеспечение быстрого, надёжного хранилища с использованием недорогих дисков. Технология RAID 5, как и другие схемы организации данных и чётности, никогда в полной мере не выполняла обещания RAID, да и не могла из-за рокового просчёта, известного как "окно уязвимости" (write hole).
При любом обновлении данных в сегменте RAID нужно обязательно изменить чётность так, чтобы применение операции «исключающее ИЛИ» (XOR) к данным со всех дисков сегмента RAID 5 давало в результате ноль, это то самое уравнение, которое позволяет реконструировать данные в случае выхода из строя диска.
Проблема в том, что нет способа обновить содержимое двух или более дисков атомарно, одной неделимой операцией, то есть существует временное окно между выполнением двух операций записи, в течение которого система уязвима к сбоям, поэтому массив RAID может оказаться повреждённым в случае системной ошибки или отключения питания.
Все доступные на данный момент продукты RAID корпоративного уровня используют аппаратные реализации схем RAID, где они могут использовать энергонезависимую память (NVRAM) для защиты от сбоев и пропадания питания. Этот вариант работает, но стоит очень дорого.
Кроме этого, в существующих схемах RAID имеется серьёзная проблема с производительностью при записи неполного сегмента, то есть при обновлении меньшего количества данных, чем содержит один сегмент RAID, система должна прочитать с диска значение старых данных и чётности для того, чтобы вычислить новое значение чётности. А это заметно снижает производительность. Если при записи полного сегмента можно просто использовать асинхронную запись, запись неполного сегмента требует выполнения синхронных операций чтения прежде, чем может быть начата запись.
И снова предлагается дорогое аппаратное решение - массив RAID может буферизировать операции записи неполного сегмента в энергонезависимой памяти (NVRAM) на время ожидания завершения необходимых операций чтения, скрывая таким образом от пользователя добавляемую задержку. Естественно, это работает до тех пор, пока не происходит переполнение буфера. Для увеличение объема буфера энергонезависимой памяти придется заплатить дополнительно.
RAIDZ представляет собой схему организации данных и четности, подобную RAID 5, но использующую динамический размер сегмента. По сути, каждый логический блок файловой системы — это сегмент RAIDZ, независимо от размера. Это значит, что каждая запись RAIDZ — это запись полного сегмента. Добавьте к этому копирование при записи в транзакционной семантике ZFS, и вы полностью избавитесь от "окна уязвимости" RAID. Кроме этого, RAIDZ быстрее обычного RAID в такой ситуации, так как здесь не требуется читать данные, менять их, а потом снова записывать.
Ключевой момент — реконструкция RAIDZ. Так как сегменты RAIDZ имеют различный размер, простая формула "исключающее ИЛИ к данным со всех дисков равно нулю" становится неприменима. Для определения геометрии сегмента RAIDZ нужны метаданные файловой системы, для реконструкции всех сегментов придется просмотреть метаданные всей файловой системы. Не слишком ли это медленно, просматривать все метаданные? Если пул с данными близок к заполнению, то это относительно медленно, но если пул заполнен не более чем на 2/3 — реконструкция по метаданным будет быстрой. Фактически это компромисс.
Гораздо важнее то, что проход по метаданным позволяет ZFS сверить каждый блок с его 256-битной контрольной суммой. Традиционные RAID-системы не могут этого сделать, они лишь вслепую выполняют операцию "исключающего ИЛИ". Это подводит нас к главной отличительной особенности RAIDZ — самовосстановлению данных. Помимо обработки отказов диска целиком, RAIDZ может выявлять и исправлять неявные повреждения данных. При каждом чтении блока RAIDZ выполняется его проверка на соответствие контрольной сумме. Если проверка покажет, что диски с данными вернули неправильное содержимое блока, то ZFS прочитает диск с чётностью и выполнит комбинаторную реконструкцию данных для выявления диска, вернувшего неправильные данные, затем ZFS восстановит поврежденные данные и вернет правильные данные приложению. Помимо этого, ZFS сообщит об этом инциденте.
Заметим, что это было бы невозможно, если бы файловая система и RAID-массив были бы отдельными продуктами, именно поэтому на рынке систем хранения данных, сегодня, нет ничего подобного RAIDZ. Нужен комплексный взгляд на логическую и физическую структуру данных, чтобы справиться с этой задачей. Для RAIDZ не нужно никакого специального аппаратного обеспечения. Для обеспечения корректности не нужна энергонезависимая память (NVRAM), для хорошей производительности не нужна буферизация операций записи.
С помощью RAIDZ на обычном контроллере HBA (Host Bus Adapter) система ZFS выполняет исходное обещание RAID - обеспечить быстрое, надёжное хранилище данных с использованием недорогих дисков. Последние версии ZFS поддерживают RAIDZ2 — использующий две контрольные суммы, RAIDZ3 — использующий три контрольные суммы.
Есть возможность организации дополнительных опций (ZFS extra options) ускоряющих процессы записи и чтения используя высокоскоростные твердотельные диски (SSD).
ZFS Intent Log (ZIL): журнал протоколирования, его перенос на высокоскоростные устройства может повысить производительность системы при определенных рабочих нагрузках, например требующих синхронной записи, таких как NFS клиенты и др. Минимальные требования по надежности — два диска SSD собранные в массив RAID 1 (зеркало).
L2ARC on-disk cache: опция кэширования, ускоряет операции чтения с массива часто используемых данных.
Hot Spare: резервный диск, создает горячий резерв, который используется автоматически при выходе из строя диска в массиве RAIDZ. Позволяет ускорить операцию восстановления массива.