2012-06-29 3 views
5

Я читал 3-фазный протокол фиксации в википедии (http://en.wikipedia.org/wiki/Three-phase_commit_protocol), и вот сценарий, который пришел мне на ум, когда 3PC не удастся:3-фазный протокол фиксации

Предположим, что есть два участника A и B и координатор C:

1) C отправил сообщение precommit в A и до того, как он отправит сообщение precommit в B, оба A и C симулируют сбой. 2) Сделка теперь перезапускается, и B заканчивает ее прерывание, потому что нет ответа от A. 3) A совершает транзакцию, потому что она уже получила сообщение precommit.

Не было ли это также оригинальной проблемой в 2PC, которую должен был адресовать 3PC? Как 3PC решает проблему? Что мне не хватает. Благодарю.

ответ

2

Update:

ли участники не совершают то, пока они не получат сообщение doCommit от координатора?

После получения сообщения preCommit участники будут ждать сначала, и если произойдет тайм-аут, они просто перейдут к фиксации.

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

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

+0

Извините, я немного не понимаю эту часть протокола. Разве участники не фиксируют, пока они не получат сообщение doCommit от координатора? –

+0

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

+0

@AbdulRahman см. Мои обновления – xvatar

0

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

--cited из http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

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

0

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

  1. Отсутствие отказа сети (т.нет сетевого раздела, каждое сообщение доходит до адресата до таймаута, если работающая машина уничтожает (не сбой)

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

  3. Участник машины может различать таймаут и сбой (это не тривиально, подумайте, когда он сработает (т. Е. Электрический срез) сразу после таймаута , где он не мог ничего постоянного хранения написать, чтобы напомнить себе, что это был тайм-аут вместо аварии, когда он восстанавливается)

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

 Смежные вопросы

  • Нет связанных вопросов^_^