Россия, Москва, РОСНОУ |
Архитектура хранилища Exchange Server
Восстановление данных и журналы транзакций
Три из десяти вопросов, получаемых технической поддержкой Microsoft, связаны с ESE и восстановлением данных. В данном разделе обсуждается роль журналов транзакций и рассказывается о том, как они используются при восстановлении баз данных после сбоев. Здесь также рассказывается о причинах, вызывающих сбои в работе баз данных, и приводятся некоторые распространенные сообщения об ошибках, появляющиеся при сбоях. В лекции 8 "Функциональность, безопасность и поддержка Exchange Server 2003" приводится пошаговое описание процесса восстановления базы данных.
Extensible Storage Engine
Extensible Storage Engine представляет собой систему ведения журналов транзакций, обеспечивающую целостность данных и их сохранность в случае системных сбоев или неполадок в работе носителей. Разработка ESE велась согласно четырем критериям. Первым из них являлся вопрос, что произойдет в случае сбоя. Каждая новая разработка должна была улучшить восстанавливаемость при возникновении неполадок. Вторым критерием было уменьшение числа операций ввода/вывода, производимых ESE, и для достижения этой цели было сделано все возможное. Три операции ввода/вывода выполняются быстрее, чем четыре, а четыре – быстрее, чем пять. Даже если достижение этой цели подразумевает добавление в операцию ввода/вывода дополнительных вычислений, исключение одной операции ввода/вывода значительно улучшает производительность. Третьим критерием при разработке машины базы данных было обеспечение наивысшего уровня самонастраиваемости. Наконец, предусматривалось ее функционирование в течение времени, максимально приближенного к 24 часам в сутки и 7 дням в неделю. Достижению последней цели способствует обеспечение работы с базой данных в режиме онлайн.
Как работает ESE
Основная функция ESE заключается в управлении транзакциями. ESE выполняет проверку целостности базы с помощью четырех тестов, называемых тестами ACID.
- Atomiс (Элементарность). Должны быть завершены либо все операции, выполняющиеся в транзакции, либо не будет завершена ни одна из них.
- Consistent (Консистентность). Транзакция должна начинаться в базе данных в консистентном (неизмененном и работоспособном) состоянии и оставлять базу данных после своего завершения в таком же состоянии.
- Isolated (Изолированность). Изменения не видны до тех пор, пока не завершатся все операции транзакции. По завершении выполнения всех операций, если база данных находится в консистентном состоянии, транзакция считается фиксированной.
- Durable (Стойкость). Фиксированные транзакции сохраняются даже в том случае, если в системе возникают ощутимые проблемы, такие как полный отказ системы.
Что происходит при внесении изменения в страницу базы данных
Предположим, что важное сообщение электронной почты перемещается из папки Inbox (Входящие) в частную папку с именем Private (Личное). Для осуществления этой транзакции должны быть выполнены следующие операции:
- добавление сообщения электронной почты в папку Private (Личное);
- удаление сообщения электронной почты из папки Inbox (Входящие);
- обновление информации о каждой папке для корректного отображения числа элементов в папках;
- фиксирование транзакции во временном файле журнала транзакции.
Так как эти операции выполняются в одной и той же транзакции, Exchange либо выполняет их все, либо не выполняет ни одной. Это и есть тест Atomic (Элементарность). Операция фиксирования не может осуществляться до тех пор, пока не будут успешно выполнены все операции. После фиксирования транзакции тест Isolated (Изолированность) считается пройденным. База данных остается в консистентном состоянии, поэтому тест Consistent (Консистентность) также считается пройденным. Таким образом, после фиксирования транзакции в базе данных изменения будут сохранены даже в случае возникновения сбоя. Это обстоятельство отвечает требованиям теста Durable (Стойкость).
Каким образом осуществляется хранение данных. В файле базы данных ESE данные распределены по 4-килобайтным секциям, называемым страницами. Информация считывается из базы данных ESE и загружается в память в виде страницы. Каждая страница содержит определения данных, сами данные, индексы, проверочные суммы, флаги, временные штампы и другую информацию B-дерева. Страницам в базе данных присваиваются последовательные номера для улучшения производительности. Страницы содержат либо непосредственные данные, либо указатели на другие страницы, содержащие данные. Эти указатели формируют структуру B-дерева, и редко встречается дерево, содержащее больше трех или четырех уровней. Следовательно, структура B-дерева широка, но неглубока.
Транзакция – это последовательность изменений, вносимых в страницу базы данных. Каждое изменение называется операцией. После выполнения полного набора операций над объектом базы данных транзакция считается завершенной.
Когда страница впервые считывается с диска и сохраняется в памяти, она называется "чистой". Как только страница подвергается изменению посредством выполнения над ней какой-либо операции, она становится "измененной". Измененные страницы доступны для дальнейшей модификации, и такая страница может претерпеть несколько изменений перед записью на диск. Число изменений, вносимых в страницу, не связано с тем, когда страница будет записана на диск. Это действие определяется другими количественными мерами, о которых речь пойдет далее в лекции.
Операции в процессе своего выполнения записываются в хранилище версий. Хранилище версий содержит перечень всех изменений, внесенных в страницу, но еще не зафиксированных. Если питание сервера прервется перед фиксированием последовательности операций, то в процессе отката (отмены) ESE незавершенных операций будет произведено обращение к хранилищу версий. Хранилище версий является виртуальным хранилищем, поэтому на жестком диске нет базы данных с именем Version Store. Хранилище версий располагается в оперативной памяти и действительно содержит версии одной и той же страницы, считанной с диска в память. На рисунке 2.5 приведена наглядная демонстрация этого процесса.
Для непосредственного фиксирования транзакции операции должны записываться в буфер журнала транзакций перед записью в журналы транзакций на диске. ESE использует "упреждающую" регистрацию данных в журнале, т.е. перед внесением изменения в базу данных ESE записывает в файле журнала, какие действия она будет выполнять. Данные записываются в кэшированную версию журнала в области буфера журнала, в страницу в памяти вносятся изменения, и между этими двумя записями устанавливается связь. Перед тем как изменения страницы будут записаны на диск, изменение, записанное в буфере журнала, сначала должно быть записано в файл журнала на диске.
Зачастую кэшированные версии изменений страниц не записываются на диск сразу. Это не является проблемой, так как информация записывается в файлы журналов. Если изменения в памяти будут утеряны, при запуске ESE файлы журнала будут считаны вновь (этот процесс обсуждается более подробно далее в лекции), и транзакции будут записаны на диск. Более того, отсутствие немедленной записи кэшированной информации в базу данных увеличивает производительность. Представьте себе ситуацию, в которой страница загружается из памяти и затем подвергается изменению. Если в скором времени после этого ее вновь потребуется изменить, ее не нужно повторно считывать с диска, так как она уже находится в памяти. Таким образом, изменения базы данных могут быть "пакетными", что увеличит производительность.
Файлы базы данных. База данных представляет собой комбинацию файлов .EDB и .STM, хранимых на жестком диске. По существу, все транзакции записываются в один из этих файлов. Тем не менее, перед записью на диск для страницы вычисляется проверочная сумма, после чего эта сумма записывается в страницу вместе с остальными данными. При считывании страницы с диска проверочная сумма вычисляется повторно, и номер страницы проверяется для обеспечения его соответствия номеру запрошенной страницы. Если вычислить проверочную сумму не удается, или если в номере страницы присутствует несоответствие, генерируется сообщение об ошибке "-1018". Эта ошибка означает, что данные, записанные на диск, не являются данными, считанными ESE с диска в оперативную память.