Алгоритм выбора лидера рафта: один голос на срок?

Я сомневаюсь в понимании алгоритма выбора лидера алгоритма Raft. В статье я прочитал, что каждый узел con дает только один голос за каждый член. Я сомневаюсь в том, что, поскольку термины в каждом узле могут быть разными, о чем идет речь, - это срок узла, запрашивающего голосование, или срок узла, предоставляющего узел? Спасибо


person pinotto    schedule 11.02.2020    source источник


Ответы (1)


В кластере рафта у нас будет узел, который хочет стать лидером и назовет его кандидатом. Все остальные узлы, включая текущего лидера, мы будем просто называть одноранговыми.

Давайте посмотрим, что происходит, когда партнер получает RequestVoteRPC от кандидата.

Если срок участника больше, чем срок, полученный в запросе (срок кандидата), в голосовании будет отказано. Ответ будет содержать термин однорангового узла, поэтому кандидат перейдет в состояние подписчика и обновит его термин, как только получит ответ. Это гарантирует, что срок равноправного участника, запрашивающего голосование, будет таким же, как и срок равноправного участника, дающего голос.

В противном случае партнер должен решить, что делать.

Если срок однорангового узла меньше, чем тот, который был получен в запросе (термин кандидата), этот одноранговый узел будет преобразован в ведомого и обновит свой текущий срок до срока, полученного от кандидата, прежде чем продолжить принятие решения. Это гарантирует, что срок равноправного участника, запрашивающего голос, будет таким же, как и срок равноправного участника, дающего голос.

Есть вероятность, что несколько одноранговых узлов преобразованы в состояние кандидата, и одноранговый узел, за которым мы наблюдаем, уже проголосовал за кандидата. В этом случае переменная votedFor не будет null, и мы не сможем предоставить голос второму (или любому другому) кандидату. Но нам также нужно быть осторожными, потому что мы можем получить повторяющийся RequestVoteRPC запрос (от того же кандидата), и из-за этого нам нужно проверить, совпадает ли votedFor с идентификатором кандидата, запрос которого мы наблюдаем. Если votedFor совпадает с идентификатором текущего кандидата, мы дадим голос.

Подводя итог, мы предоставим голосование, если переменная votedFor равна null или равна идентификатору кандидата.

Я намеренно исключил условие, что для предоставления права голоса журнал кандидатов должен быть как минимум актуальным в этом примере, но не забывайте, что это также важно.

Каждый одноранговый узел может предоставить один голос в течение одного срока, и, поскольку условия будут синхронизироваться во время общения, срок равноправного участника, дающего голос, будет то же, что и срок запроса на голосование.

person msantl    schedule 11.02.2020
comment
Подводя итог, мы предоставим голосование, если переменная votedFor равна нулю или равна идентификатору кандидата, или срок кандидата (запрашивающего голосование) больше срока однорангового участника. Правильно так сказать? - person pinotto; 11.02.2020
comment
Если срок кандидата (запрос на голосование) выше, чем член партнера, партнер сбрасывает свою переменную votedFor во время перехода к ведомому вместе с установкой срока для одного из кандидатов, и из-за этого одноранговый узел окажется в состоянии, в котором срок его полномочий совпадает со сроком полномочий кандидата, и поскольку он еще ни за кого не голосовал, голос может быть предоставлен кандидату. В конце концов, то, что вы предлагаете, правильно. - person msantl; 11.02.2020
comment
Если срок участника превышает срок, полученный в запросе (срок кандидата), в голосовании будет отказано. Ответ будет содержать термин однорангового узла, поэтому кандидат перейдет в состояние подписчика и обновит его термин, как только получит ответ. Это гарантирует, что срок равноправного участника, запрашивающего голос, будет таким же, как и срок равноправного участника, дающего голос. В этом случае кандидат, который теперь стал последователем, также предоставит свой голос за другой узел или только означает, что он отбросит ответы от других его запросов RequestVoteRPC, сделанные другим узлам? - person pinotto; 11.02.2020
comment
Кандидат, который начал выборы с числом членов, меньшим, чем срок, который в настоящее время находится в кластере, станет последователем текущего лидера в кластере. Этот пэр не будет отдавать свой голос, потому что выборы уже состоялись. Ответы от других RequestVoteRPC, по крайней мере в большинстве, должны содержать тот же ответ (голосование отклоняется и текущий член кластера), но если какой-либо другой узел предоставил голос, его следует игнорировать после переключения на подчиненного. режим. - person msantl; 12.02.2020