как последователь рафта снова присоединяется к сети после отключения сети?

У меня проблема с плотом.

В статье «В поисках понятного алгоритма консенсуса (расширенная версия)» говорится:

Чтобы начать выборы, последователь увеличивает свой текущий срок и переходит в состояние кандидата. (в разделе 5.2)

и также говорится:

получатель должен иметь значение «Ответить ложно, если args.term‹ currentTerm »в AppendEntries RPC и RequestVot RPC

Итак, давайте представим эту сцену, есть 5 машин в системе плотов, и теперь машина 0 является лидером, машины с 1 по 4 - ведомыми, теперь это член 1. Внезапно машина 1 отключается от сети, а затем машина 1 истекает по таймауту, и он начинает выборы лидера, он отправляет RequestVot RPC, уверен, что это будет неудачно (сеть отключена). а потом начнутся выборы нового лидера ....... и так далее. Срок действия машины 1 увеличивается во много раз. Возможно увеличение до 10. Когда машина 1'Term увеличивается до 10, она подключается к сети. и ведущий (машина 0) отправляет сердцебиение на машину 1, а машина 1 ОТКЛЮЧАЕТ это сердцебиение (время машины 0 меньше, чем у машины 1), и теперь машина 1 не сможет повторно присоединиться к системе.


person loin.liao    schedule 30.11.2017    source источник


Ответы (1)


Здесь важно помнить, что когда узел получает больший термин, он всегда обновляет свой локальный термин. Итак, поскольку машина 1 отклонит запрос лидера, лидер в конечном итоге узнает о более высоком члене (10) и уйдет в отставку, тогда новый узел будет выбран на срок> 10.

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

person kuujo    schedule 30.11.2017