Я сомневаюсь в понимании алгоритма выбора лидера алгоритма Raft. В статье я прочитал, что каждый узел con дает только один голос за каждый член. Я сомневаюсь в том, что, поскольку термины в каждом узле могут быть разными, о чем идет речь, - это срок узла, запрашивающего голосование, или срок узла, предоставляющего узел? Спасибо
Алгоритм выбора лидера рафта: один голос на срок?
Ответы (1)
В кластере рафта у нас будет узел, который хочет стать лидером и назовет его кандидатом. Все остальные узлы, включая текущего лидера, мы будем просто называть одноранговыми.
Давайте посмотрим, что происходит, когда партнер получает RequestVoteRPC
от кандидата.
Если срок участника больше, чем срок, полученный в запросе (срок кандидата), в голосовании будет отказано. Ответ будет содержать термин однорангового узла, поэтому кандидат перейдет в состояние подписчика и обновит его термин, как только получит ответ. Это гарантирует, что срок равноправного участника, запрашивающего голосование, будет таким же, как и срок равноправного участника, дающего голос.
В противном случае партнер должен решить, что делать.
Если срок однорангового узла меньше, чем тот, который был получен в запросе (термин кандидата), этот одноранговый узел будет преобразован в ведомого и обновит свой текущий срок до срока, полученного от кандидата, прежде чем продолжить принятие решения. Это гарантирует, что срок равноправного участника, запрашивающего голос, будет таким же, как и срок равноправного участника, дающего голос.
Есть вероятность, что несколько одноранговых узлов преобразованы в состояние кандидата, и одноранговый узел, за которым мы наблюдаем, уже проголосовал за кандидата. В этом случае переменная votedFor
не будет null
, и мы не сможем предоставить голос второму (или любому другому) кандидату. Но нам также нужно быть осторожными, потому что мы можем получить повторяющийся RequestVoteRPC
запрос (от того же кандидата), и из-за этого нам нужно проверить, совпадает ли votedFor
с идентификатором кандидата, запрос которого мы наблюдаем. Если votedFor
совпадает с идентификатором текущего кандидата, мы дадим голос.
Подводя итог, мы предоставим голосование, если переменная votedFor
равна null
или равна идентификатору кандидата.
Я намеренно исключил условие, что для предоставления права голоса журнал кандидатов должен быть как минимум актуальным в этом примере, но не забывайте, что это также важно.
Каждый одноранговый узел может предоставить один голос в течение одного срока, и, поскольку условия будут синхронизироваться во время общения, срок равноправного участника, дающего голос, будет то же, что и срок запроса на голосование.
votedFor
во время перехода к ведомому вместе с установкой срока для одного из кандидатов, и из-за этого одноранговый узел окажется в состоянии, в котором срок его полномочий совпадает со сроком полномочий кандидата, и поскольку он еще ни за кого не голосовал, голос может быть предоставлен кандидату. В конце концов, то, что вы предлагаете, правильно.
- person msantl; 11.02.2020
RequestVoteRPC
, по крайней мере в большинстве, должны содержать тот же ответ (голосование отклоняется и текущий член кластера), но если какой-либо другой узел предоставил голос, его следует игнорировать после переключения на подчиненного. режим.
- person msantl; 12.02.2020