RAID-Z

Исходным обещанием технологии RAID (избыточный массив недорогих дисков) было обеспечение быстрого надёжного хранилища с использованием дешёвых дисков. Ключевым пунктом была дешевизна; но каким-то образом мы оказались тут. Почему?

Технология RAID-5 (как и другие схемы организации данных и чётности, такие как RAID-4, RAID-6, чёт-нечет и строчно-диагональная чётность) никогда в полной мере не выполняла обещания RAID -- да и не может -- из-за рокового просчёта, известного как "окно уязвимости". При любом обновлении данных в сегменте RAID нужно обязательно изменить чётность так, чтобы применение операции "исключающее ИЛИ" к данным со всех дисков сегмента RAID-5 давало в результате 0 -- это то самое уравнение, которое позволяет реконструировать данные в случае выхода из строя диска. Проблема в том, что нет способа обновить содержимое двух или более дисков атомарно, одной неделимой операцией (то есть существует временное окно между выполнением двух операций записи, в течение которого система уязвима к сбоям), поэтому массив RAID может оказаться повреждённым в случае системной ошибки или отключения питания.

Представьте, что питание пропадает после записи блока данных, но до записи соответствующего блока контроля чётности. Теперь блоки данных и блок контроля чётности для данного сегмента RAID противоречивы, и останутся таковыми навсегда (если только у вас не получится перезаписать старые данные полностью путем записи полного сегмента в какой-то момент времени). Поэтому в случае отказа диска процесс реконструкции RAID сгенерирует "мусор" при следующем чтении любого блока из этого сегмента. Хуже всего то, что это происходит неявно -- массив RAID-5 даже не будет подозревать, что возвращает вам некорректные данные.

Для этой проблемы существуют чисто программные обходные пути, но они настолько медленны, что программный RAID практически вымер и исчез с рынка. Все доступные на данный момент продукты RAID используют реализации схем RAID на аппаратном уровне, где они могут использовать энергонезависимую память (NVRAM) для защиты от сбоев и пропадания питания. Этот вариант работает, но стоит дорого.

Кроме этого, в существующих схемах RAID имеется серьёзная проблема с производительностью. При записи неполного сегмента -- то есть при обновлении меньшего количества данных, чем содержит один сегмент RAID, -- система RAID должна прочитать с диска значение старых данных и чётности для того, чтобы вычислить новое значение чётности. А это заметно снижает производительность. Если при записи полного сегмента можно просто использовать асинхронную запись, запись неполного сегмента требует выполнения синхронных операций чтения прежде, чем может быть начата какая бы то ни была запись.

И снова предлагается дорогое аппаратное решение: массив RAID может буферизировать операции записи неполного сегмента в энергонезависимой памяти (NVRAM) на время ожидания завершения необходимых операций чтения, скрывая таким образом от пользователя задержку, добавляемую ими. Естественно, это работает до тех пор, пока не происходит переполнения буфера NVRAM. Нет проблем, говорят продавцы устройств хранения! Просто подкиньте деньжат на дополнительные устройства NVRAM. Ведь нет задачи, с которой не справился бы бумажник.

Запись неполного сегмента создаёт дополнительную проблему для транзакционной файловой системы, такой как ZFS. Запись неполного сегмента неизбежно требует модификации актуальных данных, что нарушает одно из правил транзакционной семантики. (В ZFS неважно, пропадёт ли питание при записи полного сегмента по той же причине, по которой неважно, что пропадёт питание при любой другой операции записи в файловую систему: ни один из блоков, в которые производится запись, не содержит актуальных данных.)

Если бы только не эти дьявольские записи неполных сегментов...

Встречайте RAID-Z

RAID-Z представляет собой схем�� организации данных и четности, подобную RAID-5, но использующую динамический размер сегмента. По сути, каждый логический блок файловой системы -- это сегмент RAID-Z, независимо от размера блока. Это значит, что каждая запись RAID-Z -- это запись полного сегмента. Добавьте к этому копирование при записи в транзакционной семантике ZFS, и вы полностью избавитесь от "окна уязвимости" RAID. Кроме этого, RAID-Z быстрее обычного RAID, так как здесь не требуется читать данные, менять их, а потом снова записывать.

Стоп, стоп, стоп -- что это? Переменный размер сегмента? Выглядит довольно очевидно. Но если это настолько хорошая идея, почему же все ей не пользуются?

Оказывается, что ключевой момент здесь -- реконструкция RAID-Z. Так как сегменты RAID-Z имеют различный размер, простая формула "исключающее ИЛИ с данных со всех дисков равно нулю" становится неприменима. Для определения геометрии сегмента RAID-Z нужны метаданные файловой системы, для реконструкции всех сегментов придется обойти метаданные всей файловой системы. Заметим, что это было бы невозможно, если бы файловая система и RAID-массив были бы отдельными продуктами, и именно поэтому на рынке систем хранения данных сегодня нет ничего подобного RAID-Z. Нужен комплексный взгляд на логическую и физическую структуру данных, чтобы справиться с этой задачей.

"Минуточку, не слишком ли это медленно?" - спросите вы. Не слишком ли дорого обходить все метаданные? Фактически это компромисс. Если пул с данными очень близок к заполнению, тогда да, это медленнее. Но если пул не очень-то заполнен, тогда реконструкция по метаданным будет быстрее, так как копироваться будут только актуальные данные и не нужно будет тратить время на реконструкцию участков неиспользуемого дискового пространства.

Гораздо важнее то, что проход по метаданным позволяет ZFS в процессе сверить каждый блок с его 256-битной контрольной суммой. Традиционные RAID-системы не могут этого сделать, они лишь вслепую выполняют операцию исключающего ИЛИ.

Это подводит нас к отличительной особенности RAID-Z: самовосстановлению данных. Помимо обработки отказов диска целиком, RAID-Z может выявлять и исправлять неявные повреждения данных. При каждом чтении блока RAID-Z выполняется его проверка на соответствие контрольной сумме. Если проверка покажет, что диски с данными вернули неправильное содержимое блока, то ZFS прочитает диск с чётностью и выполнит комбинаторную реконструкцию данных для выявления диска, вернувшего неправильные данные. Затем ZFS восстановит поврежденные данные и вернет правильные данные приложению. Помимо этого, ZFS сообщит об этом инциденте, используя Solaris FMA, так что системный администратор будет знать, что с одним из дисков проблема.

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


Реальный пример выявления и исправления неявного повреждения данных ненадёжным "железом" можно найти здесь: Eric Lowe's SATA saga.

Первоначальная версия RAID-Z поддерживала только один разряд четности, но концепция RAID-Z работает для любых видов RAID. Текущая версия поддерживает и два разряда четности, в этом случае ее обычно называют RAID-Z2.

И ещё один момент, который оценят коллеги-программисты: полная реализация RAID-Z занимает всего 599 строк.


Теги Technorati:
Comments:

Post a Comment:
Comments are closed for this entry.
About

bonwick

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today