Введение
В обработке транзакций, базах данных и компьютерных сетях протокол двухфазного коммита (2PC, tupac) является типом протокола атомного коммита (ACP). Это распределенный алгоритм, координирующий все процессы, участвующие в распределенной атомарной транзакции, для принятия решения о коммите (подтверждении) или аборте (откате) транзакции. Этот протокол (специализированный тип протокола консенсуса) достигает своей цели даже во многих случаях временных сбоев системы (включая сбои процессов, сетевых узлов, коммуникаций и т.д.). Однако он не устойчив ко всем возможным конфигурациям сбоев, и в редких случаях требуется ручное вмешательство для исправления ситуации. Для восстановления после сбоя (в большинстве случаев автоматического) участники протокола используют журналирование состояний протокола. Журнальные записи, которые обычно создаются медленно, но сохраняются при сбоях, используются процедурами восстановления протокола. Существует множество вариантов протокола, которые в основном различаются стратегиями журналирования и механизмами восстановления. Хотя процедуры восстановления обычно предназначены для редкого использования, они составляют значительную часть протокола из-за множества возможных сценариев сбоев, которые необходимо учитывать и поддерживать. В "нормальном выполнении" любой отдельной распределенной транзакции (то есть, когда сбои не происходят, что обычно является наиболее частой ситуацией), протокол состоит из двух фаз:
Фаза запроса коммита (или фаза голосования), на которой процесс координатора пытается подготовить все участвующие процессы транзакции (называемые участниками, когортами или воркерами) к выполнению необходимых действий для коммита или отката транзакции и проголосовать: "Да" – коммит (если выполнение локальной части участника транзакции завершилось успешно), или "Нет" – откат (если обнаружена проблема с локальной частью); и
Фаза коммита, на которой, основываясь на голосовании участников, координатор решает, следует ли выполнить коммит (только если все проголосовали "Да") или откат транзакции (в противном случае), и уведомляет участников о результате. Затем участники выполняют необходимые действия (коммит или откат) со своими локальными транзакционными ресурсами (также называемыми восстанавливаемыми ресурсами, например, данными базы данных) и соответствующими частями в других результатах транзакции (если применимо). Протокол двухфазного коммита (2PC) не следует путать с протоколом двухфазной блокировки (2PL), протоколом управления параллелизмом.
In transaction processing, databases, and computer networking, the two phase commit protocol (2PC, tupac) is a type of atomic commitment protocol (ACP). It is a distributed algorithm that coordinates all the processes that participate in a distributed atomic transaction on whether to commit or abort (roll back) the transaction. This protocol (a specialised type of consensus protocol) achieves its goal even in many cases of temporary system failure (involving either process, network node, communication, etc. failures), and is thus widely used. However, it is not resilient to all possible failure configurations, and in rare cases, manual intervention is needed to remedy an outcome. To accommodate recovery from failure (automatic in most cases) the protocol's participants use logging of the protocol's states. Log records, which are typically slow to generate but survive failures, are used by the protocol's recovery procedures. Many protocol variants exist that primarily differ in logging strategies and recovery mechanisms. Though usually intended to be used infrequently, recovery procedures compose a substantial portion of the protocol, due to many possible failure scenarios to be considered and supported by the protocol. In a "normal execution" of any single distributed transaction (i. e., when no failure occurs, which is typically the most frequent situation), the protocol consists of two phases:
The commit request phase (or voting phase), in which a coordinator process attempts to prepare all the transaction's participating processes (named participants, cohorts, or workers) to take the necessary steps for either committing or aborting the transaction and to vote, either "Yes": commit (if the transaction participant's local portion execution has ended properly), or "No": abort (if a problem has been detected with the local portion), and
The commit phase, in which, based on voting of the participants, the coordinator decides whether to commit (only if all have voted "Yes") or abort the transaction (otherwise), and notifies the result to all the participants. The participants then follow with the needed actions (commit or abort) with their local transactional resources (also called recoverable resources; e. g., database data) and their respective portions in the transaction's other output (if applicable). The two phase commit (2PC) protocol should not be confused with the two phase locking (2PL) protocol, a concurrency control protocol.
Фаза запроса на обязательство (или голосования)
Координатор отправляет запрос на подтверждение транзакции всем участникам и ждет ответа от каждого из них. Участники выполняют транзакцию до точки, где им будет предложено зафиксировать изменения. Каждый из них записывает информацию в журнал отката и журнал повтора. Каждый участник отвечает сообщением о согласии (участник голосует "за" фиксацию), если его действия выполнены успешно, или сообщением об откате (участник голосует "против" фиксации), если участник столкнулся со сбоем, который делает фиксацию невозможной.
Недостатки
Самый большой недостаток протокола двухфазной фиксации заключается в том, что это блокирующий протокол. Если координатор выходит из строя без возможности восстановления, некоторые участники никогда не завершат свои транзакции: после того, как участник отправил сообщение о согласии в ответ на запрос на фиксацию от координатора, он будет заблокирован до получения команды фиксации или отката. Протокол двухфазной фиксации не может надежно восстановиться после сбоя как координатора, так и участника группы во время фазы фиксации. Если вышел из строя только координатор и ни один участник группы не получил сообщение о фиксации, можно с уверенностью предположить, что фиксация не произошла. Однако, если координатор и участник группы вышли из строя одновременно, возможно, что вышедший из строя участник группы был первым, кто был уведомлен, и фактически выполнил фиксацию. Даже если будет выбран новый координатор, он не сможет уверенно продолжить операцию, пока не получит подтверждение от всех участников группы, и поэтому должен ждать ответа от всех участников.
Общая архитектура
Во многих случаях протокол 2PC распределяется в компьютерной сети. Он легко реализуется путем развертывания нескольких специализированных компонентов 2PC, аналогичных друг другу, обычно называемых менеджерами транзакций (TM; также именуемыми агентами 2PC или мониторами обработки транзакций), которые выполняют протокол для каждой транзакции (например, X/Open XA от The Open Group). Базы данных, участвующие в распределенной транзакции – участники, включая координатора и участников – регистрируются в соответствующих TM (обычно расположенных на тех же сетевых узлах, что и участники) для завершения транзакции с использованием 2PC. Каждая распределенная транзакция имеет свой набор TM, в которые регистрируются участники транзакции. Для каждой транзакции существует лидер – координатор TM, который координирует 2PC, как правило, TM базы данных-координатора. Однако роль координатора может быть передана другому TM для повышения производительности или надежности. Участники обмениваются сообщениями не друг с другом, а со своими TM. Соответствующие TM взаимодействуют между собой для выполнения схемы протокола 2PC, "представляя" соответствующих участников и завершая транзакцию. Такая архитектура обеспечивает полную распределенность протокола (отсутствие централизованного компонента обработки или структуры данных) и эффективное масштабирование с ростом числа сетевых узлов (размера сети). Эта распространенная архитектура также эффективна для распределения других протоколов атомарной фиксации, помимо 2PC, поскольку все они используют один и тот же механизм голосования и распространения результатов участникам протокола. Предположение об исходе транзакции – фиксация или откат – может сократить количество передаваемых сообщений и операций записи в журнал, выполняемых участниками в процессе работы протокола 2PC. Например, при предполагаемом откате, если в ходе восстановления системы после сбоя процедура восстановления не обнаружит в журнале подтверждений фиксации какой-либо транзакции, она предполагает, что транзакция была отменена, и действует соответствующим образом. Это означает, что запись отката не обязательна, и ее можно избежать при таком предположении. Обычно восстановление после сбоя требует дополнительных операций, стоимость которых зависит от типа оптимизации. Таким образом, оптимальный вариант оптимизации, если он существует, выбирается на основе статистики сбоев и исходов транзакций.
Двухфазный протокол коммитации дерева
Протокол Tree 2PC является вариантом протокола Tree 2PC без предопределенного координатора. Он объединяет несколько ранее предложенных оптимизаций. Сообщения о достижении согласия (подтверждающие голоса) начинают распространяться от всех листьев дерева, каждый лист – после завершения своих задач в рамках транзакции (когда он становится готовым). Промежуточный (не листовой) узел отправляет сигнал готовности, когда получает сообщение о согласии от последнего (единственного) соседнего узла, от которого оно еще не поступило. Координатор определяется динамически в процессе "гонки" сообщений о согласии по дереву транзакций, в точке их столкновения. Столкновение может произойти либо в узле дерева транзакций, который становится координатором, либо на ребре дерева. В последнем случае один из двух узлов, соединенных этим ребром, избирается координатором (любой из узлов). D2PC является оптимальным по времени (для всех экземпляров конкретного дерева транзакций и любой реализации протокола Tree 2PC; все экземпляры используют одно и то же дерево; каждый экземпляр имеет различный узел в качестве координатора): выбирая оптимального координатора, D2PC обеспечивает фиксацию транзакции как для координатора, так и для каждого участника за минимально возможное время, что позволяет максимально быстро освободить заблокированные ресурсы у каждого участника транзакции (узла дерева).