2 шт. И 3PC распределенного консенсусного соглашения

распределенный

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

Если транзакция инициируется в распределенной системе, и транзакция включает в себя несколько разных узлов, для обеспечения характеристик ACID транзакции необходимо ввести координатора для унифицированного планирования нескольких узлов, участвующих в транзакции.Запланированные узлы называются транзакциями. участники. . Из этого получены протоколы 2PC и 3PC.Эта статья подробно расскажет о рабочем механизме 2PC и 3PC.

2PC (двухфазная фиксация)

Как следует из названия, он разделен на два этапа: Подготовка и Фиксация.

Подготовка: отправить запрос на транзакцию

Основной процесс выглядит следующим образом:

2PC1.png

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

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

  3. отклик Если участник успешно выполняет транзакцию и записывает информацию Undo и Redo, он возвращает координатору ответ YES, в противном случае он возвращает ответ NO. Конечно, участник также может быть отключен и, таким образом, не возвращать ответ.

Commit: выполнить фиксацию транзакции

Существует два случая выполнения фиксации транзакции: нормальная фиксация и откат.

Совершить транзакцию в обычном режиме

Процесс выглядит следующим образом:

2PC2.png

  1. зафиксировать запрос Координатор фиксации отправляет запрос всем участникам.

  2. фиксация транзакции 参与者收到 Commit 请求后,执行事务提交,提交完成后释放事务执行期占用的所有资源。

  3. Результаты обратной связи Участники выполняют транзакцию после отправки ACK, отправьте ответ на координатор.

  4. завершить транзакцию После получения ответов Ack от всех участников фиксация транзакции завершается.

прервать транзакцию

Если во время выполнения шага «Подготовка» некоторые участники не смогут выполнить транзакции, отключатся или возникнут сетевые перебои с координатором, координатор не сможет получить ответы «ДА» от всех участников, или участник ответит «Нет». В этот момент координатор войдет в процесс отката, чтобы откатить транзакцию. Процесс показан в красной части рисунка ниже (замените запрос Commit на красный запрос Rollback):

2PC4.png

  1. запрос на откат Координатор рассылает всем участникам запрос на откат.

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

  3. Результаты обратной связи Участники выполняют транзакцию, возвращается после отправки ответа ACK на координатор.

  4. прервать транзакцию После получения ответов Ack от всех участников завершите прерывание транзакции.

проблема 2ПК

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

  2. Единая точка В 2PC все запросы идут от координатора, поэтому статус координатора имеет решающее значение, если координатор выйдет из строя, участники всегда будут заблокированы и займут ресурсы транзакции.

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

  3. несогласованность данных Во время транзакции Commit, запрос на коммит / Запрос на откат может быть потерян, потому что координатор снижается или сеть между координатором, и участниками теряется, что заставляет некоторых участников не получать запрос на коммит / откат, в то время как другие участники получают и выполняют Обычно. Операция Commun / Rollback, Участник, который не получил запрос, будет продолжать блокировать. На данный момент данные между участниками больше не являются последовательными.

    Когда участники выполняют Commit / Rollback, будут отправлены координатору ACK, однако, должен ли координатор получил все участники, транзакция больше не будет иметь другие средства правовой защиты, координатор может сделать, - это ожидание времени ожидания после транзакции в качестве возврата к отправителю «Я не уверен, успешно ли транзакция».

  4. Экологическая надежность зависит После того, как координатор подготовит запрос, он ожидает ответа.Однако при простое участника или обрыве сети с координатором координатор не сможет получить ответы от всех участников.В 2PC координатор будет ждать ответа определенное время, а затем по истечении тайм-аута вызывает прерывание транзакции, при котором координатор и все остальные участники блокируются от процесса. Этот механизм слишком суров для реальных сред, где часто возникают сетевые проблемы.

3PC (трехэтапная фиксация)

Вышеизложенное объясняет множество недостатков протокола 2PC, тогда 3PC разработан на основе 2PC для решения некоторых недостатков 2PC.3PC делится на три этапа: CanCommit, PreCommit и doCommit.

CanCommit

Процесс выглядит следующим образом:

3PC1.png

  1. бизнес-запрос Координатор отправляет всем участникам запрос canCommit транзакции, запрос содержит содержимое транзакции, спрашивает, можно ли выполнить операцию фиксации транзакции, и начинает ждать ответа.

  2. результаты запроса обратной связи После получения запроса canCommit участник анализирует содержимое транзакции и определяет, может ли он выполнить транзакцию, если да, то возвращает ответ «Да» и переходит в состояние готовности, в противном случае возвращает ответ «Нет».

    Примечание. В этом процессе нет транзакции (в отличие от фазы подготовки 2PC, когда участники выполняют транзакции).

PreCommit

Блок-схема выглядит следующим образом:

3PC2.png

Этап PreCommit определяет следующее действие на основе ответа CanCommit, возвращенного каждым участником. Если получен ответ «Да» от всех участников, выполните предварительную фиксацию транзакции, в противном случае (по крайней мере, один ответ «Нет» или ответ «Да» от всех участников не получен в течение определенного периода времени, например, красная часть на первом изображении. 3ПК), выполнение Транзакция прерывается.

Предварительная фиксация транзакции

  1. Отправить запрос PreCommit Координатор отправляет запрос PreCommit и переходит в стадию Prepared.

  2. Участник обрабатывает PreCommit После того, как участник получает запрос PreCommit, выполняется транзакционная операция, и информация об отмене и повторении записывается в журнал транзакций.

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

Прерывание транзакции

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

  1. Отправить запрос на прерывание транзакции Координатор отправляет всем участникам запрос на прерывание.

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

doCommit

Блок-схема выглядит следующим образом:

3PC3.png

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

фиксация транзакции

  1. отправить запрос на отправку После получения ответов Ack от всех участников на этапе PreCommit координатор отправляет запрос doCommit всем участникам и входит в состояние фиксации.

  2. фиксация транзакции 参与者收到 Commit 请求后,执行事务提交,提交完成后释放事务执行期占用的所有资源。

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

  4. завершить транзакцию 协调者收到所有参与者的 Ack 响应后,完成事务。

Прерывание транзакции

  1. Отправить запрос на прерывание транзакции Координатор отправляет всем участникам запрос на прерывание.

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

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

  3. Результаты отката обратной связи Участник отправляет ответ Ack координатору после выполнения отката транзакции.

  4. прервать транзакцию После того, как координатор получает ответы Ack от всех участников, транзакция прерывается.

Улучшения и недостатки 3PC

Улучшать

  1. уменьшенная блокировка

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

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

  2. Решить проблему единой точки отказа

    • После того, как участник вернет ответ на запрос CanCommit, он ожидает команды второго этапа.Если координатор не работает, он автоматически прервется после ожидания тайм-аута;

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

недостаток

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

Суммировать

Из приведенного выше описания ни 2PC, ни 3PC не могут полностью решить проблему согласованности распределенных данных.Хотя характеристики ACID транзакций не могут быть гарантированы, двухфазная идея широко используется во многих практических архитектурах, таких как транзакции JTA и некоторые транзакции базы данных. , синхронизация данных.

Цитируя предложение, автор Google Chubby сказал:

«Существует только один протокол консенсуса, и это Paxos» — все остальные подходы — это просто сломанные версии Paxos».

Paxos — это алгоритм, предложенный Ламбертом для решения распределенной согласованности, и я напишу статью, чтобы описать его принцип позже.