Производительность параметрического поиска на основе опенсорс-платформы
Леонид Борчук - Базы данных: Атомарность транзакций, способы ведения журналов транзакций и принципы построения транзакционных систем высо
1. 1
Базы данных: Атомарность
транзакций, способы ведения
журналов транзакций и принципы
построения транзакционных
систем высокой доступности
Борчук Леонид
2. 2
Зачем нужны транзакции
Отказ системы, вызванный отказом элемента, который не
может быть заменен запасным из-за отсутствия последнего,
считается системным
Избежать системных отказов невозможно
Транз кция (англ. transaction) — г ааруппа последовательных
операций, которая либо выполняется целиком, либо не
выполняется вовсе
Транзакции
3. 3
Примеры системных отказов
Ошибочные элементы данных
Разрушение носителя
Катастрофа
Сбой системы
Программные ошибки – деление на ноль
и т.д.
Транзакции
5. 5
Менеджер транзакций
Процессор
запросов
Транзакции
Менеджер
транзакций
Менеджер
протоколирования
Менеджер
буфера
Менеджер
восстановления
протокол
данные
6. Операция t A в памяти B в памяти A на диске B на диске
READ(A,t) 8 8 8 8
t:=t*2 16 8 8 8
WRITE(A,t) 16 16 8 8
READ(B,t) 8 16 8 8 8
t:=t*2 16 16 8 8 8
WRITE(B,t) 16 16 16 8 8
OUTPUT(A) 16 16 16 16 8
OUTPUT(B) 16 16 16 16 16
A:=A*2;
B:=B*2;
6
Пример транзакции
Транзакции
READ(A,t); t:=t*2; WRITE(A,t);
READ(B,t); t:=t*2; WRITE(B,t);
7. 7
Протоколирование
Обеспечивает атомарность транзакции;
Содержит записи действий транзакции;
Чередует записи нескольких транзакций;
Используется для воссоздания
согласованного состояния в случае аварии;
Может вестись разными способами (redo,
undo).
Транзакции
8. 8
Протоколирование в режиме
undo
Регламентируют деятельность менеджера буферов и
предусматривают выполнение действий при фиксации транзакции.
U1: Если транзакция T модифицирует элемент X базы данных, то
запись обновления <T,X,v> должна быть занесена в протокол до
сохранения нового значения элемента X на диске.
U2: При фиксации результатов транзакции T запись <COMMIT T>
следует помещать в протокол после сбрасывания всех измененных
значений элементов базы данных на диск, причем интервал между
сохранением данных и записью <COMMIT T> должен быть
минимально коротким.
Undo
9. 9
Правила
Порядок сохранения информации транзакции T в
режиме undo
1. Записи протокола, свидетельствующие об
изменениях, внесенных в содержимое элементов
базы данных;
2. Новые значения элементов базы данных как таковых;
3. Запись <COMMIT T> протокола.
4. FLUSH LOG – команда форсирования записи блоков
протокола менеджером на диск.
Undo
10. 10
Записи протокола
<START T> - выполнение транзакции T начато.
<COMMIT T> - транзакция T успешно завершена. Результаты
всех операций модификации должны быть зафиксированы
на диске. Менеджер протоколирования подтверждает этот
факт.
<ABORT T> - транзакция отменена. Никакие изменения
транзакции на диске не отображаются. Если результаты
уже были на диске, то они аннулируются менеджером
транзакций.
<T,X,v> - записи обновления. Транзакция T изменила прежнее
содержимое v элемента X. Ответ на операцию WRITE, а не
OUTPUT. Сохраняется только старое значение элемента X.
Undo
11. 11
Пример
Операция t A в
.
Undo
памяти
B в
памяти
A на
диске
B на
диске
Протокол
<START T>
READ(A,t) 8 8 8 8
t:=t*2 16 8 8 8
WRITE(A,t) 16 16 8 8 <T,A,8>
READ(B,t) 8 16 8 8 8
t:=t*2 16 16 8 8 8
WRITE(B,t) 16 16 16 8 8 <T,B,8>
OUTPUT(A) 16 16 16 16 8
OUTPUT(B) 16 16 16 16 16
<COMMIT T>
FLUSH LOG
12. Возможна ситуация, когда в результате сбоя некоторые
изменения были зафиксированы на диске, в то время как
другие – нет. Нарушается принцип атомарности.
Ответственность за восстановление возлагается на менеджер
восстановления.
Менеджер восстановления сканирует журнал и разделяет
все транзакции на:
- завершенные (в журнале есть запись <COMMIT T>) – в
этом случае по правилу U2 все изменения уже записаны
на диск.
- незавершенные (есть запись <START T>, но нет <COMMIT
T>) – для восстановления используется правило U1
12
Восстановление
.
Undo
13. Протокол сканируется весь начиная от конца к
началу.
Встречая запись вида <T,X,v>:
Если T является зафиксированной транзакцией, то
никакие действия не предпринимаются;
В противном случае T – незавершенная
транзакция. Элементу X должно быть возвращено
старое значение v.
13
Алгоритм восстановления
.
Undo
14. 14
Пример восстановления
Сбой .
произошел после шага 12.
Сбой произошел после операции 11 перед
операцией 12.
Сбой произошел между операциями 10 и
11.
Сбой произошел после операции 8.
Сбой произошел до операции 8.
Undo
15. во время восстановления анализируется вся
копия протокола;
размер протокола очень большой.
При этом:
записи помеченные <COMMIT T> для
восстановления уже не нужны;
в одно и то же время может быть несколько
активных транзакций — в общем случае одна
из них может начинаться где угодно.
15
Особенности
.
Undo
16. 16
Контрольная точка
Приостановить прием запросов на
.
активацию новых транзакций.
Дождаться, пока все действующие
транзакции не выполнят операции фиксации
или прерывания транзакций.
Осуществить сброс протокола на диск
командой FLUSH LOG.
Внести в протокол запись вида <CKPT> и
выполнить его повторный сброс.
Возобновить прием транзакций.
Undo
17. 17
Контрольная точка
В результате:
Любая .
транзакция, приступившая к работе до
введения контрольной точки, будет
гарантированно завершена (U2).
В процессе восстановления необходимость в
отмене операций такой транзакции не возникает.
Сканирование журнала можно начинать не с
начала, а с записи <CKPT>.
Часть протокола до записи <CKPT> может быть
удалена.
Undo
19. 19
Недостаток контрольной точки для
протоколирования в режиме undo
.
приостановка функционирования системы
до момента завершения всех активных
транзакций;
активная транзакция может длиться
долго, для всех остальных система будет
выглядеть зависшей.
Undo
20. 20
Динамическая контрольная
точка
1. Внести в протокол запись вида
<START CKPT (T1..Tk)>, где T1..Tk — активные
транзакции; сбросить протокол на диск.
2. Дождаться момента завершения или прерывания
всех активных транзакций T1..Tk, не запрещая старта
новых транзакций.
3. По завершении работы всех транзакций T1..Tk
сохранить в протоколе запись <END CKPT> и
выполнить команду FLUSH LOG.
.
Undo
21. 21
Восстановление при динамической
контрольной точке
Менеджер восстановления сканирует журнал от
конца к началу с целью отыскать транзакции.
Возможны 2 ситуации:
1. Если первой встречается запись вида <END
CKPT>, то все незавершенные транзакции
начались после последней записи <START CKPT
(T1..Tk)>, так что восстановление можно
начинать не с начала протокола, а с этой записи;
.
Undo
22. 22
Восстановление при динамической
контрольной точке
2. Если первой встречается запись
<START CKPT (T1..Tk)>, то отказ произошел в
момент выполнения контрольной точки.
Незавершенными могут быть только
транзакции (T1..Tk). Восстановление можно
начинать с момента возникновения самой
ранней из этих транзакций. К сожалению,
момент начала часто бывает далеко.
.
Undo
23. 23
Пример восстановления при
динамической контрольной точке
.
Undo
<START T1>
<T1,A,5>
<START T2>
<T2,B,10>
<START CKPT (T1,T2)>
<T2,C,15>
<START T3>
<T1,D,20>
<COMMIT T1>
<T3,E,25>
<COMMIT T2>
<END CKPT>
<T3,F,30>
24. 24
Протоколирование в режиме
redo
Недостатки undo:
невозможность выполнения фиксации
транзакции без предварительного
сохранения всех измененных данных на
диск.
критично для коротких транзакций.
операции ввода-вывода можно
оптимизировать с использованием
протоколирования в режиме redo
.
Redo
25. 1. В процессе восстановления данных с использованием undo
устраняются изменения, внесенные незавершенными
транзакциями , и игнорируются результаты завершенных
транзакций. Если применяется протокол redo, игнорируются
незавершенные транзакции, а итоги выполнения
зафиксированных транзакций воспроизводятся.
2. В режиме протоколирования undo измененные элементы
базы данных сохраняются на диске до момента сброса записи
<COMMIT T>. В режиме redo запись <COMMIT T> должна
появиться на диске прежде, чем будут сохранены измененные
значения.
25
Отличия redo и undo
.
Redo
26. R1: Прежде чем транзакция T сможет модифицировать
элемент X базы данных на диске, необходимо внести в
копию протокола на диске все записи, имеющие отношение
к операции модификации X, включая запись обновления
вида <T,X,v> и <COMMIT T>
26
Правила redo
.
Форма записи совпадает с undo
Redo
27. 1. Записи обновления, отражающие изменения,
которым должны подвергнуться элементы базы
данных.
2. Запись <COMMIT T>.
3. Модифицированные значения элементов базы
данных как таковые
27
Алгоритм записи redo
.
Redo
28. 28
Пример
Операция t A в памяти B в
.
Redo
памяти
A на
диске
B на
диске
Протокол
<START T>
READ(A,t) 8 8 8 8
t:=t*2 16 8 8 8
WRITE(A,t) 16 16 8 8 <T,A,16>
READ(B,t) 8 16 8 8 8
t:=t*2 16 16 8 8 8
WRITE(B,t) 16 16 16 8 8 <T,B,16>
<COMMIT T>
FLUSH LOG
OUTPUT(A) 16 16 16 16 8
OUTPUT(B) 16 16 16 16 16
29. 29
Восстановление
Неизвестно, какие записи успели попасть на диск, так что для
надежности нужно повторить все изменения.
1. Идентифицировать все зафиксированные транзакции.
2. Сканировать протокол от начала к концу. Встречая запись
вида <T,X,v>:
a) игнорировать ее, если T является незавершенной
транзакций;
b) сохранить на диске значение v элемента X, если
транзакция T завершена.
3. Для каждой незафиксированной транзакции T сохранить в
журнале запись <ABORT T> и выполнить команду FLUSH
LOG
Redo
30. Особенности: Данные на диск
записываются после фиксации транзакции.
Менеджер буфера должен отслеживать,
какие из блоков буфера являются
«грязными» - содержат зафиксированные
данные, не сброшенные на диск
30
Контрольная точка
Redo
31. 1. Внести в протокол запись вида <START
CKPT (T1,...,Tk)>, где T1,...,Tk — активные
транзакции, после чего выполнить сброс
протокола командой FLUSH LOG
2. Сохранить на диске «грязные» блоки данных
транзакций, завершенных до начала
контрольной точки
3. Сохранить в протоколе запись <END CKPT>
и выполнить команду FLUSH LOG
31
Контрольная точка
Redo
33. 33
Восстановление
Менеджер восстановления сканирует журнал от
конца к началу с целью отыскать транзакции.
Возможны 2 ситуации:
1. Если первой встречается запись вида <END
CKPT>, то все завершенные транзакции до записи
<START CKPT (T1..Tk)> сохранены на диске. Но
записи транзакций T1..Tk и стартовавших после
контрольной точки на диск не попали. Следует
начать восстановление с самой ранней записи
<START Ti>.
Redo
34. 34
Восстановление
2. Если первой встречается запись
<START CKPT (T1..Tk)>, то отказ произошел
в момент выполнения контрольной точки.
Нельзя гарантировать, что все транзакции,
завершенные к моменту начала контрольной
точки, попали на диск. Поэтому нужно
переместиться к первой записи <END CKPT>
и повторить действия п.1.
Redo
36. 1. Режим undo требует, чтобы измененные данные сохранялись
на диске непосредственно по завершению транзакции, что
чревато увеличением количества дисковых операций.
2. Режим redo требует хранения модифицированных блоков
данных в буфере до момента завершения транзакции. Это
увеличивает требования к оперативной памяти.
3. Использование обоих режимов сопряжено с необходимостью
удовлетворения противоречивых требований, касающихся
проблемы управления буфером памяти в процессе ведения
контрольной точки.
36
Режим undo/redo
Undo/Redo
37. UR: Прежде чем транзакция T сможет
модифицировать элемент X базы данных на
диске, необходимо внести в копию протокола на
диске соответствующую запись обновления
<T,X,v,w>
Запись <COMMIT T> допускается включать
в протокол до или после записи блоков данных
на диск.
37
Правило
Undo/Redo
38. 38
Пример
Операция t A в памяти B в
Undo/Redo
памяти
A на
диске
B на
диске
Протокол
<START T>
READ(A,t) 8 8 8 8
t:=t*2 16 8 8 8
WRITE(A,t) 16 16 8 8 <T,A,8,16>
READ(B,t) 8 16 8 8 8
t:=t*2 16 16 8 8 8
WRITE(B,t) 16 16 16 8 8 <T,B,8,16>
<COMMIT T>
FLUSH LOG
OUTPUT(A) 16 16 16 16 8
OUTPUT(B) 16 16 16 16 16
39. Обе группы действий одинаково важны, как и
их порядок.
39
Восстановление
1. Повторить операции всех зафиксированных
транзакций в порядке от более ранних к более
поздним
2. Отменить результаты всех незавершенных
транзакций в обратном хронологическом
порядке.
Undo/Redo
40. 40
Динамическая контрольная точка в режиме
протоколирования Undo/Redo
1. Внести в протокол запись вида <START
CKPT (T1,...,Tk)>, где (T1,...,Tk) — все
активные транзакции, и сбросить протокол на
диск командой FLUSH LOG.
2. Сохранить на диске информацию всех
«грязных» буферов, независимо от того,
зафиксированы они или нет.
3. Сохранить в протоколе запись <END CKPT>
и выполнить команду FLUSH LOG
Undo/Redo
42. 42
Резервное копирование
Undo/Redo
Оперативная память
Диск Backup
Цель: защита от отказа дискового устройства
Резервная копия – база данных в состоянии в момент
архивирования
43. Чтобы воссоздать свежее состояние БД, после ее
восстановления нужно воспользоваться протоколом, если он
доступен.
Чтобы защититься от потери протокола, его копию следует
сохранять в том же месте, где хранится архив .
Виды резервной копии:
Полный дамп, т.е. исчерпывающая копия БД
Инкрементальный дамп – копии тех элементов, что
изменились с прошлого резервного копирования
Процесс восстановления напоминает восстановление в
режиме “redo”
Недостаток: необходимо останавливать БД для создания
резервной копии
43
Резервное копирование
Undo/Redo