1.raftç解
2.Raft共识算法
3.Raft 算法原理及其在 CMQ 中的算法算法应用(上)
4.Raft算法图文解析
5.20230406光流算法RAFT光流算法使用
6.Raft算法笔记——投票选主机制
raftç解
è¿æ¯ä¸ç¯å¦ä¹ raft论æçæ»ç»ï¼ä¸»è¦æ¯å¯¹ç论æè¿ç¨ä¸é¾ä»¥ç解çå 个é®é¢çè®°å½ãç³»ç»æ§ç讲解è¿æ¯å¾çraft论æï¼è®ºæåææ¯æ好çææã
å¼ç¨è®ºæä¸ç第ä¸å¥è¯--âRaft æ¯ä¸ç§ä¸ºäºç®¡çå¤å¶æ¥å¿çä¸è´æ§ç®æ³âãä»ä¸¤ä¸ªè§åº¦æ¥ç解raftç®æ³ï¼ç¬¬ä¸é¨åæ¯raftçåºæ¬è§åï¼ç¬¬äºé¨åæ¯raftçå¼å¸¸æ åµå¤çãä¸é¢æ¾ä¸å¼ raft论æä¸çç»å ¸å¾æ¥äºè§£ä¸ä¸raftæ¯æä¹å¨ä¸ä¸ªç³»ç»ä¸å·¥ä½çãä¸å¾ä¸ä¸è´æ§æ¨¡åConsensus Moduleæ§è¡çå°±æ¯raftç®æ³ï¼å®ä¿è¯æ·è´å°ææserverä¸çæ¯ä¸æ¡æ¥å¿æ¯ä¸è´çãState Machineç¶ææºå¯¹åºæ们çä¸å¡é»è¾ï¼æ¥å¿ä½ä¸ºç¶ææºçè¾å ¥ï¼è¾å ¥ä¸è´å°±è½ä¿è¯è¾åºæ¯ä¸è´çã
åºæ¬è§å
raftçå·¥ä½æ¨¡å¼æ¯ä¸ä¸ªLeaderåå¤ä¸ªFollower模å¼ï¼å³æ们é常说çé¢å¯¼è -追éè 模å¼ãè¿ç§æ¨¡å¼ä¸éè¦è§£å³ç第ä¸ä¸ªé®é¢å°±æ¯Leaderçé举é®é¢ãå ¶æ¬¡æ¯å¦ä½ææ¥å¿ä»Leaderå¤å¶å°ææFollowerä¸å»ãè¿éå ä¸å ³å¿å®å ¨åå¯é æ§ï¼åªç解raftè¿è¡èµ·æ¥åºæ¬è§åãraftä¸çserveræä¸ç§ç¶æï¼é¤äºå·²ç»æå°çLeaderåFollowerç¶æå¤ï¼è¿æCandidateç¶æï¼å³ç«éè ç¶æãä¸é¢æ¯è¿ä¸ç§ç¶æç转åè¿ç¨ã
1ãLeaderçé举è¿ç¨
raftåå§ç¶ææ¶ææserveré½å¤äºFollowerç¶æï¼å¹¶ä¸éæºç¡ç ä¸æ®µæ¶é´ï¼è¿ä¸ªæ¶é´å¨0~msä¹é´ãæå éæ¥çserver Aè¿å ¥Candidateç¶æï¼Candidateç¶æçserver Aææå©åèµ·æ票ï¼åå ¶å®ææserverååºrequst_vote请æ±ï¼è¯·æ±å ¶å®serverç»å®æ票æ为Leaderãå½å ¶å®serveræ¶å°request_vote请æ±åï¼å°èªå·±ä» æçä¸ç¥¨æç»server Aï¼åæ¶ç»§ç»ä¿æFollowerç¶æ并éç½®é举计æ¶å¨ãå½server Aæ¶å°å¤§å¤æ°ï¼è¶ è¿ä¸å以ä¸ï¼serverçæ票åï¼å°±è¿å ¥Leaderç¶æï¼æ为系ç»ä¸ä» æçLeaderãraftç³»ç»ä¸åªæLeaderæææå©æ¥æ¶å¹¶å¤çclient请æ±ï¼å¹¶åå ¶å®serverååºæ·»å æ¥å¿è¯·æ±æ¥æ交æ¥å¿ã
2ãæ¥å¿å¤å¶è¿ç¨
Leaderé举åºæ¥åï¼å°±å¯ä»¥å¼å§å¤ç客æ·ç«¯è¯·æ±ãLeaderæ¶å°å®¢æ·ç«¯è¯·æ±åï¼å°è¯·æ±å 容ä½ä¸ºä¸æ¡logæ¥å¿æ·»å å°èªå·±çlogè®°å½ä¸ï¼å¹¶åå ¶å®serveråéappend_entries(æ·»å æ¥å¿)请æ±ãå ¶å®serveræ¶å°append_entries请æ±åï¼å¤æ该append请æ±æ»¡è¶³æ¥æ¶æ¡ä»¶ï¼æ¥æ¶æ¡ä»¶å¨åé¢å®å ¨ä¿è¯é®é¢3ç»åºï¼ï¼å¦æ满足æ¡ä»¶å°±å°å ¶æ·»å å°æ¬å°çlogä¸ï¼å¹¶ç»Leaderåéæ·»å æåçresponseãLeaderå¨æ¶å°å¤§å¤æ°serveræ·»å æåçresponseåï¼å°±å°è¯¥æ¡logæ£å¼æ交ãæ交åçlogæ¥å¿å°±æå³çå·²ç»è¢«raftç³»ç»æ¥åï¼å¹¶è½åºç¨å°ç¶ææºä¸äºã
Leaderå ·æç»å¯¹çæ¥å¿å¤å¶æåï¼å ¶å®serverä¸åå¨æ¥å¿ä¸å ¨æè ä¸Leaderæ¥å¿ä¸ä¸è´çæ åµæ¶ï¼ä¸åé½ä»¥Leaderä¸çæ¥å¿ä¸ºä¸»ï¼æç»ææserverä¸çæ¥å¿é½ä¼å¤å¶æä¸Leaderä¸è´çç¶æã
以ä¸å°±æ¯raftå 许çåºæ¬è§åï¼å¦æä¸åºç°ä»»ä½å¼å¸¸æ åµï¼é£ä¹åªè¦ä¸é¢ä¸¤ä¸ªè¿ç¨å°±è½ä½¿raftè¿è¡èµ·æ¥äºãä½æ¯ç°å®çç³»ç»ä¸å¯è½è¿ä¹ä¸å¸é£é¡ºï¼æ»æ¯æå¾å¤å¼å¸¸æ åµéè¦èèãraftçå¤ææ§å°±æ¥æºäºå¯¹è¿äºå¼å¸¸æ åµçèèï¼ä¸é¢ä¸å°è就以é®ççæ¹å¼æ¥æ»ç»raftæ¯æä¹ä¿è¯å®å ¨æ§çã
å®å ¨æ§ä¿è¯
1ãLeaderé举è¿ç¨ä¸ï¼å¦ææ两个serverAåBåæ¶éæ¥å¹¶ååºrequest_vote请æ±æä¹åï¼
ç±äºå¨ä¸æ¬¡é举è¿ç¨ä¸ï¼ä¸ä¸ªserveræå¤åªè½æä¸ç¥¨ï¼è¿å°±ä¿è¯äºserverAåBä¸å¯è½åæ¶å¾å°å¤§å¤æ°ï¼ä¸å以ä¸ï¼çæ票ãå¦æAæè Bä¸å ¶ä¸å¹¸è¿å°å¾å°äºå¤§å¤æ°æ票ï¼å°±è½é¡ºå©å°æ为Leaderï¼raftç³»ç»æ£å¸¸è¿è¡ä¸å»ãä½æ¯AåBå¯è½å好é½å¾å°ä¸åçæ票ï¼ä¸¤è é½æ为ä¸äºLeaderãè¿æ¶AåB继ç»ä¿æCandidateç¶æï¼å¹¶ä¸éæºç¡ç ä¸æ®µæ¶é´ï¼çå¾ è¿å ¥å°ä¸ä¸ä¸ªé举å¨æãç±äºææserveré½æ¯éæºéæ©ç¡ç æ¶é´ï¼æ以è¿ç»åºç°å¤ä¸ªserverç«éçæ¦çå¾ä½ã
2ãLeaderæäºåï¼å¦ä½é举åºæ°çLeaderï¼
Leaderæ£å¸¸è¿ä½æ¶ï¼ä¼å¨ææ§å°ååºappend_entries请æ±ãè¿ä¸ªå¨ææ§çappend_entriesé¤äºå¯ä»¥æ´æ°å ¶å®Followerçlogä¿¡æ¯ï¼å¦å¤ä¸ä¸ªéè¦åè½å°±æ¯èµ·å°å¿è·³ä½ç¨ãFolloweræ¶å°append_entriesåï¼å°±ç¥éLeaderè¿æ´»çãå¦æFollowerç»è¿ä¸ä¸ªé¢å®çæ¶é´(ä¸è¬è®¾ä¸ºmså·¦å³)é½æ²¡ææ¶å°Leaderçå¿è·³ï¼å°±è®¤ä¸ºLeaderæäºãäºæ¯è½¬å ¥Candidateç¶æï¼å¼å§åèµ·æ票ç«éæ°çLeaderãæ¯ä¸ªæ°çLeader产çåå°±æ¯ä¸ä¸ªæ°çä»»æï¼æ¯ä¸ªä»»æé½å¯¹åºä¸ä¸ªå¯ä¸çä»»æå·termãè¿ä¸ªtermæ¯åè°éå¢çï¼ç¨æ¥å¯ä¸æ è¯ä¸ä¸ªLeaderçä»»æãæ票å¼å§æ¶ï¼Candidateå°èªå·±çtermå 1ï¼å¹¶å¨request_voteä¸å¸¦ä¸termï¼Followeråªä¼æ¥åä»»æå·termæ¯èªå·±å¤§çrequest_vote请æ±ï¼å¹¶ä¸ºä¹æ票ãè¿æ¡è§åä¿è¯äºåªæææ°çCandidateææå¯è½æ为Leaderã
3ãFollowerå¨æ¶å°ä¸æ¡append_entriesæ·»å æ¥å¿è¯·æ±åï¼æ¯å¦ç«å³ä¿å并å°å ¶åºç¨å°ç¶ææºä¸å»ï¼å¦æä¸æ¯ç«å³åºç¨ï¼é£ä¹ç±ä»ä¹æ¥å³å®è¯¥æ¡æ¥å¿çæçæ¶é´ï¼
Followerå¨æ¶å°ä¸æ¡append_entriesåï¼é¦å ä¼æ£æ¥è¿æ¡append_entriesçæ¥æºä¿¡æ¯æ¯å¦ä¸æ¬å°ä¿åçleaderä¿¡æ¯ç¬¦åï¼å æ¬leaderIdåä»»æå·termãæ£æ¥åæ³åå°±å°æ¥å¿ä¿åå°æ¬å°logä¸ï¼å¹¶ç»Leaderåå¤æ·»å logæåï¼ä½æ¯ä¸ä¼ç«å³å°å ¶åºç¨å°æ¬å°ç¶ææºãLeaderæ¶å°å¤§é¨åFolloweræ·»å logæåçåå¤åï¼å°±æ£å¼å°è¿æ¡æ¥å¿commitæ交ãLeaderå¨éåååºçå¿è·³append_entiresä¸ä¼å¸¦ä¸å·²ç»æ交æ¥å¿ç´¢å¼ãFolloweræ¶å°Leaderååºçå¿è·³append_entriesåï¼å°±å¯ä»¥ç¡®è®¤åæçlogå·²ç»è¢«commit(æ交)äºï¼è¿ä¸ªæ¶åFolloweræä¼ææ¥å¿åºç¨å°æ¬å°ç¶ææºãä¸è¡¨å³æ¯append_entries请æ±çå 容ï¼å ¶ä¸leaderCommitå³æ¯Leaderå·²ç»ç¡®è®¤æ交çæ大æ¥å¿ç´¢å¼ãFollowerå¨æ¶å°Leaderååºçappend_entriesåå³å¯ä»¥éè¿leaderCommitå段å³å®åªäºæ¥å¿å¯ä»¥åºç¨å°ç¶ææºã
4ãå设æä¸ä¸ªserver Aå®æºäºå¾é¿ä¸æ®µæ¶é´ï¼å®çæ¥å¿å·²ç»è½åå¾å¤ãå¦æAéæ°ä¸çº¿ï¼èä¸æ¤æ¶ç°æLeaderææï¼server Aå好ç«éæ为äºLeaderãæç §æ¥å¿é½æ¯ç±Leaderå¤å¶ç»å ¶å®serverçååï¼server Aä¼æå ¶å®Followerå·²ç»æ交çæ¥å¿ç»æ¹æï¼èè¿è¿åäºraftç¶ææºå®å ¨ç¹æ§ï¼raftæä¹è§£å³è¿ç§å¼å¸¸æ åµï¼
æè°çç¶ææºå®å ¨ç¹æ§å³æ¯âå¦æä¸ä¸ªé¢å¯¼äººå·²ç»å¨ç»å®çç´¢å¼å¼ä½ç½®çæ¥å¿æ¡ç®åºç¨å°ç¶ææºä¸ï¼é£ä¹å ¶ä»ä»»ä½çæå¡å¨å¨è¿ä¸ªç´¢å¼ä½ç½®ä¸ä¼æ交ä¸ä¸ªä¸åçæ¥å¿âãå¦æserverå¨ç«éLeaderçè¿ç¨ä¸ä¸å ä»»ä½éå¶çè¯ï¼æºå¸¦æ§æ¥å¿çserverä¹æå¯è½ç«éæ为Leaderï¼å°±å¿ ç¶åå¨è¦çä¹åLeaderå·²ç»æ交çæ¥å¿å¯è½æ§ï¼ä»èè¿åç¶ææºå®å ¨ç¹æ§ãraftç解å³åæ³å¾ç®åï¼å°±æ¯åªæå ·æææ°æ¥å¿çserverçææèµæ ¼å»ç«éå½ä¸Leaderï¼å ·ä½æ¯æä¹åå°çå¢ï¼é¦å ä»»ä½serveré½è¿æ¯æèµæ ¼å»åèµ·request_vote请æ±å»æåæ票çï¼request_voteä¸ä¼å¸¦ä¸serverçæ¥å¿ä¿¡æ¯ï¼è¿äºä¿¡æ¯æ æäºserveræ¥å¿çæ°æ§ç¨åº¦ï¼å¦ä¸è¡¨æ示ã
å ¶å®serveræ¶å°request_voteåï¼å¤æå¦ælastLogTermæ¯èªå·±çterm大ï¼é£ä¹å°±å¯ä»¥ç»å®æ票ï¼lastLogTermæ¯èªå·±çtermå°ï¼å°±ä¸ç»å®æ票ãå¦æç¸ççè¯å°±æ¯è¾lastLogIndexï¼lastLogIndex大çè¯æ¥å¿å°±æ¯è¾æ°ï¼å°±ç»å®æ票ãä¸å¾æ¯raftæ¥å¿æ ¼å¼ï¼æ¯æ¡æ¥å¿ä¸ä¸ä» ä¿åäºæ¥å¿å 容ï¼è¿ä¿åäºåéè¿æ¡æ¥å¿çLeaderçä»»æå·termã为ä»ä¹è¦å¨æ¥å¿éä¿åä»»æå·termï¼ç±äºä»»æå·æ¯å ¨å±åè°éå¢ä¸å¯ä¸çï¼æä»¥æ ¹æ®ä»»æå·å¯ä»¥å¤æä¸æ¡æ¥å¿çæ°æ§ç¨åº¦ï¼ä¸ºé举åºå ·æææ°æ¥å¿çLeaderæä¾ä¾æ®ã
5ãåå¨å¦ä¸å¾ä¸ç§å¼å¸¸æ åµï¼server S5å¨æ¶åº(d)ä¸è¦çäºserver S1å¨æ¶åº(c)ä¸æ交çindex为2çæ¥å¿ï¼æ¹æ¡ä¸çæ°åæ¯æ¥å¿çtermãè¿è¿åäºç¶ææºçå®å ¨ç¹æ§--âå¦æä¸ä¸ªé¢å¯¼äººå·²ç»å¨ç»å®çç´¢å¼å¼ä½ç½®çæ¥å¿æ¡ç®åºç¨å°ç¶ææºä¸ï¼é£ä¹å ¶ä»ä»»ä½çæå¡å¨å¨è¿ä¸ªç´¢å¼ä½ç½®ä¸ä¼æ交ä¸ä¸ªä¸åçæ¥å¿âï¼raftè¦å¦ä½è§£å³è¿ä¸ªé®é¢ï¼
åºç°è¿ä¸ªé®é¢çæ ¹æ¬åå æ¯S1å¨æ¶åº(c) çä»»æ4å æ交äºä¸ä¸ªä¹åä»»æ2çlogï¼è¿æ ·S1æ交çæ¥å¿ä¸æ大çtermä» ä» æ¯2ï¼é£ä¹ä¸äºæ¥å¿æ¯è¾æ§çserverï¼æ¯å¦S5(å®ææ¥å¿çterm为 3)ï¼å°±ææºä¼æ为leaderï¼å¹¶è¦çS1æ交çæ¥å¿ã解å³åæ³å°±æ¯S1å¨æ¶åº(c)çä»»æterm4æ交term2çæ§æ¥å¿æ¶ï¼æ§æ¥å¿å¿ é¡»é带å¨å½återm 4çæ¥å¿ä¸ä¸èµ·æ交ãè¿æ ·å°±æS1æ¥å¿çæ大termæé«å°äº4ï¼è®©é£äºæ¥å¿æ¯è¾æ§çS5没ææºä¼ç«éæ为Leaderï¼ä¹å°±ä¸ä¼ç¨æ§çæ¥å¿è¦çå·²ç»æ交çæ¥å¿äºã
ç®åç¹è¯´ï¼Leaderå¦æè¦æ交ä¹återmçæ§æ¥å¿ï¼é£ä¹å¿ é¡»è¦æ交ä¸æ¡å½återmçæ¥å¿ãæ交ä¸æ¡å½återmçæ¥å¿ç¸å½äºä¸ºé£äºæ§çæ¥å¿å äºä¸æå®å ¨éï¼è®©é£äºæ¥å¿æ¯è¾æ§çserver失å»å¾å°Leaderçæºä¼ï¼ä»èä¸ä¼ä¿®æ¹é£äºä¹återmçæ§æ¥å¿ã
æä¹å ·ä½å®ç°æ§æ¥å¿å¿ é¡»é带å¨å½återmçæ¥å¿ä¸ä¸èµ·æ交å¢ï¼å¨é®é¢3ä¸æç»åºappend_entries请æ±ä¸çå段ï¼å ¶ä¸æ两个å段preLogIndexåpreLogTermçä½ç¨æ²¡ææå°ï¼è¿ä¸¤ä¸ªå段就æ¯ä¸ºäºä¿è¯LeaderåFollowersçåå²æ¥å¿å®å ¨ä¸è´èåå¨çãå½Leaderå¨æ交ä¸æ¡æ°æ¥å¿çæ¶åï¼ä¼å¸¦ä¸æ°æ¥å¿åä¸æ¡æ¥å¿çindexåtermï¼å³preLogIndexåpreLogTermãFolloweræ¶å°append_entriesåï¼ä¼æ£æ¥preLogIndexåpreLogTermæ¯å¦åèªå·±å½åææ°é£æ¡æ¥å¿çindexåterm对å¾ä¸ï¼å¦æ对ä¸ä¸å°±ä¼ç»Leaderè¿åèªå·±å½åæ¥å¿çindexåtermãLeaderæ¶å°åå°±å°Followerè¿åçindex对åºçæ¥å¿ä»¥å对åºçpreLogIndexåpreLogTermåéç»Followerãè¿ä¸ªè¿ç¨ä¸ç´éå¤ï¼ç´å°LeaderåFolloweræ¾å°äºç¬¬ä¸ä¸ªindexåtermè½å¯¹å¾ä¸çæ¥å¿ï¼ç¶åLeaderä»è¿æ¡æ¥å¿å¼å§æ·è´ç»Followerãåç段é¦çé®é¢ï¼Leaderå¨æ交ä¸æ¡ææ°çæ¥å¿æ¶ï¼Followä¼æ£éªä¹åçæ¥å¿æ¯å¦ä¸Leaderä¿æäºä¸è´ï¼å¦æä¸ä¸è´ä¼ä¸ç´åæ¥å°ä¸Leaderä¸è´åææ·»å ææ°çæ¥å¿ï¼è¿ä¸ªæºå¶å°±ä¿è¯äºLeaderå¨æ交ææ°æ¥å¿æ¶ï¼ä¹æ交äºä¹åæ§çæ¥å¿ã
6ãåraftç³»ç»ä¸æ·»å æ°æºå¨æ¶ï¼ç±äºé 置信æ¯ä¸å¯è½å¨å个系ç»ä¸åæ¶è¾¾å°åæ¥ç¶æï¼æ»ä¼ææäºserverå å¾å°æ°æºå¨çä¿¡æ¯ï¼æäºserveråå¾å°æ°æºå¨çä¿¡æ¯ãæ¯å¦ä¸å¾raftç³»ç»ä¸æ°å¢å äºserver4åserver5è¿ä¸¤å°æºå¨ãåªæserver3çå æç¥å°äºè¿ä¸¤å°æºå¨çæ·»å ãè¿ä¸ªæ¶åå¦æè¿è¡é举ï¼å°±æå¯è½åºç°ä¸¤ä¸ªLeaderé举æåãå 为server3认为æ3å°serverç»å®æäºç¥¨ï¼å®å°±æ¯Leaderï¼èserver1认为åªè¦æ2å°serverç»å®æ票就æ¯Leaderäºãraftæä¹è§£å³è¿ä¸ªé®é¢å¢ï¼
产çè¿ä¸ªé®é¢çæ ¹æ¬åå æ¯ï¼raftç³»ç»ä¸æä¸é¨åæºå¨ä½¿ç¨äºæ§çé ç½®ï¼å¦server1åserver2ï¼æä¸é¨å使ç¨æ°çé ç½®ï¼å¦server3ã解å³è¿ä¸ªé®é¢çæ¹æ³æ¯æ·»å ä¸ä¸ªä¸é´é ç½®(Cold, Cnew)ï¼è¿ä¸ªä¸é´é ç½®çå 容æ¯æ§çé 置表Coldåæ°çé ç½®Cnewãè¿æ¯æ¿ä¸å¾ä¸çä¾åæ¥è¯´æï¼è¿ä¸ªæ¶åserver3æ¶å°æ·»å æºå¨çæ¶æ¯åï¼ä¸æ¯ç´æ¥ä½¿ç¨æ°çé ç½®Cnewï¼èæ¯ä½¿ç¨(Cold, Cnew)æ¥åå³çãæ¯å¦è¯´server3å¨ç«éLeaderçæ¶åï¼ä¸ä» éè¦å¾å°Coldä¸ç大é¨åæ票ï¼è¿è¦å¾å°Cnewä¸ç大é¨åæ票æè½æ为Leaderãè¿æ ·å°±ä¿è¯äºserver1åserver2å¨ä½¿ç¨Coldé ç½®çæ åµä¸ï¼è¿æ¯åªå¯è½äº§çä¸ä¸ªLeaderãå½ææserveré½è·å¾äºæ·»å æºå¨çæ¶æ¯åï¼åç»ä¸åæ¢å°Cnewãraftå®ç°ä¸ï¼å°Coldï¼(Cold,Cnew)以åCnewé½å½æä¸æ¡æ®éçæ¥å¿ãé ç½®æ´æ¹ä¿¡æ¯åéLeaderåï¼ç±Leaderå æ·»å ä¸æ¡ (Cold, Cnew)æ¥å¿ï¼å¹¶åæ¥ç»å ¶å®Followerãå½è¿æ¡æ¥å¿(Cold, Cnew)æ交åï¼åæ·»å ä¸æ¡Cnewæ¥å¿åæ¥ç»å ¶å®Followerï¼éè¿Cnewæ¥å¿å°ææFollowerçé ç½®åæ¢å°ææ°ã
æçraftå®ç°éç¨äºä¸ç§æ´å ç®åç²æ´çæ¹æ³æ¥è§£å³æåååçé®é¢ãè¿ä¸ªåæ³å°±æ¯æ¯æ¬¡åªæ´æ°ä¸å°æºå¨çé ç½®ååï¼æ¶å°é ç½®ååçæºå¨ç«é©¬éç¨æ°çé ç½®ãè¿æ ·çåæ³ä¸ºä»ä¹è½ç¡®ä¿å®å ¨æ§å¢ï¼ä¸é¢ä¸¾ä¾è¯´æãæ¯å¦è¯´ç³»ç»ä¸åæ¥æ5å°æºå¨A,B,C,D,Eï¼ç°å¨æ°å äºä¸å°æºå¨Fï¼A,B,Cä¸å°æºå¨æ²¡ææç¥å°Fçå å ¥ï¼åªæD,E两å°æºå¨æç¥å°äºFçå å ¥ãç°å¨å°±æäºä¸¤ä¸ªæ§æºå¨éåXï½A, B, C, D, E}åæ°æºå¨éåYï½Fï½ãå设AåDåæ¶è¿å ¥Candidateç¶æå»ç«éLeaderï¼å ¶ä¸Dè¦æ³ç«éæåï¼å¿ é¡»å¾æä¸å以ä¸æºå¨æ票ï¼å³6/2+1=4å°æºå¨ï¼å°±ç®Yéåä¸çFæºå¨ç»Dæäºç¥¨ï¼è¿å¾è³å°å¨éåXä¸å¾å°3票ï¼èAè¦æ³ç«éæåï¼ä¹å¿ é¡»å¾å°5/2+1 = 3å¼ ç¥¨ï¼ç±äºAåªç¥ééåXçåå¨ï¼æ以ä¹å¿ é¡»ä»éåXä¸è·å¾è³å°3票ãèAåDä¸å¯è½åæ¶ä»éåXåæ¶è·å¾3票ï¼æ以AåDä¸å¯è½åæ¶ç«éæ为Leaderï¼ä»èä¿è¯äºå®å ¨æ§ãå¯ä»¥ä½¿ç¨æ´å å½¢å¼åçæ°å¦å ¬å¼æ¥è¯æä¸æ¬¡æ·»å ä¸å°æºå¨é ç½®ä¸ä¼å¯¼è´äº§ç两个Leaderï¼è¯æè¿ç¨å°±ææ¶çç¥äºã
raft论æä¸æç¿»è¯ï¼ /blob/master/raft-zh_cn.md
raft论æè±æååï¼ /willemt/raft
raftæååæ´è¿ç¨åæï¼ /zhang_shuai_/article/details/
Raft共识算法
Raft共识算法是分布式系统中广泛应用的一种共识算法,其设计目标是源码提供一个易于理解、实用且安全可用的代码解决方案。Raft的算法算法核心原理在于选举机制和日志复制。选举过程中,源码节点在特定时间周期内会选举出一个leader,代码网课题库PHP源码负责处理客户端请求并同步日志到集群中的算法算法其他节点。在选举阶段,源码节点会向其他节点发起投票请求,代码收到超过半数节点支持的算法算法候选节点将当选为leader。leader负责处理所有客户端请求,源码并通过心跳消息确保集群内节点的代码状态一致性。如果leader出现故障,算法算法集群将重新选举出新的源码leader。
在日志复制阶段,代码leader会将处理的请求序列化为日志条目,然后通过leader-to-follower的复制机制将日志条目复制到集群中的其他节点。这个过程确保了即使在部分节点故障的情况下,数据的一致性和可用性。在复制过程中,有一个关键的规则:只有在大多数节点都已经复制了日志条目后,该条目才会被提交到集群的状态机中。这确保了即使在日志条目复制过程中出现节点故障,提交的命令序列仍然能够保持一致。
为了保证选举和日志复制的正确性,Raft算法通过一系列的机制和规则来防止和处理各种异常情况。比如在选举过程中,为了避免选举冲突,选举超时时间被设计为随机值。同时,为了防止旧的leader状态被覆盖,Raft算法在日志复制时会保留每个日志条目的任期号,这有助于在选举过程中选择最新的leader。在日志复制过程中,如果出现节点状态不一致的情况,Raft算法会通过重新复制日志条目来解决不一致的问题。当leader挂掉时,集群会重新选举新的leader,新leader只处理当前任期的日志条目,而不会影响到之前已经提交的命令。
对于成员变更问题,Raft算法通过逐步添加新节点来避免同时存在两个leader的情况。当需要添加新节点时,游戏源码农场算法会先更新集群配置,然后通过重新选举来确保正确的leader状态。在成员变更过程中,Raft算法通过日志条目来记录集群配置的变更,这使得在日志中包含了对集群状态的更改。
为了处理无限增长的日志条目和有限存储空间之间的矛盾,Raft算法采用了日志压缩技术,通过快照的方式保留集群的状态,从而释放空间并减少存储需求。此外,为了保证客户端与集群的交互,Raft算法设计了客户端协议,允许客户端直接与leader节点通信或通过中间节点转发请求。客户端协议还包含了重试机制,确保了在leader故障时,客户端能够继续尝试发送请求,并通过唯一ID来防止重复执行同一命令。
总之,Raft共识算法通过其独特的设计和机制,提供了一个高效、鲁棒且易于理解的解决方案,适用于各种分布式系统中需要达成共识的场景。通过深入理解Raft算法的各个组成部分及其工作原理,可以更好地将其应用于实际系统中,解决分布式系统中的各种挑战。
Raft 算法原理及其在 CMQ 中的应用(上)
Raft算法是分布式一致性算法中的一种,其设计易于理解与工程化应用,相较于paxos,其优势在于简化了复杂度,更便于开发者实现与优化。本文重点介绍了Raft算法的原理、在工程化过程中的挑战与解决方案、以及为了提高性能而采取的措施,并以腾讯云中间件团队的自研高可靠消息中间件CMQ为例,详细阐述了如何将Raft算法应用于实际场景中。
在分布式系统领域,Raft算法因其在保证CP条件下的高可用性而受到广泛关注。分布式系统需要在扩展性、可用性和分区容忍性之间做出权衡,而Raft算法在满足CP条件的同时,通过允许大多数节点正常互联,显著提高了系统的投诉建议源码可用性。
基于Raft算法构建的消息中间件CMQ,旨在解决金融支付类业务对数据强一致性和高可靠性的要求。在对比了主流消息中间件如RabbitMQ、Kafka、RocketMQ和SQS后,发现它们在处理这类场景时存在一定的局限性。CMQ通过采用Raft算法,设计了强一致性和高可靠性的消息传递机制,有效弥补了传统中间件的不足。
Raft算法的核心原理包括选举和日志同步两个阶段。选举阶段的目标是选举出一个Leader节点,该节点负责接收客户端请求并同步到其他节点。在选举过程中,节点通过轮询或收到请求来触发选举,一旦Leader节点失效,系统会迅速通过选举机制选出新的Leader。日志同步阶段,Leader节点将接收到的请求封装为Entry,并通过AppendEntry RPC将这些Entry同步到其他节点的日志中。通过这种方式,确保了所有节点的日志数据的一致性。
为了提高Raft算法的性能,文中提到在实现过程中对选举超时值进行了随机化设置,以减少选举冲突的概率。同时,为了确保数据不丢失,每次日志写入都需要进行磁盘刷写操作。此外,文中还详细介绍了如何处理日志冲突、异常场景下的系统恢复以及集群管理,包括节点添加、删除和故障恢复等。
在应用Raft算法构建的CMQ中,业务模块通过State Machine与Raft算法交互,实现对日志的读取和应用。客户端请求首先发送给Leader节点,然后被转化为Entry同步到其他节点,一旦大多数节点写入成功,会更新CommitIndex。各节点的State Machine会根据ApplyIndex顺序读取并应用Entry中的业务数据,完成消息的处理。
为了应对节点重启时的雷达辅助源码快照管理问题,文中提出了定期创建快照的解决方案,这样可以在节点重启时快速恢复状态,而无需从头开始应用所有日志,从而提高了系统的恢复效率。
最后,文中总结了Raft算法在分布式系统中的优点,包括强一致性和高可用性,并提供了一些文章供读者进一步学习。通过深入理解Raft算法的原理及其在实际应用中的优化,开发者可以更好地构建和优化分布式系统,以满足高可靠性和高性能的需求。
Raft算法图文解析
深入探索 Raft 算法:分布式一致性守护神 在分布式系统中,Raft算法犹如一座桥梁,连接着服务器集群的稳定性和数据一致性。它巧妙地运用领导者、跟随者和候选者的角色,以确保在主服务器故障时能够无缝切换,维持系统的正常运行。以下,让我们一起剖析 Raft 的核心原理和关键步骤。领导者的诞生与协作
- Raft 的基础是三个核心角色:领导者、跟随者和候选者。领导者负责接收、处理和同步命令,通过大多数服务器的共识来确保命令的正确执行。当系统中出现故障时,会通过任期选举机制,选出新的领导者,确保任期内只有一个决策中心。
日志管理的智慧
- 日志是 Raft 的核心载体,命令在这里被安全地记录下来。领导者与跟随者通过一致的日志保持同步,即使在故障恢复后,也能确保数据的一致性。通过严格的任期号和索引检查,系统可以判断日志的完整性,防止潜在的混乱。
特殊情况的处理
- 当多个任期同时出现时,如服务器A和B同时升级,系统会巧妙地通过任期号规则,确保一个任期内只有一个领导者。遇到网络问题,电影推手源码如日志不一致,Raft 会利用任期号和索引进行校验和调整,以维护系统的稳定。
一致性保障的细节
- 当原领导者故障,新领导者需要通过同步日志来重新建立联系。通过设置特定的matchIndex和nextIndex,系统能够监控跟随者的同步状态,避免已提交命令被覆盖。此外,跟随者只在接收到新日志时投票,进一步确保了数据的完整性和一致性。
流程详解候选人公布新的任期信息,跟随者根据这些信息更新自己的状态并投票。
领导者高效处理请求,将命令日志同步给跟随者,同时附带必要的先前状态信息。
面对日志增长,领导者会创建快照,压缩数据,为后续的同步提供便捷。
跟随者在接收到快照后,会根据快照设置新的状态,恢复到最新的同步点。
通过定期的心跳机制,领导者维持与跟随者的连接,避免不必要的选举,确保数据同步的实时性。
总结Raft 算法的每一步都精心设计,从选举机制到日志管理,再到快照压缩,共同编织出一张守护数据一致性与系统稳定性的坚固网。通过这些巧妙的机制,Raft 成为分布式系统中不可或缺的守护者,确保在任何情况下都能保持数据的一致性和系统的可靠性。
光流算法RAFT光流算法使用
RAFT算法主要由三个核心部分构成:特征编码器、特征相关性层与更新操作器。特征编码器负责提取图像特征,类同于Context Encoder,针对第一张输入图像进行操作,以捕获图像信息。特征相关性层通过进行图像特征向量的内积操作实现,同时结合多尺度操作,生成多尺度的correlation volume,以提升算法性能。更新操作器通过迭代优化多尺度的correlation volume,得到预测光流。
在实际应用中,RAFT光流算法展现出卓越的性能。通过精心编写的代码,该算法能够准确捕捉图像间的动态变化,提供精确的光流估计。具体效果可直观体现在以下实例中:应用RAFT算法处理的图像序列,清晰地展示了物体运动轨迹,各帧间的光流场信息被准确重建,展现了算法在视觉运动分析领域的强大能力。
Raft算法笔记——投票选主机制
Raft算法是分布式场景中实现数据一致性的一种常见共识算法。本文将以在tinykv项目中实现Raft算法为例,介绍其核心概念和工作流程。
在Raft中,节点之间通过三种角色/状态(state)和两种timeout机制协作。其中,选举超时(election timeout)和心跳超时(heartbeat timeout)分别用于选举过程和心跳通信。在选举超时后,未收到心跳包的节点会转变为候选人(candidate),随后发起选举,试图成为新的领导者(leader)。而领导者需要在心跳超时后定期发送心跳包,以保持其状态,让其他节点确认其领导地位。如果在选举超时内未接收到心跳包,则非领导者节点会转变为候选人,开启选举流程。
为了防止选举过程中的重复和不公平,选举超时时间会随机化。当两个或多个候选人同时进行选举时,只有得到超过半数节点票数的候选人能当选为领导者。若票数相同,候选人会重新开始选举,避免循环选举的发生。通过随机化选举超时时间,确保候选人几乎不会在下一轮选举中获得相同的票数。
Raft算法中的两个关键消息是MsgAppend和Heartbeat。这两个消息都由领导者发送给跟随者(follower),用于维护节点间的一致性和确保领导者地位。在特定条件下,MsgAppend消息会被发送,用于向跟随者的日志中追加数据,而Heartbeat消息则是领导者定期发送的,用于维护其与跟随者之间的通信,防止其被选举为新的领导者。
在Raft中,领导者任期(Term)是递增的,这意味着新上任的领导者会获得更高的任期编号。节点在改变任期时,应该在成为候选人时进行,而不是在成为领导者后。此外,当接收到比自身任期更高的请求时,节点应转换为跟随者状态,并接受高任期请求,以确保算法的强一致性。
Raft算法中的tick和step机制则用于时间管理和状态机请求的处理。tick机制用于更新心跳和选举时间,而step机制则用于处理上层状态机的请求。对于某些请求,如MsgPropose、MsgHug和MsgBeat等,它们并不关心底层Raft节点的实现细节,也不会关注当前节点的任期,因此需要特殊的处理逻辑。
Raft算法中的MsgRequestVote和MsgRequestVoteResponse消息用于候选人在选举过程中向其他节点请求投票。当候选人收到投票请求时,需要检查投票请求的任期是否高于自身任期。如果请求的任期等于自身任期,且自身不是跟随者,则应拒绝投票。如果请求的任期高于自身,并且自身是候选人,应投票给请求者,并将选举超时时间重置。在收到响应后,候选人会检查其获得的投票总数是否超过半数,从而决定是否成为领导者。
值得注意的是,在只有唯一节点的情况下,Raft算法通常没有实际意义,但tinykv在实现时考虑了这种情况,并在成为候选人时向自身投票,以确保在唯一节点场景下能顺利选举出领导者。
总之,Raft算法通过其高效且简单的设计,提供了一种可靠的分布式一致性解决方案。在实现时,需要考虑各种边界情况和异常处理,以确保算法的稳定性和效率。
万字长文解析raft算法原理
万字详析raft算法原理:从理论到实践的深入探索
在接下来的两周里,我们将深入探讨分布式一致性算法raft的奥秘,分为理论阐述和实践应用两部分。首先,我们进入第一篇章,深入了解raft协议的核心概念和工作原理。 1. 分布式挑战与共识解决 在扩展系统时,纵向增长受限,横向扩展通过增加节点实现负载均衡,但网络环境对集群规模的影响不容忽视。分布式系统的优势在于数据备份和负载均衡,但一致性保证和秩序维护是关键挑战。CAP理论揭示了系统在一致性、可用性和分区容错性之间常常需要取舍。 2. 理解CAP理论 C代表数据正确性,追求像单机一样确保原子性;A强调服务可用性,快速响应;P是分区容错,是分布式系统的核心考量。在CP与AP之间,raft协议寻求在保证系统稳定性的前提下,提高服务的可用性。 3. 一致性难题与解决方案 即时一致性要求快速响应,但C问题的挑战在于确保数据在更新后的立即一致性。raft通过一主多从模式,主节点负责事务处理,保证写入的顺序性,从而提升系统的即时一致性。 4. raft协议的核心机制 raft协议的核心是leader、follower和candidate的角色以及预写日志、状态机等。多数派原则是关键,通过分散决策降低对单点的依赖,确保在多数节点存活时的可用性和一致性。 5. 协议运作细节一主多从:leader发起事务,follower参与决策,形成多数决定。
读写分离:简化操作,可能导致数据一致性风险,需通过日志同步和两阶段提交策略来解决。
6. 选举与状态同步 raft通过心跳和心跳超时机制进行选举,leader负责事务的提交和同步,保证数据最终一致性。同时,处理如 leader 滞后或 follower 落后等情况,以维持系统的稳定。 7. 实际应用中的挑战 网络分区、心跳问题和配置变更时的同步策略,都需要精心设计,如通过提前试探机制避免无意义选举,确保数据一致性。 8. etcd实践 我们将结合etcd源码,将理论与实践相结合,通过实际案例展示raft算法在现代分布式系统中的应用,包括状态机同步、写请求处理等。 9. 后续更新与资源 关注公众号“小徐先生的编程世界”,获取更多原创编程技术内容,特别是关于Go语言的raft工程化案例。一文彻底搞懂Raft算法,看这篇就够了!!!
分布式系统中,维护数据一致性是关键。Raft算法是实现这一目标的一种有效方法。本文深入分析了Raft算法的各个方面,旨在帮助理解其工作原理与实现。
分布式一致性确保了多节点间数据的协调与统一,尤其在高并发环境下的数据读写尤为关键。Raft算法通过角色管理、日志复制与安全机制,实现了这一目标。
算法以多台服务器组成的集群为基础,通过Leader选举、日志同步与安全性保障确保数据一致性。正常工作流程中,Leader接收客户端请求,记录日志,并同步给Follower,最终提交日志。这一过程确保了数据的一致性,并能稳定服务,即使部分节点故障。
Raft算法将问题分解为选举、同步与安全三个子问题。通过任期管理、投票规则与日志压缩,保证了算法的高效与可靠性。安全性保障确保了Leader的唯一性与日志提交的一致性。
在Leader选举中,节点通过请求投票确定新的Leader。Leader选举机制保证了集群的稳定性和高效性。日志同步工作流程则保证了数据的一致性,确保所有节点在任期结束前拥有相同的数据。安全性保障包括多数投票规则与提交规则,确保了数据的一致性与完整性。
实际处理逻辑中,Leader通过AppendEntries RPC向Follower同步日志,确保数据的一致性。安全性扩展如日志压缩与集群成员变更机制,进一步提高了算法的灵活性与稳定性。
总结,Raft算法通过细致的角色管理、高效的数据同步与强大的安全性保障,实现了一种高度可靠与灵活的分布式一致性解决方案。通过深入理解其工作原理,开发人员能够更好地应用这一算法于实际分布式系统中,确保数据一致性与系统稳定性。