Я не согласен с обоими другими ответами.
Multi-Paxos не говорит, что Лидер является единственным предложителем; это приведет к тому, что система будет иметь единственную точку отказа .Даже во время сетевых разделов система не сможет прогрессировать.Multi-Paxos - это оптимизация, позволяющая одному узлу ( Leader ) пропустить некоторые фазы подготовки.Другие узлы, считая, что лидер мертв, могут попытаться продолжить экземпляр от ее имени, но все равно должны использовать полный протокол Basic-Paxos.
Отсутствие сообщения о принятии нарушает алгоритм Paxos, Акцептор должен принимать все значения, если он не обещал не принять его. (Игнорирование разрешено, но не рекомендуется; это просто потому, что разрешены пропущенные сообщения.)
Существует также элегантное решение для этого.Проблема с номером раунда лидера (N + 1 в вопросе).
Вот некоторые предположения:
- У вас есть такая схемаидентификаторы не пересекаются во всех узлах (в любом случае требуется Paxos).
- У вас есть способ определить, какой узел является экземпляром Leader per Paxos (требуется Multi-Paxos).Лидер может переключаться с одного экземпляра Paxos на другой.Помимо: Парламент с частичной занятостью предполагает, что это сделано Лидером, выигравшим предыдущий инстанс Paxos (Раздел 3.1), и указывает, что она может оставаться Лидером, пока она жива или является самой богатой(Раздел 3.3.1).У меня есть явное значение ELECT_NEW_LEADER: , которое предлагается через Paxos.
- Лидер пропускает только фазу подготовки при начальном раунде на экземпляр;и использует полный Базовый Паксос в последующих раундах.
С этими допущениями решение очень просто.Лидер просто выбирает действительно низкий круглый идентификатор для начальной фазы принятия.Этот идентификатор (который я назову INITIAL_ROUND_ID) может быть любым, если он ниже, чем круглые идентификаторы всех узлов.В зависимости от выбранной вами схемы выбора идентификатора будет работать либо -1, 0, либо Integer.MIN_VALUE.
Это работает, потому что другой узел (я назову его Стюартом) должен пройти через полный протокол Paxos дляпредложить что-нибудь и его раунд ID всегда больше, чем INITIAL_ROUND_ID .Есть два случая, чтобы рассмотреть: достигли ли сообщения Принятия Лидера какого-либо из узлов, что сообщение Стюарта подготовило.
Когда фаза Принятия Лидера не достигла ни одного узла, Стюартне получит никакого значения в любом Обещании и может продолжаться так же, как в обычных Basic-Paxos.
И когда фаза принятия Лидера достигнет узла, Стюарт получит обратнозначение в обещании, которое используется для продолжения алгоритма, как в Basic-Paxos.
В любом случае, поскольку идентификатор раунда Стюарта больше, чем INITIAL_ROUND_ID, любые медленные сообщения Accept, которые узел получает от лидеравсегда приводит к Nack.
Специальной логики на Acceptor или Stewart нет.И минимальная специальная логика на Лидере (а именно, выберите действительно низкий INITIAL_ROUND_ID).
Обратите внимание, если мы изменим вопрос ОП на один символ, тогда сам ответ ОП будет правильным: Nack.
- получить: подготовить (N)
- ответить: обещание (N, ноль)
- получить: принять! (N, V1)
- ответить: принято(N, V1)
- получить: принять! ( N-1 , V2)
- ответить: Nack (N, V1)
Но в его нынешнем виде его ответ нарушает алгоритм Паксоса;должно быть Принять!
- получить: Подготовить (N)
- ответить: Обещание (N, ноль)
- получить: Принять! (N, V1)
- ответить: Принято (N, V1)
- Получить: Принять! ( N + 1 , V2)
- ответить: Принять! (N + 1, V2)