Я изучаю алгоритм Raft. Моя реализация соответствует следующей ситуации:
- 1-лидер-1-последователь установлена;
- выключить лидера;
- последователь не получает пульса, поэтому становится кандидат;
- кандидат продолжает отправлять запрос VoteRequest партнеру (уже отключен) и терпит неудачу;
- тайм-аут выборов без избранного лидера;
- кандидат начинает другую сессию кандидата, фактически повторяется 4 -6 ...
Я не вижу, как решить эту ситуацию в документах Raft (возможно, я что-то пропустил).
По-моему, я могу проверить предоставленные голоса по шагам -5 перед началом новых выборов. Поскольку кандидат голосует за себя в начале избирательной сессии, поэтому в этой проверке кандидат станет новым лидером.
Но я беспокоюсь, что это решение сломает Raft, особенно нарушит начальный процесс, когда все узлы кандидаты.
Другая идея состоит в том, чтобы трактовать сетевую ошибку запросов RequestVote как «Голосование разрешено». (все еще волнуйтесь, сломается ли он что-нибудь)
Я знаю, что эта ситуация может быть вызвана «всего двумя узлами». Однако даже если есть 3 узла (так что установлена ситуация 1-лидер-2-ведомый), тогда, если 2 лидера, соответственно, отключены, оставшийся ведомый все еще может вести себя так.