Как Raft работает с задержанными ответами в AppendEntries RPC? - PullRequest
1 голос
/ 20 июня 2019

При чтении бумаги Плот у меня возник один вопрос. Сценарий сопровождается. Есть 3 недавно запущенных экземпляра Плот, R1, R2, R3. R1 выбран в качестве лидера, с nextIndex {1, 1, 1}, matchIndex {0, 0, 0} и термином 1. Теперь он получает команду 1 от клиента, и журналы экземпляров выглядят следующим образом:

R1: [index 0, command 0], [index 1, command 1]
R2: [index 0, command 0]
R3: [index 0, command 0]

Что делать, если сеть ненадежна? Если R1 отправляет этот журнал на R2, но RPC AppendEntries истекает, ведущий R1 должен повторно отправить [index 1, команда 1] снова. Затем он может получить ответы {термин: 1, успех: правда} дважды.

В статье написано:

If last log index ≥ nextIndex for a follower: send AppendEntries RPC with log entries starting at nextIndex
• If successful: update nextIndex and matchIndex for follower (§5.3)
• If AppendEntries fails because of log inconsistency: decrement nextIndex and retry (§5.3)

Таким образом, лидер R1 будет увеличивать nextIndex и matchIndex в два раза: nextIndex {1, 3, 1}, matchIndex {0, 2, 0}, что неверно. Когда ведущий отправляет следующий RPC AppendEntries, то есть биение или репликацию журнала, он может исправить следующий индекс, но у matchIndex никогда не будет возможности исправить это.

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

Любой совет будет оценен и заранее благодарен.

1 Ответ

2 голосов
/ 20 июня 2019

Протокол предполагает наличие некоторого контекста в отношении , на который AppendEntries RPC отвечает ответчик.Таким образом, на некотором уровне должен быть порядковый номер (или, точнее, идентификатор корреляции), будь то на уровне протокола, на уровне обмена сообщениями или в самом приложении.У лидера должен быть какой-то способ соотнести запрос с ответом, чтобы определить , какой индекс признает подписчик.

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

...