Быстрые зеркала

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

В случае зеркала восстановление избыточности может быть не сложнее простого копирования диска целиком. В случае RAID-5 процедура немногим сложнее: вместо копирования одного диска на другой, нужно вычислить "исключающее ИЛИ" для данных на остальных дисках сегмента RAID-5 и использовать получившийся результат для восстановления избыточности. Но основная идея все та же.

В традиционных системах хранения данных, восстановление избыточности происходит в менеджере томов или RAID-контроллере. Но и в том, и в другом случае - гораздо ниже уровня файловой системы.

Но мы говорим о ZFS, так что хочешь-не хочешь, а нужно быть отличным.

В предыдущей заметке я упоминал о том, что восстановление избыточности для RAID-Z требует другого подхода, так как для определения геометрии сегмента RAID-Z нужны метаданные файловой системы. В сущности, ZFS делает 'cp -r' дерева блоков пула с одного диска на другой. Это кажется более медленным, чем прямолинейное копирование диска целиком, да и обход дерева блоков в активно использующемся пуле определенно нетривиальная задача (но подробнее об этом в будущей заметке). Но, как оказалось, у восстановления избыточности по метаданным так много преимуществ, что мы предпочли использовать его даже для простых зеркал.

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

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

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

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

Только актуальные блоки: ZFS не тратит время и ресурсы каналов ввода/вывода на копирование неиспользуемых блоков диска, так как они не являются частью дерева блоков пула. Если пул заполнен на 10-20%, выигрыш будет значительным

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

На практике это означает, что если диск был недоступен пять секунд, восстановление избыточности данных займет около пяти секунд. И за это не надо дополнительно платить -- ни деньгами, ни производительностью -- не в пример тому, как это делается с помощью механизма объектов изменений (change objects) в Veritas. Исключение транзакций является важной архитектурной особенностью ZFS.

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

Использование метаданных позволяет ZFS осуществлять нисходящее восстановление избыточности. Это значит, что в первую очередь ZFS восстановит убер-блок и метки диска. Затем будет восстановлена избыточность метаданных, общих для всего пула; затем метаданных каждой файловой системы; и так далее вниз по дереву. В ходе этого процесса ZFS следует такому правилу: ибыточность блока не восстанавливается до тех пор, пока не восстановлена избыточность всех его предков.

Трудно преувеличить важность этого правила. При прямолинейном копировании всего диска, даже если успешно скопировано 99%, есть неплохой шанс, что один из верхних блоков дерева еще не скопирован. С точки зрения среднего времени восстановления после отказа (MTTR) это значит, что прогресса нет: отказ или ошибка второго диска в этот момент времени все еще будет иметь катастрофические последствия.

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

Приоритетное восстановление избыточности. ZFS еще не делает этого, но скоро будет. В ZFS восстановление следует за логической структурой данных, так что будет довольно просто пометить отдельную файловую систему или файлы как приоритетные для восстановления избыточности. Например, на файловом сервере может быть предпочтительнее в первую очередь восстановить избыточность календарей (они, как правило, очень малы и очень важны), затем каталог /var/mail, затем домашние каталоги пользователей и т.д.


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

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