Автор перевода: Владимир Шелухин; оригинал: RAID Atomicity.
Лежа в ванной я, как водится, читал об уровнях RAID-массивов. Автор коснулся темы атомарности, и в этой связи у меня возникло несколько мыслей, которыми стоит поделиться с широкими массами.
Пусть Wikipedia и не самый надежный источник знаний о технике, но для затравки определение атомарности можно позаимствовать оттуда. Смотрим статью RAID, раздел Problems with RAID.
Это неочевидная для большинства и редко упоминаемая причина отказов в избыточных массивах запоминающих устройств без средств транзакционного контроля. Еще на заре коммерческого применения реляционных баз данных Джим Грей, который одним из первых занялся практическими вопросами их эксплуатации, включил в одну из своих работ раздел «Обновление по месту: отравленное яблоко?»[37]. Однако стоило только на сцене появиться технологии RAID, как об этом предострежении все быстро и дружно забыли. Многие инженеры-программисты узрели в новом недорогом решении панацею от всех бед, связанных с целостью и надежностью подсистемы хранения данных. Программы часто обновляют дисковый объект «по месту пребывания», то есть новая версия объекта записывается по тем же дисковым адресам, где располагалась старая. Хотя ничто не мешает такой программе где-нибудь в сторонке все же зарегистрировать разностную информацию, она исходит из «презумпции атомарности записи», то есть предполагает, что раз саму операцию удалось завершить успешно, то и результат проверять незачем.
Совсем недавно тема вновь появилась на повестке дня, только уже в обличьи проблемы отказов при записи на твердотельные диски (ТТД). Многие их производители и поставщики СХД корпоративного класса борются с такими ошибками посредством новых прошивок, которые обеспечивают последовательное заполнение дискового массива до полного исчерпания места. Пока место есть, ни один из уже записанных блоков данных вообще не будет перезаписан, а когда места не останется, блоки будут перезаписываться, начиная с самых первых (конечно, из числа тех, которые к этому времени успели освободиться).
Однако никакого решения для массивов с традиционными механическими дисками так никто и не предложил. Не слишком отдавая себе отчет в ее сути, об этой проблеме часто просто забывают или смотрят на ее существование сквозь пальцы. А суть в том, что многие системы, перезаписывая информацию прямо по месту ее прежнего расположения, вместо проверки полноты соответствия записанного тем данным, которые были отправлены с узла, контролируют только успешность операции записи. Отказ от полноценной проверки избавляет от солидной дополнительной нагрузки, которая ложится на систему в связи с необходимостью для подтверждения успешности записи сначала считать записанный блок, затем сверить контрольные суммы, и лишь в случае их совпадения опорожнить кэш записи.
Технология моментальных снимков, называемая копированием при записи (Copy on Write), только усугубляет положение. Вместо того, чтобы придержать в памяти новые данные для сверки с теми, которые только что были записаны в определенный сектор диска, система занята копированием старых данных в снимок, расположенный в другой части массива. Прикладные программы с большим числом транзакций, которые регулярно перезаписывают свои данные, крайне чувствительны к такого рода ошибкам (это могут быть БД или часто опорожняемые журналы откатов вроде журналов, создаваемых Oracle при подготовке к архивированию). Беда тут в том, что после записи данных и подтверждения успешности этой операции способа исправить ошибку не существует: эта поврежденная информация уже признана достоверной. И, если данные, сохраненные на диске, действительно разнятся с теми, которые были отправлены для записи, дедупликация способна многократно увеличить тяжесть негативных последствий. Если исходный блок был записан в сбойный сектор, и это не было сразу же обнаружено, в процессе дедупликации ссылка на него может заменить сотню других, полноценных блоков, следствием чего станет крупномасштабная порча данных.
Механизм контроля четности RAID-массива в таких случаях также не всегда полезен: в RAID значение контрольного бита вычисляется уже после записи страйпа. Это значение не всегда можно вычислить в памяти, потому что страйп также не всегда записывается полностью; в случае частичной записи страйпа вычислять биты четности приходится частью по данным, которые уже на диске, а частью — по тем, которые только предстоит записать. Когда данные записывают и считывают, чтобы вычислить значение контрольного бита, это совсем не обязательно означает сверку записанных данных с их первоисточником. Есть несколько способов предотвратить такую ситуацию — в основном они сводятся к вычислению контрольной суммы для данных, что находятся в памяти. Повторно считывать данные после подтверждения успешности записи ничего не даст, поскольку сравнивать записанное на диск больше не с чем; проверку целости следует проводить до очистки кэша записи.
Разные поставщики СХД решают эту задачу по-разному; я же опишу решение, используемое в системах NetApp. Файловая структура WAFL осуществляет запись в любой из свободных блоков, но никогда не пишет в блок, где имеются данные. Освобождает блоки фоновая процедура технической профилактики массива (RAID scrub), которая осуществляет поблочную проверку всех дисков СХД на предмет наличия в активной файловой системе или в моментальных снимках ссылок-указателей на каждый из блоков. Если ни одной ссылки не обнаружено, проверяемый блок освобождается от данных и помечается как свободный (точнее будет сказать, что с блока снимается пометка «занят»). Польза от этого двоякая: во-первых, файловая система получает в свое распоряжение ничем не занятые блоки, а во-вторых, в качестве бонуса записываемые блоки распределяются по всей поверхности диска, что сводит почти к нулю негативные последствия атомарности. Кроме того, для файловой структуры WAFL профилактика блоков данных означает также общую проверку целости диска, что позволяет прогнозировать отказы также и по результатам контроля технического состояния поверхности, а не просто исходя из работоспособности устройства в целом. После превышения порогового числа сбойных секторов диск признается дефектным, вместо него в эксплуатацию вводится резервный диск для оперативной замены, и начинается процедура восстановления массива. Иными словами, в системах NetApp один и тот же блок данных практически невозможно использовать дважды подряд, даже (а точнее — в особенности) в случае высокой частоты повторения транзакций.
Если принять во внимание все, о чем говорилось выше, становится понятным, что чрезмерно заполненная файловая система не сулит вашим данным ничего хорошего сразу по нескольким причинам. Чем ближе к полному исчерпанию дисковое пространство, тем меньше свободных блоков доступно для записи, соответственно, некоторое число блоков данных записывается последовательно. Как следствие, снова выходит на первый план вопрос атомарности, да и в целом растет интенсивность износа дисков — в общем, об архивировании и дедупликации надо думать своевременно, файловые системы содержать в порядке и вообще лучше как следует заботиться о своей подсистеме хранения данных.
Так что не забудьте поинтересоваться у продавца СХД, что предпринято в его системах для защиты данных ото всех этих напастей.
Джеймс Николас Грей (James Nicholas “Jim” Gray), который подписывал свои работы как Джим Грей — американский ученый в сфере информатики, лауреат премии Тюринга 1998 года «за существенный вклад в теорию баз данных и обработки транзакций, а также практические достижения в деле построения информационных систем». В Wikipedia ему посвящены английская и русская страница (кроме прочих языков).



