Противоречие в простой бумаге Лампорта «Паксос»

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

Как упоминалось в статье,

Претендент выдает предложение, отправляя некоторому набору акцепторов запрос о принятии предложения. (Это не обязательно должен быть тот же набор приемников, которые ответили на первоначальные запросы.) "

Но, как я понимаю, если мы изменим Фазу 2 (а) на:

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

алгоритм не сработает, следующий пример. Учтите, что всего существует 3 акцептора ABC. Мы будем использовать X (n: v, m) для обозначения статуса акцептора X: предложение n: v - это предложение с наибольшим номером, принятое X, где n - номер предложения, v - значение предложения, а m - номер самого большого пронумерованного запроса на подготовку, на который X когда-либо ответил.

  1. P1 отправляет «подготовить 1» к AB
  2. Оба AB отвечают P1 обещанием не принимать запросы с номерами меньше 1. Теперь статус: A (-: -, 1) B (-: -, 1) C (-: -, -)
  3. P1 получает ответы, затем застревает и работает очень медленно
  4. P2 отправляет команду AB «приготовить 100»
  5. Оба AB отвечают P2, обещая не принимать запросы с номерами меньше 100. Теперь статус: A (-: -, 100) B (-: -, 100) C (-: -, -)
  6. P2 получает ответы, выбирает значение b и отправляет BC accept 100: b.
  7. BC принимает и принимает запрос принятия, статус: A (-: -, 100) B (100: b, 100) C (100: b, -). Обратите внимание, что было выбрано предложение 100: b.
  8. P1 возобновляет работу, выбирает значение a и отправляет «accept 1: a» в BC
  9. B не принимает это, но C принимает это, потому что C никогда ничего не обещал. Статус: A (-: -, 100) B (100: b, 100) C (1: a, -). Выбранное предложение - отказаться, Paxos терпит неудачу.

Я что-то здесь пропустил? Спасибо.


person lambda    schedule 26.04.2015    source источник
comment
Браво! Если бы я мог, я бы дал несколько голосов за этот вопрос.   -  person Michael Deardeuff    schedule 28.05.2015
comment
да, вы действительно правы, и да, это ошибка в реализации multipaxos, над которой я работаю. Благодарность!   -  person simbo1905    schedule 14.06.2015
comment
Ваше описание почти правильно, но оно основано на слишком простом неправильном понимании свойства уникальности идентификаторов предложений / круглых чисел. Каждый идентификатор предложения / номер раунда должен быть уникальным. Повторное использование запрещено или возможно точное состояние, которое вы описываете. См. Мой ответ для получения дополнительной информации.   -  person Rakis    schedule 24.04.2016
comment
@rakis - Я не согласен с утверждением, что номера предложений должны быть уникальными для всех предлагающих. Если они гарантированно уникальны, это гарантирует живучесть алгоритма paxos. Но не обязательно, чтобы они были уникальными. Paxos сохраняет свои свойства безопасности, даже если они не уникальны. Но это не гарантирует жизнеспособность, если номера предложений не уникальны. В динамической среде, где предлагающие приходят и уходят, невозможно статически присвоить предлагающим уникальные номера предложений. В такой среде присвоение этих уникальных номеров само по себе становится проблемой консенсуса. Кроме того, присвоение un   -  person seattlesparty    schedule 10.03.2017
comment
9. C не примет его, потому что n = 1 меньше n = 100. Учитываются как принятый, так и обещанный номер. принимать только если ‹n &&‹ m, оба должны встретиться.   -  person ideawu    schedule 20.04.2020
comment
@seattlesparty всегда ли можно назначать уникальные номера предлагающим (и, следовательно, предложениям), если вы используете сам Paxos для управления конфигурацией кластера. Использование самого Paxos для управления реконфигурацией кластера упоминается в исходных документах. Вам нужно только статически определить числа предлагающих для гениального состояния кластера. Чтобы узнать о современных возможностях непрерывной реконфигурации кластера, посетите «UPaxos».   -  person simbo1905    schedule 24.05.2020


Ответы (7)


Вы что-то пропустили на шаге 7. Когда C обрабатывает accept 100:b, он устанавливает свое состояние в C(100:b,100). Принимая значение, узел также обещает не принимать более ранние значения.


Обновление. Я думал об этом весь месяц, потому что знал, что приведенный выше ответ был не совсем правильным.

Более того, я просмотрел несколько проприетарных реализаций paxos с открытым исходным кодом, и все они содержали ошибку, отправленную OP!

Итак, вот правильный ответ, если смотреть полностью из Paxos Made Simple:

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

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

Итак, противоречие ли в статье Лэмпорта? Прямо сейчас я говорю да.


Если вы посмотрите на доказательства paxos Лампорта, он рассматривает accept как promise, как и предполагает мой первоначальный ответ. Но это не указано в Paxos Made Simple. Фактически, похоже, Лэмпорт приложил большие усилия, чтобы указать, что accept не является promise.

Проблема в том, что вы объединяете более слабые части обоих вариантов; как это сделал OP и несколько реализаций. Тогда вы столкнетесь с этой катастрофической ошибкой.

person Michael Deardeuff    schedule 28.04.2015
comment
Спасибо, вы правы, если принимая значение, узел также обещает не принимать более ранние значения, алгоритм верен, но в статье Лампорт не упомянул об этом требовании, верно? - person lambda; 29.04.2015
comment
Этот ответ, по-видимому, упоминается в лекции Лесли Лэмпорта в 2019 году с этого момента в видео youtu. be / 8-Bc5Lqgx_c? t = 4398 В том же видео член аудитории спрашивает, почему в спецификации TLA + акцептор дает обещание при получении сообщения 2a здесь по адресу youtu.be/8-Bc5Lqgx_c?t=4200 - person simbo1905; 27.05.2020
comment
@ simbo1905, что, по сути, является отсылкой к беседе по электронной почте, которую я вел с Лампортом в 2015 году после того, как написал этот ответ, а затем потратил неделю или больше на копание с открытым исходным кодом и проприетарными реализациями paxos - person Michael Deardeuff; 27.05.2020

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

Однако в вашем контрпримере есть ошибка. Во-первых, обозначение определяется так:

X(n:v,m) для обозначения статуса принимающей стороны X: предложение n:v - это предложение с наибольшим номером, принятое X

Но затем на шаге 7 узел C имеет состояние C(100:b,-), а затем на шаге 9 он изменяется на состояние C(1:a,-). Это недопустимый переход: после принятия 1:a он должен оставаться в состоянии C(100:b,-), поскольку 100:b по-прежнему является предложением с наибольшим номером, принятым C.

Обратите внимание: это нормально, что он принимает 1:a после 100:b, по сути потому, что сеть является асинхронной, поэтому все сообщения могут быть отложены или переупорядочены, ничего не нарушая, поэтому остальной мир в любом случае не может сказать, какое предложение было принято первым.

person Dave Turner    schedule 13.12.2016
comment
Я согласен. Новый P после шага 9 должен видеть только C(100:b,_). Принятый ответ не принимает 1:a, дав обещание 100 при принятии 100:b. Реализации могут отправлять отрицательные подтверждения, содержащие самые высокие обещания, чтобы ускорить восстановление. Если в соответствии с принятым ответом мы обещаем 100 после принятия 100:b, мы ответим отрицательно на последующий 1:a, сообщив предложению, что в нем не используется число, превышающее наибольшее из принятых. Для меня это упрощает понимание того, что произошло, в журналах. Однако этот ответ более точен. - person simbo1905; 13.12.2016
comment
Верно - вероятно бессмысленно принимать 1:a после 100:b, поэтому, возможно, имеет смысл принимать предложения только в порядке возрастания и в противном случае отправлять NACK, даже если это не влияет на правильность. Помните, что сеть асинхронна, поэтому, даже если вы отправите 1:a, а затем 100:b, остальной мир может разумно увидеть, что вы отправляете их в другом порядке. - person Dave Turner; 13.12.2016
comment
Эмм. Вы говорите, что состояние C (100: b, -) действительно, и C может обещать принять предложение с номером 1, но когда он получает предложение, он должен «принять» его, а затем проигнорировать? - person Rich N; 14.05.2018
comment
C не отправляет никаких обещаний в приведенном выше сценарии, поэтому я не совсем понимаю вопрос. Приняв предложение номер 100, оно не может дать обещание по предложению номер 1, но здесь происходит не это. Если это помогает, обещание принять предложение - неправильный способ думать об этом, это больше похоже на обещание отклонить все предложения с меньшим номером. - person Dave Turner; 21.05.2018
comment
@Dave Приняв предложение № 100, он не может давать обещание в предложении № 1 ‹- этого не требует формулировка в Paxos Made Simple. - person MuchToLearn; 23.05.2019
comment
Это должен быть принятый ответ ИМО. Принятие предложения не означает, что он может заменить или забыть более ценное предложение. - person MuchToLearn; 18.06.2019

NECROBUMP. Даже с более слабой частью обоих вариантов несоответствия нет. Давайте посмотрим на шаг 9 в примере в вопросе:

«Состояние - A (-: -, 100) B (100: b, 100) C (1: a, -). Выбранное предложение отвергнуто, Paxos терпит неудачу»

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

Для продолжения протокола нам нужны новые бюллетени, и в конечном итоге будут приняты новые бюллетени. Этот бюллетень должен иметь значение "b",

ДОКАЗАТЕЛЬСТВО: C ответит (100, 'b') на любые запросы на подготовку, поскольку принятый им бюллетень с наивысшим номером равен (100, 'b'), даже если он последним принял бюллетень (1, 'а'). B также ответит (100, 'b'). Следовательно, больше невозможно получить мажоритарный бюллетень с любым значением, кроме «b».

Язык Лампорта таков, что акцептант ответит: «Предложение с наибольшим числом меньше n, которое он принял, если таковое имеется».

В принятом ответе «самый высокий номер» путается с «последним принятым», поскольку пример показывает, что акцептор может принимать значения в порядке убывания нумерации. Чтобы полностью согласоваться с протоколом Лампорта, C необходимо помнить, что он ответил на (100, 'b'), даже если «последнее» принятое им принятие - (1, 'a').

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

person Ben Braun    schedule 21.04.2016
comment
Дополнительный момент, который, возможно, стоит упомянуть, заключается в том, что если было сделано новое предложение и A ответил (100, ~), а C ответил (1, a), а B не ответил, вместо этого можно было бы достичь консенсуса по значению 'a' . Точка зрения Бена остается в силе, нет противоречия, но проницательный читатель может задаться вопросом по этому поводу. Предыдущие раунды не смогли достичь консенсуса по поводу «a» или «b», но последующие раунды могут идти в любом направлении, в зависимости от того, какие партнеры ответят. - person Rakis; 04.05.2016
comment
@Rakis Я могу вас неправильно понять, но в исходном сценарии, приведенном в вопросе, решение b решается, как только происходит шаг 7 (учащийся может выучить b сразу после этого шага). После этого момента изменение значения консенсуса на a больше не приемлемо. Я считаю, что если сделано новое предложение, C не может ответить (1, a), так как тогда возникает несогласованность. Но это не проблема, поскольку протокол указывает, что C должен ответить предложением с самым большим номером, которое он принял (100, b), что, как ни удивительно, может быть не последним предложением, которое он принял (1, a). - person Ben Braun; 08.07.2016
comment
Я в недоумении по этому поводу. Акцептатор, который принял (100, b), никогда не должен принимать бюллетень с меньшим номером, например (1, a). Чтобы сообщение Accept для (100, b) было отправлено, предлагающий ДОЛЖЕН уже получить большинство обещаний, поэтому бессмысленно заменять более поздний шаг предыдущим, независимо от того, обещал акцептор или нет. Однако я не могу найти это прямо заявлено в статье. Заставляет меня задуматься, не скучаю ли я по нему просто так. Невозможно доказать правильность Paxos без защиты от этого; как показывает вопрос. - person Rakis; 10.07.2016
comment
Кажется, это обычное недоразумение. Приняв предложение, акцептант может спокойно принять более раннее при условии, что он не нарушит ранее данных обещаний. Подтверждение правильности не требует отправки акцептов в каком-либо определенном порядке; на самом деле это невозможно, потому что он разработан для обеспечения безопасности, даже если сообщения переупорядочиваются произвольно. В действительности нет смысла принимать предложения вне очереди, но это никак не влияет на безопасность. - person Dave Turner; 13.12.2016

В документе действительно есть двусмысленность, поэтому для реализации алгоритма следует использовать спецификацию TLA +, а не документ.

Принимая значение, акцептор должен еще раз обновить свое состояние, а именно последний обещанный бюллетень. Это ясно из спецификации Paxos TLA +, проверьте Фаза 2b, на которой акцептор обновляет maxBal, и сравните с фазой 1b, где он делает то же самое.

Лесли Лэмпорт отвечает на этот вопрос в своей недавней лекции, где объясняет, что это сделано специально для того, чтобы набор приемников отличался от набора узлов, обещающих голосование.

person Kostja    schedule 07.04.2020
comment
Спасибо, что поделились этими лекциями. Это, вероятно, лучший ответ для тех, кто пытается написать или проверить реализацию. - person simbo1905; 26.05.2020
comment
В этой лекции Лэмпорт говорит, что maxBal обновляется при получении сообщения о подготовке: youtu. be / 8-Bc5Lqgx_c? t = 3153 Здесь maxBal обновляется при получении сообщения о принятии: youtu.be/8-Bc5Lqgx_c?t=3887 - person simbo1905; 27.05.2020

C не может принять предложение, поскольку он не прошел Фазу 1. IOW, чтобы значение было принято акцептором, акцептор должен пройти через обе фазы протокола.

person sparty    schedule 24.01.2017
comment
Я не понимаю, как вы могли бы сделать такой вывод из лечения в Paxos Made Simple. Фаза 1 относится только к тому, что индивидуальный предлагающий получает достаточно ответов из набора S, соответствующего некоторому большинству принимающих. - person MuchToLearn; 23.05.2019

если, принимая значение, узел также обещает не принимать более ранние значения, алгоритм верен, но в статье Лампорт не упомянул об этом требовании, верно?

Вышеупомянутое условие не требуется. Предположим, что наибольшее количество баллов, которые обещал акцептор, - X. Предположим, входящее сообщение о принятии имеет номер бюллетеня Y. Если Y ‹X, мы знаем, что Y должен быть отклонен. Если Y> X, это означает, что принимающая сторона не получила запрос на подготовку для Y. Это означает, что мы получили недопустимое сообщение paxos. В этом случае сообщение о принятии для Y следует отбросить.

Единственное исключение из этого - когда Y == 0. В этом случае выдача подготовки с номером бюллетеня 0 не имеет смысла, поскольку номера бюллетеней ниже 0 недействительны. Таким образом, этап 1 может быть пропущен для бюллетеня 0, и предлагающий может напрямую перейти к этапу 2. В этом случае, т.е. когда Y == 0, акцептор может принять значение только в том случае, если он не принял значение. Это то же самое, что вы предлагаете выше, но это требуется только в оптимизированной версии Paxos, где этап 1 можно пропустить для Y == 0.

IOWs, единственный раз, когда акцептор принимает значение, - это когда Y == X. Единственное исключение - когда Y == 0. В этом случае акцептор может принять значение, только если он не принял значение.

person seattlesparty    schedule 13.03.2017

Я согласен с большей частью ответа Бена Брауна.

Для C нормально принять (1, a), это не меняет выбранное значение. Допустим, C принял (1, a), и мы посмотрим на историю принятия с точки зрения учащегося.

(100, b) принято B и C
(1, a) принято C

(100, б) выбрано, так как оно принимается большинством акцепторов.

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

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

обновление: я также согласен с Дэйвом Тернером в том, что на самом деле нет причин принимать предложение с меньшим номером. Номер предложения похож на логические часы, старые сообщения можно игнорировать.

person Siyuan Xiang    schedule 15.09.2017