Как двухфазные коммиты предотвращают сбой в последнюю секунду?


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

что предотвращает следующий сбой?

  1. все узлы отвечают, что они готов совершить
  2. сделки координатор говорит им: "вперед и совершить" но из узлов аварийно завершает работу перед получением этого сообщение
  3. все остальные узлы успешно фиксируются, но теперь распределенная транзакция повреждена
  4. насколько я понимаю, когда аварийный узел возвращается, его транзакция будет откатана (так как он никогда не получал сообщение о фиксации)

Я предполагаю, что каждый узел работает с обычной базой данных, которая ничего не знает о распределенных транзакциях. Что я пропустил?

5 53

5 ответов:

нет, они не проинструктированы откатить, потому что в сценарии оригинального плаката некоторые узлы уже зафиксированы. Что происходит, когда аварийный узел становится доступным, координатор транзакций говорит ему снова зафиксировать.

поскольку узел ответил положительно в фазе "подготовка", он должен быть в состоянии" зафиксировать", даже когда он возвращается из сбоя.

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

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

суммируя ответы каждого:

  1. нельзя использовать обычные базы данных с распределенных транзакций. База данных должна явно поддерживать координатора транзакций.

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

двухфазная фиксация не является надежной и просто предназначена для работы в 99% случаев времени.

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

http://en.wikipedia.org/wiki/Two-phase_commit_protocol

есть много способов, чтобы атаковать проблемы с двухфазной фиксации. Почти все они заканчиваются как некоторый вариант трехфазного алгоритма фиксации Paxos. Майк Берроуз, который разработал сервис Chubby lock В Google, основанный на Paxos, сказал, что есть два типа распределенных алгоритмов фиксации - "Paxos и неправильные" - в лекции, которую я видел.

одна вещь, которую может сделать разбившийся узел, когда он просыпается, - это сказать :" я никогда не слышал об этой транзакции, если бы она была был совершен?"к координатору, который расскажет ему, какое было голосование.

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

Если вы используете систему кворума для чтения базы данных, разнобой будет в маске (и сама база).