Как Narayana/XA восстанавливается после сбоев TM?

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

В1: Использует ли Нараяна, по сути, двухфазную фиксацию для обеспечения распределенных транзакций между двумя источниками данных?

Q2: Может кто-нибудь объяснить поведение Нараяны в этом сценарии?

  1. Приложение хочет сохранить Х в 2 хранилища данных
  2. Менеджер транзакций Нарайаны (TM) генерирует идентификатор транзакции и записывает информацию на диск
  3. ТМ теперь отправляет сообщение о подготовке в оба хранилища данных
  4. Каждое хранилище данных отвечает с prepare_success
  5. TM обновляет локальный журнал транзакций и отправляет сообщение о фиксации в оба хранилища данных
  6. ТМ не работает (навсегда). А из-за потери пакетов в сети только одно хранилище данных получает сообщение о фиксации. Но другие хранилища данных получают и успешно обрабатывают сообщение фиксации.

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

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

Так как же 2PC/Narayana/XA заявить, что они гарантируют распределенные транзакции, которые могут поддерживать синхронное хранение двух хранилищ данных? С моей точки зрения, они могут поддерживать синхронные хранилища данных только с очень высокой вероятностью, но не могут этого гарантировать.

Q3: еще один сценарий, в котором мне неясно, как работает приложение / фреймворк. Рассмотрим следующие чередующиеся транзакции (обе для одной и той же записи или, по крайней мере, с частично перекрывающимся набором записей):

  • Di = источник данных я
  • Ti = транзакция i
  • Pi = подготовить сообщение для транзакции i

D1 получает P1; отвечает P1_success

D2 получает P2; отвечает P2_success

D1 получает P2; отвечает P2_failure

D2 получает P1; отвечает P1_failure

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

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

1 ответ

Решение

Я хотел бы отослать вас к моей статье о том, как работает Narayana 2PC https://developer.jboss.org/wiki/TwoPhaseCommit2PC

На ваши вопросы

Q1: вы уже упоминали, что в комментарии - да, Нараяна использует 2PC = Нараяна реализует спецификацию XA (pubs.opengroup.org/onlinepubs/009680699/toc.pdf).

Q2: шаги в сценарии не точны. Нараяна записывает данные на диск во время вызова методики подготовки, а не во время запуска транзакции.

  1. Приложение сохраняет X в 2 хранилища данных
  2. ТМ теперь отправляет сообщение о подготовке в оба хранилища данных
  3. Каждое хранилище данных отвечает с prepare_success
  4. ТМ постоянно сохраняет информацию о подготовленной транзакции и ее ID в хранилище журнала транзакций.
  5. TM отправляет сообщение о фиксации в оба хранилища данных
  6. ...

Я не согласен с тем, что 2PC утверждает, что гарантирует синхронизацию двух хранилищ данных. Мне тоже было интересно об этом (например, спросили здесь https://developer.jboss.org/message/954043). 2PC утверждает, что гарантирует свойства ACID. Синхронизация двух магазинов - это то, что соответствует согласованности CAP.

При этом Нараяна строго зависит от возможностей конкретных менеджеров ресурсов (хранилищ данных или драйверов хранилищ данных jdbc). КИСЛОТА объявляет

  • атомарность - вся транзакция фиксируется или откатывается (нет информации, когда это происходит, нет информации о синхронизируемых ресурсах)
  • согласованность - до и после завершения транзакции система находится в согласованном состоянии
  • долговечность - все сохраняется даже при сбое
  • изоляция - (хитрый, оставленный в конце) - для того, чтобы быть ACID, мы должны быть сериализуемыми. То есть вы можете наблюдать за транзакциями, происходящими "одна за другой". Если я возьму довольно упрощенный пример, чтобы показать мою точку зрения - ожидая, что БД будет реализована наивным способом блокировки всей базы данных при запуске транзакции - вы передали сообщение jms, которое было обработано, а теперь вы не зафиксировали запись базы данных. Когда DB работает на уровне сериализуемой изоляции (это то, что требуется ACID!), Тогда ваша следующая операция записи / чтения должна ждать, пока транзакция "в полете подготовлена" не будет разрешена. БД просто застряла и ждет. Если вы читаете, вы не получите ответ, поэтому вы не можете сказать, какова ценность. Менеджер восстановления Нараяны затем приходит к этой подготовленной транзакции после установления соединения и фиксирует ее. И вы читаете действие возвращает информацию, которая является "правильной".

Q3: я не понимаю вопроса, извините. Но если вы заявите, что The order in which the network packets arrive at the different data sources can determine which prepare request succeeds. тогда вы правы, вы обречены на провал транзакции, пока сеть не станет более стабильной.

Другие вопросы по тегам