Как трехфазный фиксатор избегает блокировки?

Я пытаюсь понять, как трехфазное принятие предотвращает блокировку

Рассмотрим следующие два сценария отказа:

Сценарий 1: На этапе 2 координатор отправляет сообщения preCommit всем когортам и получает ответ от всех, кроме когорты A. Сетевые проблемы не позволяют когорте A получать сообщение координатора preCommit. Когорта Время ожидания сообщения preCommit и выбирается для прерывания. Затем и координатор, и когорт A сбой.

Сценарий 2. Протокол достигает этапа 3. Координатор отправляет сообщение doCommit в когорту A. Но прежде чем он сможет отправить больше сообщений doCommit, происходит сбой координатора. Когорта А завершает свою часть транзакции, затем сработает.

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

Ответы

Ответ 1

Трехфазное совершение не является магическим; он просто более устойчив, чем двухфазный фиксатор. В частности, 3PC устойчив к одноточечному отказу, но не все виды многоточечного отказа. Оба сценария в вопросе утверждают двухточечные отказы. Другими словами, предпосылка вопроса ошибочна; он просит больше 3PC, чем он способен.

Для дальнейшего чтения здесь приведено предложение из реферата статьи по теме, Анализ и проверка двухфазных фиксированных и трехфазных протоколов, Мухаммадом Атифом, чтобы поднять аппетит:

Мы также применяем наш метод к его "измененному" варианту, трехфазному Commit Protocol (3PC) и доказать, что он ошибочен для одновременного ошибки сайта

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

Ответ 2

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

Двухфазный протокол фиксации также имеет ограничения в том, что это blocking protocol. Например, участники блокируют процессы ресурсов, ожидая сообщения от координатора. Если по какой-либо причине это не удастся, участник продолжит ждать и никогда не сможет решить свою транзакцию. Поэтому ресурс может блокироваться неограниченно долго. С другой стороны, координатор также будет блокировать ресурсы, ожидая ответов от участников. В этом случае координатор также может блокировать определенно, если от участника не получено подтверждение.

Однако в трехфазном протоколе вводится третья фаза, называемая pre-commit. Цель этого заключается в том, чтобы "удалить период неопределенности для участников, которые совершили и ждут глобального отказа или передачи сообщения от координатора.

When receiving a pre-commit message, participants know that all others have voted to commit. 
If a pre-commit message has not been received the participant will abort and release any blocked resources. 

Ответ 3

В сценарии 1:

Во время восстановления: Все когорты, кроме A, будут в состоянии PRECOMMIT. Это говорит узлу восстановления, что все когорты проголосовали за принятие и продвинулись вперед. Таким образом, координатор и координатор должны быть в состоянии PRECOMMIT. Поскольку это не окончательное состояние, транзакция прерывается.

В сценарии 2:

Во время восстановления: Все когорты, кроме A, будут в состоянии PRECOMMIT. Это говорит узлу восстановления, что все когорты проголосовали за принятие и продвинулись вперед. Но с тех пор, как A получил сообщение doCommit, он находится в состоянии COMMITTED. Если сбоя не произошло, восстановление запросит все когорты для принятия, поскольку по крайней мере одна когорта приняла, Поскольку произошел сбой (A crash), узел восстановления не видит живую когорту с подтвержденным состоянием и, следовательно, выводит, что ни одна из когорт не получила сообщение doCommit. Следовательно, транзакция будет прервана, и всем когортам будет предложено освободить ресурсы.

Когда A возвращается из сбоя и начинает восстановление, он обнаруживает, что все другие когорты прервали транзакцию, и это также прервет транзакцию.

state chart
(источник: swturner на regal.csep.umflint.edu)

Ответ 4

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

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

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

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

Это означает, что в 3PC никогда не бывает времени, когда участник выполняет действие фиксации, которого не ожидает другой участник.