【货源网源码】【仿富聊源码】【仙侠类源码】raft算法源码_raft算法代码
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,代码货源网源码负责处理客户端请求并同步日志到集群中的算法算法其他节点。在选举阶段,源码节点会向其他节点发起投票请求,代码收到超过半数节点支持的算法算法候选节点将当选为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算法通过细致的角色管理、高效的数据同步与强大的安全性保障,实现了一种高度可靠与灵活的分布式一致性解决方案。通过深入理解其工作原理,开发人员能够更好地应用这一算法于实际分布式系统中,确保数据一致性与系统稳定性。