Skip to content

EPaxos (Egalitarian Paxos)

EPaxos — fast path без лидера

Обзор

EPaxos — leaderless-алгоритм консенсуса, разработанный Moraru, Andersen и Kaminsky в 2013 году. Главная идея: любой узел может предложить команду, и в отсутствие конфликтов коммит происходит за один round-trip (fast path). При конфликтах используется явное разрешение зависимостей (slow path, 2 RTT).

Ключевые особенности:

  • Нет лидера — все узлы равноправные реплики
  • Оптимальная латентность: 1 RTT в большинстве случаев (fast path)
  • Зависимости между конкурентными командами отслеживаются явно
  • Нет single point of contention (в отличие от Raft/Multi-Paxos)

Роли узлов

РольЦвет в симулятореМеткаПоведение
Replica🔵 синийRВсе узлы равны; каждый может предлагать и принимать команды

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

Instances (экземпляры)

Каждое предложение создаёт instance — уникальный экземпляр консенсуса, идентифицируемый парой (replicaId, instanceNumber):

instanceKey = "node_2:5"  →  5-я команда, предложенная node_2

Каждый instance отслеживает:

  • command — предложенная команда
  • seq — порядковый номер (для упорядочивания)
  • deps — список зависимостей (instance keys конфликтующих команд)
  • statuspre-acceptedacceptedcommitted

Fast Path (1 RTT) — без конфликтов

Когда нет конфликтов (все реплики согласны по зависимостям):

Fast quorum

Для fast path требуется fast quorum⌊N/2⌋ + 1 узлов (включая предлагающую реплику).

Кластер (N)Fast quorumОбычный majority
322
533
744

Slow Path (2 RTT) — при конфликтах

Когда реплики не согласны по зависимостям (конфликт):

Что считается конфликтом

В симуляции используется упрощённое определение конфликта: любой uncommitted instance от другой реплики считается конфликтом. В оригинальном EPaxos конфликт определяется пересечением ключей (key sets) команд.

Визуальные отличия в симуляторе

ЭлементФормаЦвет
PreAccept (fast path)🔺 треугольникзелёный
Accept (slow path)🔷 ромбфиолетовый
Commit🟢 кругзелёный

На замедленной скорости хорошо видно:

  • Без конфликтов: треугольники летят от реплики к остальным → обратно → кружки коммита
  • С конфликтами: после треугольников появляются фиолетовые ромбы Accept → затем кружки коммита

Сравнение латентности

Basic Paxos:  Prepare → Promise → Accept → Accepted = 2 RTT (всегда)
Multi-Paxos:  Accept → Accepted = 1 RTT (после выборов)
Raft:         AppendEntries → Response = 1 RTT (через лидера)
EPaxos:       PreAccept → PreAcceptOK = 1 RTT (fast path, без лидера!)
              + Accept → AcceptOK     = 2 RTT (slow path, при конфликтах)

Обработка отказов

Отключение реплики

Остальные реплики продолжают работать — нет лидера, нечему «упасть». Клиент просто переключается на другую реплику. Потерянная реплика не блокирует прогресс, пока есть кворум.

Восстановление

При восстановлении узел получает Commit сообщения с пропущенными committed записями от лучшего живого peer-а.

Отклонения от оригинального алгоритма

АспектОригинал (Moraru et al.)Симуляция
Определение конфликтаПересечение key sets командЛюбой uncommitted instance от другой реплики
Execution orderingTarjan's SCC для графа зависимостейНе реализовано; порядок по времени получения
Explicit PrepareВосстановление через explicit prepareНе реализовано
Thrifty optimizationОтправка только fast quorum репликОтправка всем репликам
PipeliningНесколько instances параллельноОдин active instance за раз на реплику
Persistent stateInstance state на дискеТолько в памяти

Источники

  1. Moraru I., Andersen D., Kaminsky M. "There is more consensus in Egalitarian Parliaments" (2013) — ACM SOSP
  2. Moraru I., Andersen D., Kaminsky M. "A Proof of Correctness for Egalitarian Paxos" (2013) — CMU Technical Report

Попробуйте в симуляторе

Откройте симулятор, поставьте рядом EPaxos и Raft. Отправьте команду в каждый — EPaxos закоммитит за 1 RTT без лидера, Raft потребует 1 RTT но через единственного лидера. Отключите узел в EPaxos — остальные продолжат работать без перевыборов.