±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½éÉÜÁË
Ëã·¨»ù´¡ ¡¢Ñ¡¾ÙºÍÈÕÖ¾¸´ÖÆ ¡¢°²È«ÐÔ ¡¢½Úµã±ä¸ü £¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼ÍƼö¡£ |
|
ÎһὫRaftÐÒé²ð³ÉËĸö²¿·ÖÈ¥×ܽ᣺
Ëã·¨»ù´¡
Ñ¡¾ÙºÍÈÕÖ¾¸´ÖÆ
°²È«ÐÔ
½Úµã±ä¸ü
ÕâÊǵÚһƪ£º¡¶½â¶ÁRaft£¨Ò» Ëã·¨»ù´¡£©¡·
ʲôÊÇRAFT
·Ö²¼Ê½ÏµÍ³³ýÁËÌáÉýÕû¸öÌåͳµÄÐÔÄÜÍ⻹ÓÐÒ»¸öÖØÒªÌØÕ÷¾ÍÊÇÌá¸ßϵͳµÄ¿É¿¿ÐÔ¡£
Ìṩ¿É¿¿ÐÔ¿ÉÒÔÀí½âΪϵͳÖÐһ̨»ò¶ą̀µÄ»úÆ÷¹ÊÕϲ»»áʹϵͳ²»¿ÉÓ㨻òÕß¶ªÊ§Êý¾Ý£©¡£
±£Ö¤ÏµÍ³¿É¿¿ÐԵĹؼü¾ÍÊǶั±¾£¨¼´Êý¾ÝÐèÒªÓб¸·Ý£©£¬Ò»µ©Óжั±¾£¬ÄÇô¾ÃÃæÁٶั±¾Ö®¼äµÄÒ»ÖÂÐÔÎÊÌâ¡£
Ò»ÖÂÐÔËã·¨ÕýÊÇÓÃÓÚ½â¾ö·Ö²¼Ê½»·¾³Ï¶ั±¾Ö®¼äÊý¾ÝÒ»ÖÂÐÔµÄÎÊÌâµÄ¡£
Òµ½ç×îÖøÃûµÄÒ»ÖÂÐÔËã·¨¾ÍÊÇ´óÃû¶¦¶¦µÄPaxos£¨ChubbyµÄ×÷ÕßÔøËµ¹ý£ºÊÀÉÏÖ»ÓÐÒ»ÖÖÒ»ÖÂÐÔËã·¨£¬¾ÍÊÇPaxos£©¡£µ«PaxosÊdzöÁËÃûµÄÄѶ®£¬¶øRaftÕýÊÇΪÁË̽Ë÷Ò»ÖÖ¸üÒ×ÓÚÀí½âµÄÒ»ÖÂÐÔËã·¨¶ø²úÉúµÄ¡£
Raft is a consensus algorithm for managing a replicated
log.
RaftÊÇÒ»ÖÖ¹ÜÀí¸´ÖÆÈÕÖ¾µÄÒ»ÖÂÐÔËã·¨¡£
ËüµÄÊ×ÒªÉè¼ÆÄ¿µÄ¾ÍÊÇÒ×ÓÚÀí½â£¬ËùÒÔÔÚÑ¡Ö÷µÄ³åÍ»´¦ÀíµÈ·½Ê½ÉÏËü¶¼Ñ¡ÔñÁ˷dz£¼òµ¥Ã÷Á˵Ľâ¾ö·½°¸¡£
Raft½«Ò»ÖÂÐÔ²ð·ÖΪ¼¸¸ö¹Ø¼üÔªËØ£º
LeaderÑ¡¾Ù
ÈÕÖ¾¸´ÖÆ
°²È«ÐÔ
RaftËã·¨
ËùÓÐÒ»ÖÂÐÔËã·¨¶¼»áÉæ¼°µ½×´Ì¬»ú£¬¶ø×´Ì¬»ú±£Ö¤ÏµÍ³´ÓÒ»¸öÒ»ÖµÄ״̬¿ªÊ¼£¬ÒÔÏàͬµÄ˳ÐòÖ´ÐÐһЩÁÐÖ¸Áî×îÖÕ»á´ïµ½ÁíÒ»¸öÒ»ÖµÄ״̬¡£

ÒÔÉÏÊÇ״̬»úµÄʾÒâͼ¡£ËùÓеĽڵãÒÔÏàͬµÄ˳Ðò´¦ÀíÈÕÖ¾£¬ÄÇô×îÖÕx¡¢y¡¢zµÄÖµÔÚ¶à¸ö½ÚµãÖж¼ÊÇÒ»Öµġ£
Ëã·¨»ù´¡
½ÇÉ«
Raftͨ¹ýÑ¡¾ÙLeader²¢ÓÉLeader½Úµã¸ºÔð¹ÜÀíÈÕÖ¾¸´ÖÆÀ´ÊµÏֶั±¾µÄÒ»ÖÂÐÔ¡£
ÔÚRaftÖУ¬½ÚµãÓÐÈýÖÖ½ÇÉ«£º
Leader£º¸ºÔð½ÓÊÕ¿Í»§¶ËµÄÇëÇ󣬽«ÈÕÖ¾¸´ÖƵ½ÆäËû½Úµã²¢¸æÖªÆäËû½ÚµãºÎʱӦÓÃÕâЩÈÕÖ¾Êǰ²È«µÄ
Candidate£ºÓÃÓÚÑ¡¾ÙLeaderµÄÒ»ÖÖ½ÇÉ«
Follower£º¸ºÔðÏìÓ¦À´×ÔLeader»òÕßCandidateµÄÇëÇó
½Çɫת»»ÈçÏÂͼËùʾ£º

ËùÓнڵã³õʼ״̬¶¼ÊÇFollower½ÇÉ«
³¬Ê±Ê±¼äÄÚûÓÐÊÕµ½LeaderµÄÇëÇóÔòת»»ÎªCandidate½øÐÐÑ¡¾Ù
CandidateÊÕµ½´ó¶àÊý½ÚµãµÄѡƱÔòת»»ÎªLeader£»·¢ÏÖLeader»òÕßÊÕµ½¸ü¸ßÈÎÆÚµÄÇëÇóÔòת»»ÎªFollower
LeaderÔÚÊÕµ½¸ü¸ßÈÎÆÚµÄÇëÇóºóת»»ÎªFollower
ÈÎÆÚ
Raft°Ñʱ¼äÇиîΪÈÎÒⳤ¶ÈµÄÈÎÆÚ£¬Ã¿¸öÈÎÆÚ¶¼ÓÐÒ»¸öÈÎÆÚºÅ£¬²ÉÓÃÁ¬ÐøµÄÕûÊý¡£

ÿ¸öÈÎÆÚ¶¼ÓÉÒ»´ÎÑ¡¾Ù¿ªÊ¼£¬ÈôÑ¡¾Ùʧ°ÜÔòÕâ¸öÈÎÆÚÄÚûÓÐLeader£»Èç¹ûÑ¡¾Ù³öÁËLeaderÔòÕâ¸öÈÎÆÚÄÚÓÐLeader¸ºÔð¼¯Èº×´Ì¬¹ÜÀí¡£
Ëã·¨
״̬



AppendEntries RPC

prevLogIndexºÍprevLogTerm±íʾÉÏÒ»´Î·¢Ë͵ÄÈÕÖ¾µÄË÷ÒýºÍÈÎÆÚ£¬ÓÃÓÚ±£Ö¤ÊÕµ½µÄÈÕÖ¾ÊÇÁ¬ÐøµÄ¡£

½ÓÊÕÕßʵÏÖÂß¼
·µ»Øfalse£¬Èç¹ûÊÕµ½µÄÈÎÆÚ±Èµ±Ç°ÈÎÆÚС
·µ»Øfalse£¬Èç¹û²»°üº¬Ö®Ç°µÄÈÕÖ¾ÌõÄ¿£¨Ã»ÓÐÆ¥ÅäprevLogIndexºÍprevLogTerm£©
Èç¹û´æÔÚindexÏàͬµ«ÊÇterm²»ÏàͬµÄÈÕÖ¾£¬É¾³ý´Ó¸ÃλÖÿªÊ¼ËùÓеÄÈÕÖ¾
×·¼ÓËùÓв»´æÔÚµÄÈÕÖ¾
Èç¹ûleaderCommit>commitIndex£¬½«commitIndexÉèÖÃΪcommitIndex
= min(leaderCommit, index of last new entry)
RequestVote RPC


½ÓÊÕÕßµÄʵÏÖÂß¼
·µ»Øfalse£¬Èç¹ûÊÕµ½µÄÈÎÆÚ±Èµ±Ç°ÈÎÆÚС
Èç¹û±¾µØ×´Ì¬ÖÐvotedForΪnull»òÕßcandidateId£¬ÇÒcandidateµÄÈÕÖ¾µÈÓÚ»ò¶àÓࣨ°´ÕÕindexÅжϣ©½ÓÊÕÕßµÄÈÕÖ¾£¬Ôò½ÓÊÕÕßͶƱ¸øcandidate£¬¼´·µ»Øtrue
½ÚµãµÄÖ´ÐйæÔò
ËùÓнڵã
Èç¹ûcommitIndex > lastApplied£¬Ó¦ÓÃlog[lastApplied]µ½×´Ì¬»ú£¬Ôö¼ÓlastApplied
Èç¹ûRPCÇëÇó»òÕßÏìÓ¦°üº¬µÄÈÎÆÚT > currentTerm£¬½«currentTermÉèÖÃΪT²¢×ª»»ÎªFollower
Followers
ÏìÓ¦À´×ÔLeaderºÍCandidateµÄRPCÇëÇó
Èç¹ûÔÚÑ¡¾Ù³¬Ê±ÖÜÆÚÄÚûÓÐÊÕµ½AppendEntriesµÄÇëÇó»òÕ߸øCandidateͶƱ£¬×ª»»ÎªCandidate½ÇÉ«
Candidates
ת»»Îªcandidate½ÇÉ«£¬¿ªÊ¼Ñ¡¾Ù£º
µÝÔöcurrentTerm
¸ø×Ô¼ºÍ¶Æ±
ÖØÖÃÑ¡¾Ùʱ¼ä
·¢ËÍRequestVote¸øÆäËûËùÓнڵã
Èç¹ûÊÕµ½ÁË´ó¶àÊý½ÚµãµÄѡƱ£¬×ª»»ÎªLeader½Úµã
Èç¹ûÊÕµ½Leader½ÚµãµÄAppendEntriesÇëÇó£¬×ª»»ÎªFollower½Úµã
Èç¹ûÑ¡¾Ù³¬Ê±£¬ÖØÐ¿ªÊ¼ÐÂÒ»ÂÖµÄÑ¡¾Ù
Leaders
Ò»µ©Ñ¡¾ÙÍê³É£º·¢ËÍÐÄÌø¸øËùÓнڵ㣻ÔÚ¿ÕÏеÄÖÜÆÚÄÚ²»¶Ï·¢ËÍÐÄÌø±£³ÖLeaderÉí·Ý
Èç¹ûÊÕµ½¿Í»§¶ËµÄÇëÇ󣬽«ÈÕÖ¾×·¼Óµ½±¾µØlog£¬ÔÚÈÕÖ¾±»Ó¦Óõ½×´Ì¬»úºóÏìÓ¦¸ø¿Í»§¶Ë
Èç¹û¶ÔÓÚÒ»¸ö¸úËæÕߣ¬×îºóÈÕÖ¾ÌõÄ¿µÄË÷ÒýÖµ´óÓÚµÈÓÚ nextIndex£¬ÄÇô£º·¢ËÍ´Ó nextIndex
¿ªÊ¼µÄËùÓÐÈÕÖ¾ÌõÄ¿£º
Èç¹û³É¹¦£º¸üÐÂÏàÓ¦¸úËæÕßµÄ nextIndex ºÍ matchIndex
Èç¹ûÒòΪÈÕÖ¾²»Ò»Ö¶øÊ§°Ü£¬¼õÉÙ nextIndex ÖØÊÔ
Èç¹û´æÔÚÒ»¸öÂú×ãN > commitIndexµÄ N£¬²¢ÇÒ´ó¶àÊýµÄmatchIndex[i]
¡Ý N³ÉÁ¢£¬²¢ÇÒlog[N].term == currentTerm³ÉÁ¢£¬ÄÇôÁîcommitIndexµÈÓÚÕâ¸öN
|