1.【20230406】【光流算法】【RAFT光流算法使用】
2.raftç解
3.Raft算法图文解析
4.Raft共识算法
5.Raft算法笔记——投票选主机制
6.一文彻底搞懂Raft算法,算法算法看这篇就够了!源码源码!算法算法!源码源码
【20230406】【光流算法】【RAFT光流算法使用】
RAFT算法主要由三个核心部分构成:特征编码器、算法算法特征相关性层与更新操作器。源码源码cockroachDB 源码分析特征编码器负责提取图像特征,算法算法类同于Context Encoder,源码源码针对第一张输入图像进行操作,算法算法以捕获图像信息。源码源码特征相关性层通过进行图像特征向量的算法算法内积操作实现,同时结合多尺度操作,源码源码生成多尺度的算法算法correlation volume,以提升算法性能。源码源码更新操作器通过迭代优化多尺度的算法算法correlation volume,得到预测光流。
在实际应用中,RAFT光流算法展现出卓越的性能。通过精心编写的代码,该算法能够准确捕捉图像间的动态变化,提供精确的光流估计。具体效果可直观体现在以下实例中:应用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算法的详细解析:
1. 首先,Raft定义了三种服务器状态:领导者、跟随者和候选者。领导者负责命令的同步和确认,需获得大多数跟随者的加盟网+源码投票才能成为合法的领导者。客户端请求通过日志记录,保证状态机一致性。
2. 领导者选举过程基于任期和超时机制。服务器以随机超时避免同时多台服务器选举。当一个跟随者超时,它会发起新任期的选举,通过投票决定新的领导者。每个服务器仅在一个任期中投票一次,确保任期内只产生一个领导者。
3. 日志同步是关键环节。领导者接收客户端请求,将命令添加到日志中并同步给所有跟随者。如果跟随者没有收到命令,领导者会发送缺失的部分。通过matchIndex和nextIndex数组跟踪同步状态,确保所有服务器状态一致。
4. 快照技术用于节省存储空间。当日志长度达到阈值,服务器创建快照并记录当前状态,允许跟随者快速恢复到一致状态。领导者在发送新命令时附带快照信息,帮助跟随者确定哪些日志已包含在快照中。
总结来说,Raft算法通过选举机制、日志同步和快照技术,确保了分布式系统的高可用性和数据一致性。每个步骤都旨在避免数据丢失,确保服务在主服务器故障时能够平稳过渡。
Raft共识算法
Raft共识算法是分布式系统中广泛应用的一种共识算法,其设计目标是提供一个易于理解、实用且安全可用的解决方案。Raft的核心原理在于选举机制和日志复制。选举过程中,节点在特定时间周期内会选举出一个leader,用户管理系统+源码负责处理客户端请求并同步日志到集群中的其他节点。在选举阶段,节点会向其他节点发起投票请求,收到超过半数节点支持的候选节点将当选为leader。leader负责处理所有客户端请求,并通过心跳消息确保集群内节点的状态一致性。如果leader出现故障,集群将重新选举出新的leader。
在日志复制阶段,leader会将处理的请求序列化为日志条目,然后通过leader-to-follower的复制机制将日志条目复制到集群中的其他节点。这个过程确保了即使在部分节点故障的情况下,数据的一致性和可用性。在复制过程中,有一个关键的规则:只有在大多数节点都已经复制了日志条目后,该条目才会被提交到集群的状态机中。这确保了即使在日志条目复制过程中出现节点故障,提交的命令序列仍然能够保持一致。
为了保证选举和日志复制的正确性,Raft算法通过一系列的机制和规则来防止和处理各种异常情况。比如在选举过程中,为了避免选举冲突,选举超时时间被设计为随机值。同时,为了防止旧的leader状态被覆盖,Raft算法在日志复制时会保留每个日志条目的任期号,这有助于在选举过程中选择最新的leader。在日志复制过程中,如果出现节点状态不一致的情况,Raft算法会通过重新复制日志条目来解决不一致的问题。当leader挂掉时,集群会重新选举新的leader,新leader只处理当前任期的日志条目,而不会影响到之前已经提交的-13/64的源码命令。
对于成员变更问题,Raft算法通过逐步添加新节点来避免同时存在两个leader的情况。当需要添加新节点时,算法会先更新集群配置,然后通过重新选举来确保正确的leader状态。在成员变更过程中,Raft算法通过日志条目来记录集群配置的变更,这使得在日志中包含了对集群状态的更改。
为了处理无限增长的日志条目和有限存储空间之间的矛盾,Raft算法采用了日志压缩技术,通过快照的方式保留集群的状态,从而释放空间并减少存储需求。此外,为了保证客户端与集群的交互,Raft算法设计了客户端协议,允许客户端直接与leader节点通信或通过中间节点转发请求。客户端协议还包含了重试机制,确保了在leader故障时,客户端能够继续尝试发送请求,并通过唯一ID来防止重复执行同一命令。
总之,Raft共识算法通过其独特的设计和机制,提供了一个高效、鲁棒且易于理解的解决方案,适用于各种分布式系统中需要达成共识的场景。通过深入理解Raft算法的各个组成部分及其工作原理,可以更好地将其应用于实际系统中,解决分布式系统中的各种挑战。
Raft算法笔记——投票选主机制
Raft算法是分布式场景中实现数据一致性的一种常见共识算法。本文将以在tinykv项目中实现Raft算法为例,介绍其核心概念和工作流程。
在Raft中,节点之间通过三种角色/状态(state)和两种timeout机制协作。其中,黄S站源码选举超时(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算法通过角色管理、日志复制与安全机制,实现了这一目标。
算法以多台服务器组成的集群为基础,通过Leader选举、日志同步与安全性保障确保数据一致性。正常工作流程中,Leader接收客户端请求,记录日志,并同步给Follower,最终提交日志。这一过程确保了数据的一致性,并能稳定服务,即使部分节点故障。
Raft算法将问题分解为选举、同步与安全三个子问题。通过任期管理、投票规则与日志压缩,保证了算法的高效与可靠性。安全性保障确保了Leader的唯一性与日志提交的一致性。
在Leader选举中,节点通过请求投票确定新的Leader。Leader选举机制保证了集群的稳定性和高效性。日志同步工作流程则保证了数据的一致性,确保所有节点在任期结束前拥有相同的数据。安全性保障包括多数投票规则与提交规则,确保了数据的一致性与完整性。
实际处理逻辑中,Leader通过AppendEntries RPC向Follower同步日志,确保数据的一致性。安全性扩展如日志压缩与集群成员变更机制,进一步提高了算法的灵活性与稳定性。
总结,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算法的原理及其在实际应用中的优化,开发者可以更好地构建和优化分布式系统,以满足高可靠性和高性能的需求。