Распределенные транзакции — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
== Набор требований к распределенным базам данных, которых хотят достигнуть ==
+
Участвует несколько узлов. Транзакция должна быть либо зафиксирована на всех узлах, либо на всех откачена. Бывают сбои как самих участников, так и каналов коммуникаций между ними.<br>
=== Требования по децентрализации ===
+
*Локальная независимость - узел должен функционировать даже в изоляции
+
== Задача двух генералов ==
(имеется в виду отвечать как на запросы на чтение, так и на изменение).<br>
+
 
* Отсутствие центрального узла, так как при его наличии и отключении не выполнится локальная независимость.<br>
+
На двух холмах по войску, между ними враг. Одновременная атака ведет к победе. Одиночная атака ведет к поражению.<br>
* Непрерывное функционирование;<br>
+
Посылают гонцов для обмена сообщениями. Гонца может перехватить враг и убить.<br>
** Надежность;<br>
+
 
** Доступность.<br>
+
=== Вероятностное решение ===
=== Требования по прозрачности ===
+
Послать гонца, засечь время и ждать подтверждения. Если по истечению времени гонец не вернулся, посылаем следующего.<br>
* Независимость от расположения;<br>
+
 
** Программы могут работать на любом узле (данные действительно хранятся распределенно в отличие от репликации);<br>
+
=== Доказательство отсутствия гарантированного решения ===
** Удаленный доступ к данным (должны уметь сделать любой запрос на любом узле);<br>
+
Пусть существует конечный протокол, тогда существует минимальное по включению множество сообщений. Пусть последнее сообщение не доставлено, тогда принять решение нельзя.<br>
Распределенная БД должна логически себя вести как одна большая БД.<br>
+
 
=== Независимость от фрагментации ===
+
 
* Программы не знают на каком узле находятся данные.<br>
+
== Протокол двухфазной фиксации ==
* Унифицированный доступ к данным.<br>
+
 
* Географическое секционирование.<br>
+
=== Описание алгоритма ===
=== Независимость от репликации ===
+
Один из узлов выбирается координатором, обычно узел, к которому пришел исходный запрос.<br>
* Автоматическая поддержка репликации.<br>
+
В реальности в системе могут исполняться параллельно несколько транзакций, у которых разные координаторы.<br>
* Выбор узла для обновления.<br>
+
 
=== Распределенные транзакции ===
+
1 Фаза: координатор всем участникам посылает сообщение приготовиться к коммиту.<br>
* Поддержка распределенных запросов.<br>
+
Ему узлы, участвующие в транзакции, присылают информацию что они готовы зафиксировать данные, что нет несогласованности в данных, ничего не сломалось.<br>
** Один запрос получает данные с разных узлов;<br>
+
 
** Несколько узлов могут участвовать в одной транзакции;<br>
+
Когда координатор подтверждение от всех, он принимает решение.<br>
** Должна быть согласованность фиксаций и отката.<br>
+
Если от всех узлов было положительное решение, то он примет решение выполнить.<br>
* Независимость от окружения.<br>
+
 
** От аппаратуры, то есть должны быть унифицированное представление данных;<br>
+
Начнется 2 Фаза, в которой координатор всем участникам пришлет свое положительное решение, а они ему присылают информацию в ответ, что запрос был выполнен.<br>
** От ОС, то есть должна быть конвертация данных и поддержка разных ОС;<br>
+
 
** От сети, например, в дата центрах будет быстрая локальная связь;<br>
+
После завершения второй фазы, когда было получен положительный  ответ от всех участников, координатор говорит, что транзакцию была завершена и шлет это в ответ на исходный запрос.<br>
** От типа СУБД, хотелось бы уметь делать распределенную БД, которая обслуживается разными системами управления БД (Oracle, Postgres, etc). Но в реальности все очень печально.<br>
+
 
 +
У реплики есть момент неопределенности: между моментом, как была послана информация, что данные готовы быть зафиксированы, но ответ от координатора, что делать с транзакцией, еще не пришел.<br>
 +
 
 +
=== Обработка сбоев координатора ===
 +
* До принятия решения {{---}} транзакция должна быть откачана.<br>
 +
* При принятии решении координатор сразу же записывает его в transaction log и при восстановении он вспомнит о принятом решении и исполнит его.<br>
 +
 
 +
=== Обработка сбоев участников ===
 +
* До отправки готовности координатору {{---}} откат после восстановления;<br>
 +
* До получения решения {{---}} запрашивает у координатора;<br>
 +
* При получении решения {{---}} записывает в transaction log;<br>
 +
* После получения решение {{---}} выполняет решение, отправляет подверждение, записывает в transaction log.<br>
 +
 
 +
Данные обработки все работает при краткосрочных сбоях, однако, так как в общем случае задача неразрешима, существуют вырожденные случаи последовательных сбоев в коммуникации, которые не позволят ни координатору, ни участнику продвинуться.
 +
 
 +
=== Улучшение протокола ===
 +
 
 +
Координатору требуется помнить решение между принятием и подтверждениями исполнения.<br>
 +
 
 +
====Протокол предполагаемой фиксации====
 +
* При решении «фиксировать» {{---}} «забыть» транзакцию.<br>
 +
* Неизвестная транзакция {{---}} фиксировать.<br>
 +
 
 +
а) Работает, когда количество фиксированных транзакций сильно превышает количество откаченных, экономим таким образом память.<br>
 +
 
 +
б) Может произойти ложная фиксация.<br>
 +
 
 +
в) Сбой на первой фазе.<br>
 +
 
 +
* Происходит «потеря» транзакции, а информация не была записана в лог, то участникам придет ответ «фиксировать»<br>
 +
 
 +
====Протокол предполагаемого отката====
 +
* При решении «откатить» {{---}} «забыть» транзакцию.<br>
 +
* Неизвестная транзакция {{---}} откатить.<br>
 +
 
 +
а) Не можем случайно зафиксировать транзакцию {{---}} надежнее.<br>
 +
 
 +
б) Тратим гораздо больше памяти, но не всегда это критично.<br>

Версия 01:31, 20 декабря 2021

Участвует несколько узлов. Транзакция должна быть либо зафиксирована на всех узлах, либо на всех откачена. Бывают сбои как самих участников, так и каналов коммуникаций между ними.

Задача двух генералов

На двух холмах по войску, между ними враг. Одновременная атака ведет к победе. Одиночная атака ведет к поражению.
Посылают гонцов для обмена сообщениями. Гонца может перехватить враг и убить.

Вероятностное решение

Послать гонца, засечь время и ждать подтверждения. Если по истечению времени гонец не вернулся, посылаем следующего.

Доказательство отсутствия гарантированного решения

Пусть существует конечный протокол, тогда существует минимальное по включению множество сообщений. Пусть последнее сообщение не доставлено, тогда принять решение нельзя.


Протокол двухфазной фиксации

Описание алгоритма

Один из узлов выбирается координатором, обычно узел, к которому пришел исходный запрос.
В реальности в системе могут исполняться параллельно несколько транзакций, у которых разные координаторы.

1 Фаза: координатор всем участникам посылает сообщение приготовиться к коммиту.
Ему узлы, участвующие в транзакции, присылают информацию что они готовы зафиксировать данные, что нет несогласованности в данных, ничего не сломалось.

Когда координатор подтверждение от всех, он принимает решение.
Если от всех узлов было положительное решение, то он примет решение выполнить.

Начнется 2 Фаза, в которой координатор всем участникам пришлет свое положительное решение, а они ему присылают информацию в ответ, что запрос был выполнен.

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

У реплики есть момент неопределенности: между моментом, как была послана информация, что данные готовы быть зафиксированы, но ответ от координатора, что делать с транзакцией, еще не пришел.

Обработка сбоев координатора

  • До принятия решения — транзакция должна быть откачана.
  • При принятии решении координатор сразу же записывает его в transaction log и при восстановении он вспомнит о принятом решении и исполнит его.

Обработка сбоев участников

  • До отправки готовности координатору — откат после восстановления;
  • До получения решения — запрашивает у координатора;
  • При получении решения — записывает в transaction log;
  • После получения решение — выполняет решение, отправляет подверждение, записывает в transaction log.

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

Улучшение протокола

Координатору требуется помнить решение между принятием и подтверждениями исполнения.

Протокол предполагаемой фиксации

  • При решении «фиксировать» — «забыть» транзакцию.
  • Неизвестная транзакция — фиксировать.

а) Работает, когда количество фиксированных транзакций сильно превышает количество откаченных, экономим таким образом память.

б) Может произойти ложная фиксация.

в) Сбой на первой фазе.

  • Происходит «потеря» транзакции, а информация не была записана в лог, то участникам придет ответ «фиксировать»

Протокол предполагаемого отката

  • При решении «откатить» — «забыть» транзакцию.
  • Неизвестная транзакция — откатить.

а) Не можем случайно зафиксировать транзакцию — надежнее.

б) Тратим гораздо больше памяти, но не всегда это критично.