Термин, вынесенный в заголовок этого подраздела, является дословной калькой
(возможно, не очень удачной) англоязычного термина intention logging.
В русском языке, к сожалению, еще нет общепринятого термина для этого
понятия.
Идея журналов регистрации намерений пришла из систем управления базами
данных. В СУБД часто возникает задача внесения согласованных изменений
в несколько разных структур данных. Например, банковская система переводит
миллион долларов с одного счета на другой. СУБД вычитает 1 000 000 из
суммы на первом счету, затем пытается добавить ту же величину ко второму
счету и в этот момент происходит сбой.
Для СУБД этот пример выглядит очень тривиально, но мы выбрали его потому,
что он похож на ситуацию в файловой системе: в каком бы порядке Ни производились
действия по переносу объекта из одной структуры в другую, сбой в неудачный
момент приводит к крайне неприятной ситуации. В СУБД эта проблема была
осознана как острая очень давно — ведь миллион долларов всегда был намного
дороже одного сектора на диске.
Удовлетворительное решение проблемы заключается в следующем.
Рис. 11.21. Выполнение транзакции с регистрацией намерений
Журнал часто называют журналом регистрации намерений
(intention log), что очень хорошо отражает суть дела, потому что
в этот журнал записываются именно намерения (intentions).
При использовании отложенной записи транзакция считается полностью завершенной,
только когда последний блок измененных данных будет физически записан
на диск. При этом в системе обычно будет одновременно существовать несколько
незавершенных транзакций (рис. II.22). Легко понять, что при операциях
с самим журналом отложенную запись вообше нельзя использовать.
Рис. 11.22. Очередь исполняющихся транзакций
Если произошел сбой системы, после перезагрузки запускается программа восстановления базы данных (рис. 11.23). Эта программа просматривает конец журнала.
Нужно отметить, что данные, необходимые для выполнения отката, могут иметь большой объем. Фактически это копия всех данных, подвергающихся Изменению в ходе транзакции. Многие СУБД, такие как ORACLE, хранят эти данные не в самом журнале, а в специальной области данных, называемой сегмент отката (rollback segment).
Рис. 11.23. Журнал транзакций после сбоя
Более подробная информация о работе журналов намерений в базах данных
может быть найдена в соответствующей литературе [Дейт 1999, Дейт 1988).
Необходимо только отметить, что книги и даже фирменная документация по
простым СУБД типа dBase или FoxPro здесь не помогут, поскольку эти пакеты
не содержат средств регистрации в журнале.
Идея журнала намерений достаточно естественно переносится в программу
управления файловой системой. Но здесь возникает интересный вопрос -что
же считать транзакцией: только операции по распределению пространства
на диске или также все операции по изменению данных?
Первый вариант проще в реализации и оказывает меньшее влияние на производительность;
зато он гарантирует только целостность самой ФС, но не может гарантировать
целостности пользовательских данных, если сбой произойдет в момент записи
в файл.
Второй вариант требует выделения сегмента отката и сильно замедляет работу.
Действительно, ведь теперь данные пишутся на диск два раза: сначала в
сегмент отката, а потом в сам файл. Зато он существенно снижает вероятность
порчи пользовательских данных.
ряд современных ФС с регистрацией намерений поддерживают оба режима работы
и предоставляют выбор между этими вариантами администратору системы. Например,
у файловой системы vxfs пли Veritas, входящей в пакет UnixWare (версия
Unix SVR4, поставляемая фирмой Novell), существует две версии. Одна версия,
поставляемая вместе с системой по умолчанию, включает в транзакцию только
системные данные. Другая, "advanced", версия, которая поставляется
за отдельные деньги, осуществляет регистрацию намерений как для системных,
так и для пользовательских данных.
Журналы намерений в Veritas
В Veritas 2 дисковый том разбит на области, называемые группами цилиндров
(термин, унаследованный из FFS— файловой системы BSD Unix). Каждая группа
цилиндров имеет свою карту свободных блоков, участок динамической таблицы
инодов и журнал намерений (рис. 11.24). Журнал намерений организован в
виде кольцевого буфера записей о транзакциях. В журнал пишутся данные
только о транзакциях над инодами, принадлежащими к этой группе цилиндров.
При этом в каждой группе может исполняться одновременно несколько транзакций
и окончанием транзакции считается физическое завершение записи модифицированных
данных. Количество одновременно исполняющихся транзакций ограничено объемом
журнала, но поскольку каждая группа цилиндров имеет свой журнал, это ограничение
не играет большой роли.
Рис. 11.24. Группы цилиндров и журналы транзакций Veritas