Я изучаю Raft из расширенной версии paper. В разделе 5.2 (Выборы лидера) газеты говорится:
Если последователь не получает сообщения в течение периода времени, называемого тайм-аутом выборов, то он предполагает, что жизнеспособного лидера нет, и начинает выборы, чтобы выбрать нового лидера.
В то же время в документе говорится, что в некоторых случаях RPC может быть отклонен, например, если он содержит меньшее количество термов.
Мой вопрос: когда подписчик должен распознать RPC как действительное сообщение и записать его, чтобы предотвратить истечение времени ожидания?
Редактировать:
Моя текущая реализация выглядит следующим образом:
RequestVote
сбрасывает тайм-аут только тогда, когда сервер дает голосAppendEntries
сбрасывает тайм-аут, если его срок не меньше, чем у сервера
В большинстве случаев это работает нормально, но иногда приводит к долгим выборам. Рассмотрим кластер Raft с 2 серверами, оба подчиненных. Сервер №1 имеет более свежий журнал, но сервер №2 имеет более крупный срок.
В этой настройке сервер №1 должен постоянно запускать 2 выбора, чтобы стать лидером, что (интуитивно) происходит с вероятностью <50%. Если сервер №2 начинает выборы и тайм-ауты, его срок увеличивается, и следующие выборы сервером №1 снова не удастся. На практике это может привести к тому, что все выборы будут длиться несколько секунд, даже если серверов всего несколько. Интересно, есть ли какие-то подходы к решению этой проблемы (или это на самом деле не проблема).