При чтении бумаги Плот у меня возник один вопрос. Сценарий сопровождается. Есть 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. Однако мне было интересно, есть ли способ решить эту проблему только с помощью аргументов, приведенных в статье, то есть без порядкового номера.
Любой совет будет оценен и заранее благодарен.