На выборах Raft кандидат получил голос узла, чей последний термин журнала выше. Какой вывод следует сделать о корректности выборов?
Такое голосование нарушает правило Raft: узел не должен голосовать за кандидата с менее актуальным журналом. Если голос действительно был отдан при более высоком последнем терме у кандидата, это указывает на ошибку реализации или неверное понимание состояния журнала. Корректный кластер не должен считать такие выборы безопасными.
В ранних протоколах репликации было недостаточно просто выбрать узел с большинством голосов: новый лидер мог иметь неполный журнал и затем распространить устаревшее состояние. Raft вводит ограничение на голосование, чтобы лидер избирался только среди кандидатов, чей журнал не менее актуален, чем журнал голосующего узла.
Это ограничение связывает выборы с сохранностью записей. Благодаря ему узел, получивший большинство голосов, должен содержать все записи, которые могли быть зафиксированы предыдущим лидером.
Пусть один узел сохранил записи более нового терма, а кандидат их не имеет. Если этот узел проголосует за кандидата, новый лидер может начать репликацию с неполным журналом. Впоследствии он способен перезаписать записи на отставшем узле, что поставит под угрозу свойство безопасности консенсуса.
Важно различать физическую длину журнала и его актуальность. Журнал с большим числом записей не обязательно более актуален: сначала сравнивается термин последней записи, а при равных терминах — её индекс. Поэтому сам факт, что журнал кандидата короче, ещё не доказывает нарушение.
При запросе голоса узел Raft сравнивает журнал кандидата со своим журналом. Кандидат считается достаточно актуальным, если термин его последней записи больше термина последней записи голосующего узла либо термины равны, а индекс последней записи кандидата не меньше.
Следовательно, если у голосующего узла действительно выше термин последней записи, он обязан отклонить запрос на голосование. Если термины равны, но журнал кандидата короче, голос также должен быть отклонён.
Это правило действует вместе с другими условиями: узел голосует не более одного раза за термин, принимает голос только при корректном терме кандидата и учитывает, не видел ли он более новый термин. Получение большинства само по себе не исправляет недействительное голосование: большинство имеет смысл только при соблюдении правил протокола.
Есть важное ограничение: правило сравнения журналов предполагает корректную реализацию и устойчивое хранение текущего терма, проголосовавшего кандидата и журнала. Если узел после сбоя забудет эти данные или применит неверное сравнение, можно получить два опасных эффекта: избрание неподходящего лидера или повторное голосование в одном терме.
Это правило обеспечивает прежде всего безопасность, а не немедленную доступность. Кандидат с устаревшим журналом может не быть избран, даже если он доступен большинству узлов. Кластер предпочтёт временно не выбрать лидера, а не рискнуть потерей согласованного состояния.
В кластере из пяти узлов старый лидер успел зафиксировать запись в терме 8 на большинстве узлов, после чего произошёл сетевой раздел. Один из кандидатов в терме 9 доступен трём узлам, но его журнал заканчивается термом 7.
Вариант с упрощённым голосованием мог бы избрать этого кандидата большинством доступных узлов. Плюс такого решения — потенциально более быстрое восстановление доступности, но минус критичен: новый лидер не обязан знать о зафиксированной записи и может заменить её.
Корректный вариант — отклонить голоса за кандидата с менее актуальным журналом. Если среди доступных узлов есть кандидат с журналом, содержащим записи терма 8, именно он сможет пройти проверку актуальности и быть избран. Если подходящего кандидата нет, кластер останется без лидера до восстановления связи. Это временно снижает доступность, зато сохраняет согласованность данных.
Нет. В Raft сначала сравнивается термин последней записи, а затем индекс. Журнал длиной десять записей из терма 7 может быть менее актуальным, чем журнал длиной пяти записей из терма 8. Поэтому сравнение только количества записей может разрешить голосование неподходящему кандидату.
Гарантирует при корректной работе протокола, но не само по себе. Нужны пересечение большинства и правило, запрещающее голосовать кандидату с менее актуальным журналом. Если узлы голосуют без проверки журнала, математическое большинство не защищает от избрания устаревшего кандидата.
Да, если его последняя запись имеет более высокий термин. В Raft актуальность определяется не длиной журнала, а парой термин–индекс последней записи. Однако если термин последней записи одинаков, кандидат с меньшим индексом последней записи считается менее актуальным и не должен получать голос этого узла.