дыра для записи: какие уровни RAID затронуты?

На пути к пониманию преимуществ RAIDZ я натолкнулся на концепцию отверстия для записи .

Как эта страница объясняет, отверстие для записи - это несоответствие, которое вы получаете между дисками массива при пропадании питания во время записи. На этой странице также объясняется, что это влияет как на RAID-5/6 (если питание пропадает после записи данных, но до вычисления четности), так и на RAID-1 (данные записываются на один диск, но не на другие). , и что это коварная проблема, которая может быть обнаружена только во время повторной синхронизации / очистки или (что катастрофически) во время восстановления одного из дисков ... однако большинство из другие источники говорят об этом, поскольку это влияет только на уровни RAID на основе четности.

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

4
задан 16 April 2017 в 23:41
4 ответа

Отверстие для записи может влиять на каждый уровень RAID, кроме RAID-0; конфигурации с чередованием (RAID-4/5/6) и зеркалированием (RAID-1) могут быть уязвимы просто из-за того, что атомарная запись невозможна на 2 или более дисках.

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

Благодаря каналу #zfs irc за помощь!

1
ответ дан 3 December 2019 в 03:28

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

3
ответ дан 3 December 2019 в 03:28

Я думаю, что существует 2 возможных определений того, что такое «дыра для записи» в массиве RAID.

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

Внутренняя несогласованность массива RAID может произойти на каждом уровне RAID, который имеет какую-либо избыточность данных: RAID 1, 4, 5, 6 и т. Д. RAID 0 не подвержен проблемам несогласованности, поскольку нет избыточных данных, которые необходимо синхронизировать между разными дисками массива.

Существует несколько возможных стратегий решения проблем несогласованности RAID-массива:

  • Программный RAID-массив Linux MD по умолчанию использует стратегию «синхронизации» при сборке RAID-массива, помеченного как «грязный». То есть для массивов RAID 1 один из дисков считается мастером, и его данные копируются на другие диски. Для RAID 4/5/6 считываются блоки данных.Затем блоки четности регенерируются и записываются на диски. Процесс синхронизации может быть очень длительным. Чтобы сделать это намного быстрее, есть функция, называемая «растровое изображение» с намерением записи, которая отслеживает горячие фрагменты массива. Эта функция растрового изображения может значительно сократить продолжительность процесса синхронизации в обмен на некоторую потерю производительности во время операций записи.

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

  • Существует также стратегия CoW (Копирование при записи), о которой я объясню чуть позже.


Другое возможное определение «дыры для записи» относится к проблемам потери данных в RAID 4/5/6 при определенных обстоятельствах (уровни RAID 1 и 10 не подвержены этому виду «дыры для записи»). Я цитирую определение Нейла Брауна рассматриваемой проблемы:

« Отверстие для записи - это простая концепция, которая применима к любой схеме RAID с полосой + четностью, такой как RAID4, RAID5, RAID6 и т. Д. Проблема возникает, когда массив запускается после нечистого завершения работы без доступности всех устройств или , если обнаруживается ошибка чтения до восстановления четности после нечистого завершения работы . »

Т.е. у вас есть, например, массив RAID 5, и произошло событие отключения питания.RAID попытается привести массив в согласованное состояние. Но один из дисков больше не работает или некоторые его секторы не читаются. Следовательно, четность не может быть восстановлена ​​из блоков данных, так как некоторые из них пропущены. Можно сказать: да, но у нас есть избыточность в массиве. Значит, мы могли бы использовать четность для восстановления недостающих блоков данных, не так ли? Ответ - нет. Если вы сделаете это, вы можете получить данные мусора, потенциально, в некоторых блоках данных. Это очень серьезная проблема. Дело не в том, что некоторые блоки данных были записаны или нет (современные журналируемые файловые системы не имеют с этим никаких серьезных проблем). Дело в том, что некоторые блоки данных массива потеряны или (если регенерированы) они являются мусором. В любом случае, здесь есть серьезная проблема.

Если мы возьмем это более строгое определение «отверстия для записи», мы увидим, что это особый угловой случай, который случается только при определенных обстоятельствах. Должен произойти критический сбой, например, отключение питания. И, кроме того, какой-то диск должен выйти из строя (полностью или частично). Но для RAID 4/5/6 (уровни с блоками четности) риск есть.

Этот риск можно предотвратить с помощью двухэтапной стратегии записи (или записи с использованием техники журнала, которая была объяснена ранее). С помощью журнала все блоки данных могут быть безопасно записаны на диски даже в этих угловых корпусах. Аппаратный RAID с батареями с батарейным питанием, если он правильно реализован, не вызывает проблем с "дырами для записи". Программный RAID-массив Linux MD получил также функцию записи с журналом несколько лет назад, которая эффективно предотвращает проблему «дыры для записи».

Я не так хорошо знаком с ZFS, но думаю, что он использует метод CoW (копирование при записи) в массивах RAID-Z, чтобы избежать каких-либо проблем с «дырами для записи». Он запишет все данные плюс четность в какое-то неиспользуемое пространство, а затем обновит виртуальную ссылку на эти физические блоки. Используя это 2-Пошаговый процесс, операции записи гарантированно будут атомарными. Так что проблема с отверстием для записи эффективно предотвращается.

1
ответ дан 10 February 2020 в 12:56

Термин дыра записи используется для описания двух похожих, но разных проблем, возникающих при работе с массивами RAID без батарейной защиты:

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

  • правильное определение отверстия для записи, которое представляет собой потерю целой полосы избыточности данных из-за внезапной потери питания во время обновления полосы, применимо только к четности на основе RAID.

Второе и правильное определение дыры записи нуждается в дополнительных пояснениях: давайте предположим, что RAID5 состоит из 3 дисков с размером фрагмента 64 КБ и размером страйпа 128 КБ (размер четности +64 КБ для каждого страйпа). Если питание отключается после записи 4K на диск №1, но во время обновления четности на диске №3, у нас может быть поддельный (т.е. поврежденный) фрагмент четности и необнаруженная проблема согласованности данных. Если впоследствии диск № 2 выйдет из строя и для восстановления исходных данных будет использован контроль четности путем xoring дисков № 1 и № 3, восстановленные 64 КБ, изначально находившиеся на диске № 2 и не недавно записанные, будут удалены. тем не менее испорчен.

Это надуманный пример, но он должен показать основную проблему, связанную с дырой записи: потерю нетронутых, находящихся в состоянии покоя, несвязанных данных, которые совместно используют одну и ту же полосу с последними прерванными операциями записи.Другими словами, если файл A был записан много лет назад, но имеет ту же полосу, что и только что записанный файл B, и система теряет питание во время обновления файла B, файл A будет подвергаться риску.

Еще одна вещь, которую следует учитывать, — это политика записи массива: использование чтения/реконструкции/записи (то есть: целые полосы перезаписываются, когда происходит частичная запись) против чтения/модификации/записи (то есть: обновляются только затронутые фрагменты + четность ) подвержены различным типам отверстий для записи.

Из вышеизложенного должно быть ясно, что RAID0 и RAID1 не страдают от надлежащей дыры записи: у них нет четности, которая может «рассинхронизироваться», делая недействительной всю полосу. Обратите внимание, что зеркальные ветви RAID1 могут рассинхронизироваться после нечистого завершения работы, но единственным повреждением будут последние записанные данные. Ранее записанные данные (т.е. данные в состоянии покоя) не столкнутся с какими-либо проблемами.

Как можно избежать надлежащей дыры для записи, определив и охватив ее?

  • HW RAID использует энергонезависимую кэш-память записи (т. е.: BBU+DRAM или модуль флэш-памяти с конденсаторной поддержкой) для постоянного хранения обновлений, подлежащих записи. В случае отключения питания карта HW RAID повторно выполнит любую незавершенную операцию, сбрасывая свой кэш на дисковые пластины при восстановлении питания и загрузке системы. Это защищает не только от надлежащей дыры записи, но и от повреждения последних записанных данных;

  • Linux MD RAID использует битовую карту записи, которая записывает подлежащие записи чередующиеся перед их обновлением. При отключении питания грязное растровое изображение используется для пересчета любых данных четности для затронутых полос.Это защищает только от реальной дыры записи; последние записанные данные могут быть повреждены (если только они не защищены барьером записи fsync()+). Тот же метод используется для повторной синхронизации несинхронизированной части массива RAID1 (чтобы убедиться, что две ветви зеркала синхронизированы, хотя для зеркал не существует дыры для записи);

  • более новый Linux MD RAID5/6 должен иметь возможность использовать устройство регистрации/журнала, частично имитирующее энергонезависимый кэш обратной записи соответствующей карты HW RAID (и, в зависимости от конкретного патча/реализации , защищая как от дыры записи, так и от повреждения последних записанных данных или только от дыры записи);

  • наконец, RAIDZ позволяет избежать и дыры записи и повреждения последних данных, используя наиболее «элегантный», но влияющий на производительность метод: путем записи только полноразмерных страйпов (и ведения журнала любой синхронизированной записи в ЗИЛ/СЛОГ).

Полезные ссылки:
https://neil.brown.name/blog/20110614101708
https://www.kernel.org/doc/Documentation/md/raid5-ppl.txt
https ://www.kernel.org/doc/Documentation/md/raid5-cache.txt
https://lwn.net/Articles/665299/

5
ответ дан 10 February 2020 в 14:26

Теги

Похожие вопросы