Вопросы по реализации Paxos - PullRequest
14 голосов
/ 01 мая 2011

Я внедряю Paxos в приложение имитатора кластера, используя документацию, доступную в Wikipedia . К сожалению, он оставляет несколько дверей для интерпретации и не дает много информации по ключевым вопросам реализации. Непонятно и неполно.

  • Предполагается, что кластер разделен на 3 региона, каждый из которых содержит 3 узла (всего = 9 узлов). Что произойдет, если нарушится связь между регионами? Ни один лидер не может достичь кворума (то есть 5).

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

  • На Фазе 1b: ' Если номер предложения N больше, чем какое-либо предыдущее предложение, то каждый Акцептор обещает не принимать предложения меньше, чем N, и отправляет значение, которое он в последний раз принял для этот экземпляр для Proposer '.

Что такое «последнее принятое значение»? Это какой-либо предыдущий номер предложения от заявителя? Что именно означает «экземпляр» в данном случае?

  • На Фазе 1a: Включено ли значение, которое нужно согласовать с сообщением Подготовить, или оно отложено до Принять! сообщение? Или это имеет значение?

  • На Фазе 2a: ' Если какой-либо из Акцепторов уже принял значение, лидер должен Выбрать значение с максимальным номером предложения N '.

Какое значение здесь? Это номер предложения? Я не верю, но эта фраза неясна.

  • На Фазе 2a: «В противном случае, Proposer может выбрать любое значение». Что это значит? Значение для чего? Для номера предложения?

  • Паксос, кажется, полагается на возрастающее значение N (номер предложения) для работы? Это правильно?

  • В записи в Википедии не обсуждаются начальные значения, которые узел должен установить перед началом участия в Paxos. Что это?

P.S .: У меня недостаточно репутации, чтобы создать тег «Paxos» (любой волонтер?)

Ответы [ 3 ]

18 голосов
/ 14 апреля 2012

Что такое экземпляр?

Номенклатура в Паксосе немного неинтуитивна.

  • экземпляр - алгоритм длявыбор значения one .
  • A round относится к единственной попытке заявителя на этапе 1 + этап 2. Узел может иметь несколько этапов в случае в Паксосе.Идентификатор раунда является глобально уникальным для каждого экземпляра всех узлов.Это иногда называют номером предложения .
  • Узел может выполнять несколько ролей;наиболее заметно, Proposer и Acceptor.В своих ответах я предполагаю, что каждый узел выполняет обе роли.
  • Этап 1 также известен как этап подготовки.
    • На Фазе 1a, Proposer отправляет акцепторам сообщение Prepare! (RoundId)
    • На Фазе 1b акцепторы отвечают либо Promise! (RoundId, value), либо PrepareNack! ()
  • Фаза 2 также известна как фаза принятия.
    • На Фазе 2a, Proposer отправляет сообщение Accept! (RoundId, value) акцепторам
    • На Фазе 2b, Acceptors отвечает либо Accepted! (...), либо AcceptNack!()

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

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

Не собирается ли Paxos войти в бесконечный цикл?

Наивная реализация Paxos не гарантированно завершится, поскольку несколькоузлы могут перепрыгнуть, подготовить фазы.Есть два способа обойти это.Одним из них является случайный откат перед началом новых этапов подготовки.Второе - направить все запросы назначенному лидеру, который выступает в качестве предлагающего (Лидер выбирается экземпляром Paxos. См. Также Multi-paxos)

На этапе 1b: «Еслиномер предложения N больше, чем любое предыдущее предложение, тогда каждый >> Акцептор обещает не принимать предложения меньше N и отправляет значение, которое он в последний раз принял для >> этого экземпляра, Предлагателю '.

Что такое «последнее принятое значение»?Это какой-либо предыдущий номер предложения от предлагающего?

Когда узел получает сообщение Accept! (RoundId, value) от Proposer и , он не обещал не приниматьзначение (из-за сообщения Prepare! (upperRoundId)), оно хранит значение и roundId (я назову их acceptedValue и acceptedRoundId).Он может перезаписывать их из-за последующих сообщений Accept! (...).

Когда узел получает сообщение Prepare! (RoundId) от Proposer, он сохраняет roundId как promiseRoundId = max(roundId, promiseRoundId).Затем он отправляет Promise!(acceptedRoundId, acceptedValue) обратно Proposer.Примечание: если узел не получил сообщение Accept! (...), он отвечает Promise!(null, null).

На этапе 1a: Включает ли одно значение для согласования с Prepare?сообщение или это отложено до принятия!сообщение?Или это имеет значение?

Не нужно его отправлять.Не знаю.

На Фазе 2a: «Если кто-либо из Акцепторов уже принял значение, лидер должен выбрать значение с максимальным номером предложения N».

В чем здесь ценность?Это номер предложения?Я не верю, но эта фраза неясна.

Значение - это фактические данные, по которым алгоритм достиг консенсуса.Я перефразирую это к

Чтобы начать фазу принятия, Организатор должен выбрать значение, которое будет принято, в зависимости от результатов фазы Подготовки. Если какой-либо Акцептор ответил с Promise (roundId, value), Proposer должен использовать значение, связанное с самым высоким roundId. В противном случае, Proposer получил только Promise (null, null) и может выбрать любое значение для отправки получателям.

Примечание: номер предложения здесь совпадает с номером раунда.

На Фазе 2a: «В противном случае, Proposer может выбрать любое значение». Что это значит? Значение для чего? Для предложения номер?

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

Паксос, кажется, полагается на возрастающее значение N (номер предложения) для работы? Это правильно?

В записи в Википедии не обсуждаются начальные значения, которые узел должен установить перед началом участия в Paxos. Что это?

Идентификаторы раунда (иначе номера предложений) должно увеличиваться, а должно быть уникальным для каждого экземпляра во всех узлах. В документе Paxos предполагается, что вы можете сделать это, потому что это тривиально. Вот одна схема, которая дает одинаковые результаты на всех узлах:

  1. Скажем, есть M узлов, участвующих в экземпляре Paxos.
  2. Сортировка всех узлов лексикографически. index [узел] - это индекс узла в этом отсортированном списке.
  3. roundId = i*M + index[node] где i - i-й раунд, с которого начинается этот узел (то есть я уникален для каждого узла на экземпляр paxos и монотонно увеличивается).

Или в псевдокоде (которому явно не хватает нескольких основных оптимизаций):

define runPaxos( allNodesThisPaxosInstance, myValue ) {
    allNodesThisPaxosInstance.sort()
    offset = allNodesThisPaxosInstance.indexOf( thisNode )
    for (i = 0; true; i++) {
        roundId = offset + i * allNodesThisPaxosInstance.size()
        prepareResult = doPreparePhase( roundId )

        if (!prepareResult.shouldContinue?)
            return

        if (prepareResult.hasAnyValue?)
           chosenValue = prepareResult.valueWithHighestRoundId
        else
            chosenValue = myValue

        acceptResult = doAcceptPhase( roundId, chosenValue )

        if (!acceptResult.shouldContinue?)
            return
    }
}
2 голосов
/ 01 мая 2011

Я нашел следующий документ , объясняющий Паксос более подробно.Я обновил запись в Википедии соответственно.

Ответы на мой вопрос, которые я смог найти:

Не собирается ли Паксос войти в бесконечный цикл?

Паксос работает только приКак минимум кворум узлов может общаться друг с другом (в нашем случае 5).Следовательно, если узел не может связаться хотя бы с кворумом узлов, ему не следует пытаться использовать Paxos.

Что такое «последнее принятое значение»?

Этоэто последний принятый номер предложения и соответствующее значение.

Что именно означает «экземпляр» в данном случае?

Это относится к акцептору.

Содержит ли значение для согласования с сообщением Подготовка, или оно отложено до Принять!сообщение?Или это имеет значение?

Значение не включено в сообщение Prepare, оно оставляется в сообщении Accept Request.

Какое значение здесь?Это номер предложения?Я не верю, но эта фраза неясна.

«В противном случае, Предлагатель может выбрать любое значение».Что это значит?Значение для чего?Для номера предложения?

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

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

Паксос, кажется, полагается на возрастающее значение N (номер предложения) для работы?Это правильно?

Да.Заявитель p должен все больше нумеровать свои предложения.

В записи в Википедии не обсуждаются начальные значения, которые должен установить узел перед началом участия в Paxos.Что это такое?

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

0 голосов
/ 27 апреля 2013
Paxos seems to rely on an increasing value of N (proposal number) to work? Is this correct?

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

...