Raft忣åæã¢ã«ãŽãªãºã ã®åºæ¬ååãåäœãå®è£ ããããŠå埩åã®ããã°ããŒãã«ã·ã¹ãã æ§ç¯ãžã®å¿çšã解説ããŸãã
忣åæã®ç¿åŸïŒã°ããŒãã«ã·ã¹ãã åãRaftã¢ã«ãŽãªãºã å®è£ ã®è©³çŽ°è§£èª¬
ãŸããŸãçžäºæ¥ç¶ãé²ãçŸä»£äžçã«ãããŠã忣ã·ã¹ãã ã¯eã³ããŒã¹ãã©ãããã©ãŒã ãéèæ©é¢ãããã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°åºç€ããªã¢ã«ã¿ã€ã éä¿¡ããŒã«ã«è³ããŸã§ãã»ãŒãã¹ãŠã®ããžã¿ã«ãµãŒãã¹ã®ããã¯ããŒã³ãšãªã£ãŠããŸãããããã®ã·ã¹ãã ã¯ãã¯ãŒã¯ããŒããšããŒã¿ãè€æ°ã®ãã·ã³ã«åæ£ãããããšã§ãæ¯é¡ã®ãªãã¹ã±ãŒã©ããªãã£ãå¯çšæ§ãå埩åãæäŸããŸãããããããã®åã«ã¯é倧ãªèª²é¡ã䌎ããŸããããã¯ããããã¯ãŒã¯ã®é å»¶ãããŒãã®é害ãåææäœã«çŽé¢ããŠãããã¹ãŠã®ã³ã³ããŒãã³ããã·ã¹ãã ã®ãç¶æ ãã«ã€ããŠåæããããšãä¿èšŒããããšã§ãããã®åºæ¬çãªåé¡ã¯åæ£åæãšããŠç¥ãããŠããŸãã
éåæã§é害ãçºçãããã忣ç°å¢ã§åæãéæããããšã¯ãéåžžã«è€éã§ããããšã§ç¥ãããŠããŸããæ°å幎ã«ãããããã®èª²é¡ã解決ããããã®äž»èŠãªã¢ã«ãŽãªãºã ã¯Paxosã§ããããã®çè«çãªå¥å šæ§ã¯é«ãè©äŸ¡ãããŠããŸããããè€éã§å®è£ ãé£ãããšãã°ãã°æ¹å€ãããŠããŸãããããã«ç»å Žããã®ããããããããã第äžã®ç®æšãšããŠèšèšãããã¢ã«ãŽãªãºã ãRaftã§ããRaftã¯ããã©ãŒã«ããã¬ã©ã³ã¹ãšããã©ãŒãã³ã¹ã®ç¹ã§Paxosãšåçã§ãããªãããéçºè ãã¯ããã«ææ¡ããããããã®äžã«æ§ç¯ããããæ§é ãç®æããŠããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãRaftã¢ã«ãŽãªãºã ãæ·±ãæãäžãããã®åºæ¬ååãåäœã¡ã«ããºã ãå®è·µçãªå®è£ äžã®èæ ®äºé ããããŠå ç¢ã§ã°ããŒãã«ã«åæ£ãããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§ã®éèŠãªåœ¹å²ãæ¢ããŸããããªããçµéšè±å¯ãªã¢ãŒããã¯ãã§ããã忣ã·ã¹ãã ã®ãšã³ãžãã¢ã§ããããããã¯é«å¯çšæ§ãµãŒãã¹ãæ§ç¯ããããšãç®æãéçºè ã§ãããRaftãçè§£ããããšã¯ãçŸä»£ã®ã³ã³ãã¥ãŒãã£ã³ã°ã®è€éããç¿åŸããããã®äžå¯æ¬ ãªäžæ©ã§ãã
çŸä»£ã¢ãŒããã¯ãã£ã«ããã忣åæã®äžå¯æ¬ ãªå¿ èŠæ§
äžçèŠæš¡ã®eã³ããŒã¹ãã©ãããã©ãŒã ãæ¯ç§æ°çŸäžã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããŠãããšæ³åããŠã¿ãŠãã ããã顧客ããŒã¿ãåšåº«ã¬ãã«ã泚æã¹ããŒã¿ã¹ãªã©ããã¹ãŠã倧éžããŸãã倿°ã®ããŒã¿ã»ã³ã¿ãŒéã§äžè²«æ§ãä¿ã€å¿ èŠããããŸããè€æ°ã®ãµãŒããŒã«åæ£ãããéè¡ã·ã¹ãã ã®å°åž³ã¯ãå£åº§æ®é«ã«ã€ããŠäžç¬ã®äžäžèŽãèš±ãããŸããããããã®ã·ããªãªã¯ã忣åæãããã«éèŠã§ããããæµ®ã圫ãã«ããŠããŸãã
忣ã·ã¹ãã ã«å åšãã課é¡
忣ã·ã¹ãã ã¯ããã®æ§è³ªäžãã¢ããªã·ãã¯ãªã¢ããªã±ãŒã·ã§ã³ã«ã¯ååšããªãç¡æ°ã®èª²é¡ããããããŸãããããã®èª²é¡ãçè§£ããããšã¯ãRaftã®ãããªã¢ã«ãŽãªãºã ã®æŽç·Žæ§ãšå¿ èŠæ§ãèªèããäžã§äžå¯æ¬ ã§ãã
- éšåçé害ïŒåäœãããå®å šã«åæ¢ãããã®åäžãµãŒããŒãšã¯ç°ãªãã忣ã·ã¹ãã ã§ã¯äžéšã®ããŒããé害ãèµ·ãããŠãä»ã®ããŒããåäœãç¶ããããšããããŸãããµãŒããŒãã¯ã©ãã·ã¥ãããããããã¯ãŒã¯æ¥ç¶ãåæããããããã£ã¹ã¯ãç ŽæãããããŠããã¯ã©ã¹ã¿ãŒã®æ®ãã®éšåã¯æ©èœãç¶ããŸããã·ã¹ãã ã¯ããããã®éšåçé害ã«ãããããããæ£ããåäœãç¶ããªããã°ãªããŸããã
- ãããã¯ãŒã¯åæïŒããŒããæ¥ç¶ãããããã¯ãŒã¯ã¯åžžã«ä¿¡é Œã§ãããšã¯éããŸããããããã¯ãŒã¯åæã¯ãããŒãã®ãµãã»ããéã®éä¿¡ãéçµ¶ããå®éã«ã¯çšŒåããŠããã«ãããããããç¹å®ã®ããŒããé害ãèµ·ãããããã«èŠããå Žåã«çºçããŸããã·ã¹ãã ã®ç°ãªãéšåãå€ãæ å ±ãççŸããæ å ±ã«åºã¥ããŠç¬ç«ããŠåäœãããã¹ããªãããã¬ã€ã³ãã·ããªãªã解決ããããšã¯ãåæåé¡ã®äžæ žã§ãã
- éåæéä¿¡ïŒããŒãéã®ã¡ãã»ãŒãžã¯é å»¶ãé åºã®å ¥ãæ¿ããããŸãã¯å®å šã«å€±ãããå¯èœæ§ããããŸããã°ããŒãã«ãªã¯ããã¯ãã¡ãã»ãŒãžé ä¿¡æéã«é¢ããä¿èšŒããªããããã€ãã³ãã®äžè²«ããé åºã決å®çãªã·ã¹ãã ç¶æ ã確ç«ããããšãå°é£ã§ãã
- åæå®è¡æ§ïŒè€æ°ã®ããŒããåãããŒã¿çãæŽæ°ããããšããããåæã«ã¢ã¯ã·ã§ã³ãéå§ãããããå¯èœæ§ããããŸãããããã®æäœã調æŽããã¡ã«ããºã ããªããã°ãç«¶åãäžæŽåã¯é¿ããããŸããã
- äºæž¬äžå¯èœãªã¬ã€ãã³ã·ïŒç¹ã«ã°ããŒãã«ã«åæ£ããããããã€ã¡ã³ãã§ã¯ããããã¯ãŒã¯ã¬ã€ãã³ã·ã¯å€§å¹ ã«å€åããå¯èœæ§ããããŸããããå°åã§ã¯é«éãªæäœããå¥ã®å°åã§ã¯é ããªãå¯èœæ§ããããæææ±ºå®ããã»ã¹ã調æŽã«åœ±é¿ãäžããŸãã
ãªãåæãä¿¡é Œæ§ã®ç€ç³ãªã®ã
åæã¢ã«ãŽãªãºã ã¯ããããã®èª²é¡ã解決ããããã®åºæ¬çãªæ§æèŠçŽ ãæäŸããŸãããããã¯ãä¿¡é Œæ§ã®äœãã³ã³ããŒãã³ãã®éåäœããåäžã§ä¿¡é Œæ§ãé«ããäžè²«æ§ã®ãããŠããããšããŠéåçã«æ©èœããããšãå¯èœã«ããŸããå ·äœçã«ã¯ãåæã¯ä»¥äžã®éæã«åœ¹ç«ã¡ãŸãã
- ã¹ããŒããã·ã³ã¬ããªã±ãŒã·ã§ã³ (SMR)ïŒå€ãã®ãã©ãŒã«ããã¬ã©ã³ããªåæ£ã·ã¹ãã ã®äžå¿çãªèãæ¹ã§ãããã¹ãŠã®ããŒããæäœã®é åºã«åæããåããŒããåãåæç¶æ ã§å§ãŸãããããã®æäœãåãé åºã§å®è¡ããã°ããã¹ãŠã®ããŒãã¯åãæçµç¶æ ã«å°éããŸããåæã¯ããã®ã°ããŒãã«ãªæäœã®é åºã«åæããããã®ã¡ã«ããºã ã§ãã
- é«å¯çšæ§ïŒããŒãã®å°æ°æŽŸãé害ãèµ·ãããŠãã·ã¹ãã ãåäœãç¶ããããšãå¯èœã«ããããšã§ãåæã¯ãµãŒãã¹ãã¢ã¯ã»ã¹å¯èœã§æ©èœçã§ããç¶ããããšãä¿èšŒããããŠã³ã¿ã€ã ãæå°éã«æããŸãã
- ããŒã¿äžè²«æ§ïŒããŒã¿ã®ãã¹ãŠã®ã¬ããªã«ãåæãä¿ã€ããšãä¿èšŒããç«¶åããæŽæ°ãé²ããã¯ã©ã€ã¢ã³ããåžžã«ææ°ã§æ£ããæ å ±ãèªã¿åãããšãä¿èšŒããŸãã
- ãã©ãŒã«ããã¬ã©ã³ã¹ïŒã·ã¹ãã ã¯ãç¹å®æ°ã®ä»»æã®ããŒãé害ïŒéåžžã¯ã¯ã©ãã·ã¥é害ïŒã蚱容ãã人çºçãªä»å ¥ãªãã«é²æãç¶ããããšãã§ããŸãã
Raftã®ç޹ä»ïŒåæãžã®ããããããã¢ãããŒã
Raftã¯ã忣åæã身è¿ãªãã®ã«ãããšããæç¢ºãªç®çãæã£ãŠåŠè¡çããçãŸããŸããããã®èè ã§ããDiego OngaroãšJohn Ousterhoutã¯ãRaftãæç¢ºã«ããããããã®ããã«èšèšããåæã¢ã«ãŽãªãºã ã®ããåºç¯ãªæ¡çšãšæ£ããå®è£ ãå¯èœã«ããããšãç®æããŸããã
Raftã®æ žå¿èšèšå²åŠïŒãããããã第äž
Raftã¯ãè€éãªåæåé¡ãããããããç¬èªã®ç¹å®ã®ã«ãŒã«ãšåäœãæã€ãæ¯èŒçç¬ç«ããããã€ãã®ãµããããã¬ã ã«åè§£ããŸãããã®ã¢ãžã¥ãŒã«æ§ãçè§£ã倧ãã«å©ããŸããäž»èŠãªèšèšååã«ã¯ä»¥äžãå«ãŸããŸãã
- ãªãŒããŒäžå¿ã®ã¢ãããŒãïŒãã¹ãŠã®ããŒããæææ±ºå®ã«çããåå ããä»ã®ããã€ãã®åæã¢ã«ãŽãªãºã ãšã¯ç°ãªããRaftã¯åäžã®ãªãŒããŒãæå®ããŸãããªãŒããŒã¯è€è£œããããã°ã®ç®¡çãšãã¹ãŠã®ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®èª¿æŽãæ åœããŸããããã«ããããã°ç®¡çãç°¡çŽ åãããããŒãéã®çžäºäœçšã®è€éãã軜æžãããŸãã
- 匷åãªãªãŒããŒïŒãªãŒããŒã¯ãæ°ãããã°ãšã³ããªãææ¡ãããããããã€ã³ããããããããæ±ºå®ããç©¶æ¥µã®æš©åšã§ãããã©ãã¯ãŒã¯ååçã«ãªãŒããŒã®ãã°ãè€è£œãããªãŒããŒã®ãªã¯ãšã¹ãã«å¿çããŸãã
- 決å®è«çãªéžåºïŒRaftã¯ã©ã³ãã åãããéžæã¿ã€ã ã¢ãŠããæ¡çšããŠãç¹å®ã®éžææéã§éåžž1ã€ã®åè£è ã®ã¿ããªãŒããŒãšããŠéžåºãããããšãä¿èšŒããŸãã
- ãã°ã®äžè²«æ§ïŒRaftã¯ããã®è€è£œãã°ã«åŒ·åãªäžè²«æ§ç¹æ§ã匷å¶ããã³ãããããããšã³ããªã決ããŠããŒã«ããã¯ãããããã¹ãŠã®ã³ãããããããšã³ããªãæçµçã«ãã¹ãŠã®å©çšå¯èœãªããŒãã«çŸããããšãä¿èšŒããŸãã
Paxosãšã®ç°¡åãªæ¯èŒ
Raft以åã¯ãPaxosã忣åæã®äºå®äžã®æšæºã§ããã匷åã§ããäžæ¹ãPaxosã¯çè§£ããæ£ããå®è£ ããããšãéåžžã«é£ããããšã§ç¥ãããŠããŸãããã®èšèšã¯ã圹å²ïŒproposer, acceptor, learnerïŒãåé¢ããè€æ°ã®ãªãŒããŒãåæã«ååšããããšãèš±å¯ããïŒãã ããå€ãã³ãããã§ããã®ã¯1ã€ã ãïŒãããè€éãªçžäºäœçšããšããžã±ãŒã¹ã«ã€ãªããå¯èœæ§ããããŸãã
å¯Ÿç §çã«ãRaftã¯ç¶æ 空éãåçŽåããŸãããªãŒããŒããã¹ãŠã®ãã°ã®å€æŽã«è²¬ä»»ãæã€åŒ·åãªãªãŒããŒã¢ãã«ã匷å¶ããŸãã圹å²ïŒãªãŒããŒããã©ãã¯ãŒãåè£è ïŒãšãããã®éã®é·ç§»ãæç¢ºã«å®çŸ©ããŸãããã®æ§é ã«ãããRaftã®åäœã¯ããçŽæçã§æšè«ãããããªããå®è£ ãã°ãå°ãªããªããéçºãµã€ã¯ã«ãéããªããŸããåœåPaxosã§èŠåŽããå€ãã®å®äžçã®ã·ã¹ãã ã¯ãRaftãæ¡çšããããšã§æåãåããŠããŸãã
Raftã«ããã3ã€ã®åºæ¬çãªåœ¹å²
Raftã¯ã©ã¹ã¿ãŒå ã®åãµãŒããŒã¯ãåžžã«ãªãŒããŒããã©ãã¯ãŒããŸãã¯åè£è ã®3ã€ã®ç¶æ ã®ããããã«ãããŸãããããã®åœ¹å²ã¯æä»çãã€åçã§ããããµãŒããŒã¯ç¹å®ã®ã«ãŒã«ãšã€ãã³ãã«åºã¥ããŠãããã®éãé·ç§»ããŸãã
1. ãã©ãã¯ãŒ
- ååçãªåœ¹å²ïŒãã©ãã¯ãŒã¯Raftã§æãååçãªç¶æ ã§ãããªãŒããŒãåè£è ããã®ãªã¯ãšã¹ãã«åã«å¿çããŸãã
-
ããŒãããŒãã®åä¿¡ïŒãã©ãã¯ãŒã¯ããªãŒããŒãã宿çã«ããŒãããŒãïŒç©ºã®AppendEntries RPCïŒãåä¿¡ããããšãæåŸ
ããŠããŸãããã©ãã¯ãŒãç¹å®ã®
election timeoutæéå ã«ããŒãããŒããŸãã¯AppendEntries RPCãåä¿¡ããªãå ŽåããªãŒããŒãé害ãèµ·ããããšã¿ãªããåè£è ç¶æ ã«é·ç§»ããŸãã - æç¥šïŒéžæäžããã©ãã¯ãŒã¯1ã€ã®termïŒä»»æïŒã«ã€ãæå€§1人ã®åè£è ã«æç¥šããŸãã
- ãã°è€è£œïŒãã©ãã¯ãŒã¯ãªãŒããŒã®æç€ºã«åŸã£ãŠãããŒã«ã«ãã°ã«ãã°ãšã³ããªã远å ããŸãã
2. åè£è
- éžæã®éå§ïŒãã©ãã¯ãŒãã¿ã€ã ã¢ãŠãïŒãªãŒããŒããã®é£çµ¡ããªãïŒãããšãåè£è ç¶æ ã«é·ç§»ããŠæ°ããéžæãéå§ããŸãã
-
èªå·±æç¥šïŒåè£è
ã¯èªèº«ã®
current termãã€ã³ã¯ãªã¡ã³ãããèªåèªèº«ã«æç¥šããã¯ã©ã¹ã¿ãŒå ã®ä»ã®ãã¹ãŠã®ãµãŒããŒã«RequestVoteRPCãéä¿¡ããŸãã - éžæã®åå©ïŒåè£è ãåãtermïŒä»»æïŒã«å¯ŸããŠã¯ã©ã¹ã¿ãŒå ã®ãµãŒããŒã®éåæ°ãã祚ãç²åŸããå ŽåããªãŒããŒç¶æ ã«é·ç§»ããŸãã
- éæ ŒïŒåè£è ãããé«ãtermïŒä»»æïŒãæã€å¥ã®ãµãŒããŒãçºèŠããå ŽåããŸãã¯æ£åœãªãªãŒããŒããAppendEntries RPCãåä¿¡ããå Žåããã©ãã¯ãŒç¶æ ã«æ»ããŸãã
3. ãªãŒããŒ
- å¯äžã®æš©åšïŒRaftã¯ã©ã¹ã¿ãŒã«ã¯ãç¹å®ã®termïŒä»»æïŒã«ãããŠåžžã«1人ã®ãªãŒããŒããååšããŸããããªãŒããŒã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ããšã®å¯Ÿè©±ããã°è€è£œãããã³äžè²«æ§ã®ä¿èšŒãæ åœããŸãã
-
ããŒãããŒãã®éä¿¡ïŒãªãŒããŒã¯å®æçã«
AppendEntriesRPCïŒããŒãããŒãïŒããã¹ãŠã®ãã©ãã¯ãŒã«éä¿¡ãããã®æš©åšãç¶æããæ°ããéžæãé²ããŸãã - ãã°ç®¡çïŒãªãŒããŒã¯ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ããåãå ¥ããæ°ãããã°ãšã³ããªãããŒã«ã«ãã°ã«è¿œå ãããããã®ãšã³ããªããã¹ãŠã®ãã©ãã¯ãŒã«è€è£œããŸãã
- ã³ãããïŒãªãŒããŒã¯ããšã³ããªããµãŒããŒã®éåæ°ã«å®å šã«è€è£œãããã¹ããŒããã·ã³ã«ã³ãããã§ããææãæ±ºå®ããŸãã
-
éæ ŒïŒãªãŒããŒãããé«ã
termãæã€ãµãŒããŒãçºèŠããå Žåãå³åº§ã«éæ ŒããŠãã©ãã¯ãŒã«æ»ããŸããããã«ãããã·ã¹ãã ãåžžã«æãé«ãæ¢ç¥ã®termã§é²æããããšãä¿èšŒãããŸãã
Raftã®åäœãã§ãŒãºïŒè©³çްãªãŠã©ãŒã¯ã¹ã«ãŒ
Raftã¯ããªãŒããŒéžåºãšãã°è€è£œã®é£ç¶çãªãµã€ã¯ã«ãéããŠåäœããŸããããã2ã€ã®äž»èŠãªã¡ã«ããºã ã¯ãéèŠãªå®å šæ§ç¹æ§ãšãšãã«ãã¯ã©ã¹ã¿ãŒãäžè²«æ§ãšãã©ãŒã«ããã¬ã©ã³ã¹ãç¶æããããšãä¿èšŒããŸãã
1. ãªãŒããŒéžåº
ãªãŒããŒéžåºããã»ã¹ã¯Raftã®éçšã«ãããŠåºæ¬çã§ãããã¯ã©ã¹ã¿ãŒãã¢ã¯ã·ã§ã³ã調æŽããããã®åäžã®æš©åšããããŒããåžžã«æã€ããšãä¿èšŒããŸãã
-
éžæã¿ã€ã ã¢ãŠãïŒåãã©ãã¯ãŒã¯ãã©ã³ãã åããã
election timeoutïŒéåžž150-300msïŒãç¶æããŸãããã©ãã¯ãŒããã®ã¿ã€ã ã¢ãŠãæéå ã«çŸåšã®ãªãŒããŒããéä¿¡ïŒããŒãããŒããŸãã¯AppendEntries RPCïŒãåãåããªãå ŽåããªãŒããŒãé害ãèµ·ããããããããã¯ãŒã¯åæãçºçãããšã¿ãªããŸãã -
åè£è
ãžã®é·ç§»ïŒã¿ã€ã ã¢ãŠããããšããã©ãã¯ãŒã¯
Candidateç¶æ ã«é·ç§»ããŸããèªèº«ã®current termãã€ã³ã¯ãªã¡ã³ãããèªåèªèº«ã«æç¥šããéžæã¿ã€ããŒããªã»ããããŸãã -
RequestVote RPCïŒæ¬¡ã«ãåè£è
ã¯ã¯ã©ã¹ã¿ãŒå
ã®ä»ã®ãã¹ãŠã®ãµãŒããŒã«
RequestVoteRPCãéä¿¡ããŸãããã®RPCã«ã¯ãåè£è ã®current termãcandidateIdãããã³èªèº«ã®last log indexãšlast log termã«é¢ããæ å ±ãå«ãŸããŸãïŒããããªãå®å šæ§ã«ãšã£ãŠéèŠãªã®ãã¯åŸè¿°ããŸãïŒã -
æç¥šã«ãŒã«ïŒãµãŒããŒã¯ã以äžã®å Žåã«åè£è
ã«æç¥šãèš±å¯ããŸãïŒ
-
èªèº«ã®
current termãåè£è ã®term以äžã§ããããšã - çŸåšã®termã§ãŸã ä»ã®åè£è ã«æç¥šããŠããªãããšã
-
åè£è
ã®ãã°ãèªèº«ã®ãã®ãšå°ãªããšãåçã«ææ°ã§ããããšãããã¯ãæåã«
last log termãæ¯èŒããtermãåãå Žåã¯last log indexãæ¯èŒããŠå€æãããŸããåè£è ã®ãã°ãæç¥šè ã®ãã°ã«å«ãŸãããã¹ãŠã®ã³ãããæžã¿ãšã³ããªãå«ãã§ããå Žåããã®åè£è ã¯ãææ°ããšã¿ãªãããŸããããã¯éžæå¶éãšããŠç¥ãããå®å šæ§ã«ãšã£ãŠéåžžã«éèŠã§ãã
-
èªèº«ã®
-
éžæã®åå©ïŒåè£è
ã¯ãåãtermã«å¯ŸããŠã¯ã©ã¹ã¿ãŒå
ã®ãµãŒããŒã®éåæ°ãã祚ãç²åŸãããšãæ°ãããªãŒããŒã«ãªããŸããéžåºããããšãæ°ãããªãŒããŒã¯ããã«ä»ã®ãã¹ãŠã®ãµãŒããŒã«
AppendEntriesRPCïŒããŒãããŒãïŒãéä¿¡ãããã®æš©åšã確ç«ããæ°ããéžæãé²ããŸãã - 祚ã®åå²ãšå詊è¡ïŒè€æ°ã®åè£è ãåæã«çŸããã©ã®åè£è ãéåæ°ãç²åŸã§ããªã祚ã®åå²ãçºçããå¯èœæ§ããããŸããããã解決ããããã«ãååè£è ã¯ã©ã³ãã åãããéžæã¿ã€ã ã¢ãŠããæã¡ãŸããåè£è ã®ã¿ã€ã ã¢ãŠããéžæã«åã€ãæ°ãããªãŒããŒããã®é£çµ¡ãªãã«æéåãã«ãªã£ãå Žåãtermãã€ã³ã¯ãªã¡ã³ãããŠæ°ããéžæãéå§ããŸããã©ã³ãã åã¯ã祚ã®åå²ãçšã§ãããè¿ éã«è§£æ±ºãããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
-
ããé«ãTermã®çºèŠïŒåè£è
ïŒãŸãã¯ä»»æã®ãµãŒããŒïŒãèªèº«ã®
current termããé«ãtermãæã€RPCãåä¿¡ããå Žåãå³åº§ã«èªèº«ã®current termãããé«ãå€ã«æŽæ°ããfollowerç¶æ ã«æ»ããŸããããã«ãããå€ãæ å ±ãæã€ãµãŒããŒããªãŒããŒã«ãªãããšããããæ£åœãªãªãŒããŒã劚害ãããããããšããªããªããŸãã
2. ãã°è€è£œ
ãªãŒããŒãéžåºããããšããã®äž»ãªè²¬ä»»ã¯è€è£œããããã°ã管çããã¯ã©ã¹ã¿ãŒå šäœã®äžè²«æ§ã確ä¿ããããšã§ããããã«ã¯ãã¯ã©ã€ã¢ã³ãã³ãã³ãã®åãå ¥ãããã°ãžã®è¿œå ããã©ãã¯ãŒãžã®è€è£œãå«ãŸããŸãã
- ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãïŒãã¹ãŠã®ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãïŒã¹ããŒããã·ã³ã«ãã£ãŠå®è¡ãããã³ãã³ãïŒã¯ãªãŒããŒã«éãããŸããã¯ã©ã€ã¢ã³ãããã©ãã¯ãŒã«é£çµ¡ããå Žåããã©ãã¯ãŒã¯ãã®ãªã¯ãšã¹ããçŸåšã®ãªãŒããŒã«ãªãã€ã¬ã¯ãããŸãã
-
ãªãŒããŒã®ãã°ãžã®è¿œå ïŒãªãŒããŒãã¯ã©ã€ã¢ã³ãã³ãã³ããåä¿¡ãããšããã®ã³ãã³ããæ°ãã
log entryãšããŠããŒã«ã«ãã°ã«è¿œå ããŸããåãã°ãšã³ããªã«ã¯ãã³ãã³ãèªäœãåä¿¡ããtermãããã³ãã®log indexãå«ãŸããŸãã -
AppendEntries RPCïŒæ¬¡ã«ããªãŒããŒã¯ãã¹ãŠã®ãã©ãã¯ãŒã«
AppendEntriesRPCãéä¿¡ããæ°ãããã°ãšã³ããªïŒãŸãã¯ãšã³ããªã®ãããïŒãããããã®ãã°ã«è¿œå ããããèŠæ±ããŸãããããã®RPCã«ã¯ä»¥äžãå«ãŸããŸãïŒ-
term: ãªãŒããŒã®çŸåšã®termã -
leaderId: ãªãŒããŒã®IDïŒãã©ãã¯ãŒãã¯ã©ã€ã¢ã³ãããªãã€ã¬ã¯ãããããïŒã -
prevLogIndex: æ°ãããšã³ããªã®çŽåã®ãã°ãšã³ããªã®ã€ã³ããã¯ã¹ã -
prevLogTerm:prevLogIndexãšã³ããªã®termãããã2ã€ïŒprevLogIndexãprevLogTermïŒã¯ãã°ãããã³ã°ç¹æ§ã«ãšã£ãŠéèŠã§ãã -
entries[]: ä¿åãããã°ãšã³ããªïŒããŒãããŒãã®å Žåã¯ç©ºïŒã -
leaderCommit: ãªãŒããŒã®commitIndexïŒã³ããããããããšãããã£ãŠããæãé«ããã°ãšã³ããªã®ã€ã³ããã¯ã¹ïŒã
-
-
äžè²«æ§ãã§ãã¯ïŒãã°ãããã³ã°ç¹æ§ïŒïŒãã©ãã¯ãŒã
AppendEntriesRPCãåä¿¡ãããšãäžè²«æ§ãã§ãã¯ãå®è¡ããŸããèªèº«ã®ãã°ã«prevLogIndexã«prevLogTermãšäžèŽããtermãæã€ãšã³ããªãå«ãŸããŠãããã確èªããŸãããã®ãã§ãã¯ã倱æããå Žåããã©ãã¯ãŒã¯AppendEntriesRPCãæåŠãããªãŒããŒã«èªèº«ã®ãã°ãäžæŽåã§ããããšãéç¥ããŸãã -
äžæŽåã®è§£æ±ºïŒãã©ãã¯ãŒã
AppendEntriesRPCãæåŠããå ŽåããªãŒããŒã¯ãã®ãã©ãã¯ãŒã®nextIndexããã¯ãªã¡ã³ãããAppendEntriesRPCãå詊è¡ããŸããnextIndexã¯ããªãŒããŒãç¹å®ã®ãã©ãã¯ãŒã«éä¿¡ããæ¬¡ã®ãã°ãšã³ããªã®ã€ã³ããã¯ã¹ã§ãããã®ããã»ã¹ã¯ãnextIndexããªãŒããŒãšãã©ãã¯ãŒã®ãã°ãäžèŽããç¹ã«éãããŸã§ç¶ããŸããäžèŽãèŠã€ãããšããã©ãã¯ãŒã¯åŸç¶ã®ãã°ãšã³ããªãåãå ¥ããããšãã§ããæçµçã«èªèº«ã®ãã°ããªãŒããŒã®ãã®ãšäžèŽãããŸãã -
ãšã³ããªã®ã³ãããïŒãšã³ããªã¯ããªãŒããŒãããããµãŒããŒã®éåæ°ïŒèªèº«ãå«ãïŒã«æ£åžžã«è€è£œãããšãã«ã³ãããããããšèŠãªãããŸããã³ãããããããšããšã³ããªã¯ããŒã«ã«ã®ã¹ããŒããã·ã³ã«é©çšã§ããŸãããªãŒããŒã¯èªèº«ã®
commitIndexãæŽæ°ãããããåŸç¶ã®AppendEntriesRPCã«å«ããŠããã©ãã¯ãŒã«ã³ãããããããšã³ããªãéç¥ããŸãããã©ãã¯ãŒã¯ããªãŒããŒã®leaderCommitã«åºã¥ããŠèªèº«ã®commitIndexãæŽæ°ãããã®ã€ã³ããã¯ã¹ãŸã§ã®ãšã³ããªãã¹ããŒããã·ã³ã«é©çšããŸãã - ãªãŒããŒå®å šæ§ç¹æ§ïŒRaftã¯ãç¹å®ã®termã§ãã°ãšã³ããªãã³ããããããå Žåããã®åŸç¶ã®ãã¹ãŠã®ãªãŒããŒããã®ãã°ãšã³ããªãæã£ãŠããªããã°ãªããªãããšãä¿èšŒããŸãããã®ç¹æ§ã¯éžæå¶éã«ãã£ãŠåŒ·å¶ãããŸãïŒåè£è ã¯ãèªèº«ã®ãã°ãä»ã®ãµãŒããŒã®éåæ°ãšå°ãªããšãåçã«ææ°ã§ããå Žåã«ã®ã¿éžæã«åã€ããšãã§ããŸããããã«ãããã³ãããããããšã³ããªãäžæžããããèŠéãããããå¯èœæ§ã®ãããªãŒããŒãéžåºãããã®ãé²ããŸãã
3. å®å šæ§ç¹æ§ãšä¿èšŒ
Raftã®å ç¢æ§ã¯ãäžæŽåãé²ããããŒã¿ã®å®å šæ§ãä¿èšŒãããæ éã«èšèšãããããã€ãã®å®å šæ§ç¹æ§ã«ç±æ¥ããŸãã
- éžåºã®å®å šæ§ïŒç¹å®ã®termã§éžåºããããªãŒããŒã¯æå€§1人ã§ããããã¯ããã©ãã¯ãŒã1termã«ã€ãæå€§1祚ããäžãããåè£è ãéåæ°ã®ç¥šãå¿ èŠãšããæç¥šã¡ã«ããºã ã«ãã£ãŠåŒ·å¶ãããŸãã
- ãªãŒããŒå®å šæ§ïŒç¹å®ã®termã§ãã°ãšã³ããªãã³ããããããå Žåããã®ãšã³ããªã¯åŸç¶ã®ãã¹ãŠã®ãªãŒããŒã®ãã°ã«ååšããŸããããã¯ãã³ããããããããŒã¿ã®æå€±ãé²ãããã«éåžžã«éèŠã§ãããäž»ã«éžæå¶éã«ãã£ãŠä¿èšŒãããŸãã
- ãã°ãããã³ã°ç¹æ§ïŒ2ã€ã®ãã°ãåãã€ã³ããã¯ã¹ãštermãæã€ãšã³ããªãå«ãã§ããå Žåããããã®ãã°ã¯å è¡ãããã¹ãŠã®ãšã³ããªã«ãããŠåäžã§ããããã«ããããã°ã®äžè²«æ§ãã§ãã¯ãç°¡çŽ åããããªãŒããŒããã©ãã¯ãŒã®ãã°ãå¹ççã«ææ°ã®ç¶æ ã«ããããšãã§ããŸãã
- ã³ãããã®å®å šæ§ïŒãšã³ããªãäžåºŠã³ãããããããšãããã¯æ±ºããŠå ã«æ»ããããäžæžãããããããããšã¯ãããŸãããããã¯ãªãŒããŒå®å šæ§ãšãã°ãããã³ã°ç¹æ§ã®çŽæ¥çãªçµæã§ãããšã³ããªãã³ãããããããšãããã¯æ°žä¹ ã«ä¿åããããšèŠãªãããŸãã
Raftã«ãããäž»èŠãªæŠå¿µãšã¡ã«ããºã
圹å²ãåäœãã§ãŒãºä»¥å€ã«ããRaftã¯ç¶æ ã管çããæ£åœæ§ãä¿èšŒããããã«ããã€ãã®æ žãšãªãæŠå¿µã«äŸåããŠããŸãã
1. Term (ä»»æ)
Raftã«ãããtermã¯ãé£ç¶çã«å¢å ããæŽæ°ã§ããããã¯ã¯ã©ã¹ã¿ãŒã®è«çã¯ããã¯ãšããŠæ©èœããŸããåtermã¯éžæã§å§ãŸããéžæãæåãããšããã®termã®ããã«åäžã®ãªãŒããŒãéžåºãããŸããtermã¯ãå€ãæ
å ±ãç¹å®ãããµãŒããŒãåžžã«ææ°ã®æ
å ±ã«åŸãããšãä¿èšŒããããã«äžå¯æ¬ ã§ãã
-
ãµãŒããŒã¯ãã¹ãŠã®RPCã§èªèº«ã®
current termã亀æããŸãã -
ãµãŒããŒãããé«ã
termãæã€å¥ã®ãµãŒããŒãçºèŠããå Žåãèªèº«ã®current termãæŽæ°ããfollowerç¶æ ã«æ»ããŸãã -
åè£è
ãŸãã¯ãªãŒããŒãèªèº«ã®
termãå€ãïŒä»ã®ãµãŒããŒã®termããäœãïŒããšãçºèŠããå Žåãå³åº§ã«éæ ŒããŸãã
2. ãã°ãšã³ããª
logã¯Raftã®äžå¿çãªã³ã³ããŒãã³ãã§ããããã¯é åºä»ãããããšã³ããªã®ã·ãŒã±ã³ã¹ã§ãããålog entryã¯ã¹ããŒããã·ã³ã«ãã£ãŠå®è¡ãããã³ãã³ãã衚ããŸããåãšã³ããªã«ã¯ä»¥äžãå«ãŸããŸãã
- ã³ãã³ãïŒå®è¡ãããå®éã®æäœïŒäŸïŒãset x=5ãããcreate userãïŒã
- TermïŒãšã³ããªããªãŒããŒã§äœæãããtermã
- ã€ã³ããã¯ã¹ïŒãã°å ã§ã®ãšã³ããªã®äœçœ®ããã°ãšã³ããªã¯ã€ã³ããã¯ã¹ã«ãã£ãŠå³å¯ã«é åºä»ããããŠããŸãã
ãã°ã¯æ°žç¶çã§ãããã€ãŸãããšã³ããªã¯ã¯ã©ã€ã¢ã³ãã«å¿çããåã«å®å®ããã¹ãã¬ãŒãžã«æžã蟌ãŸããã¯ã©ãã·ã¥æã®ããŒã¿æå€±ããä¿è·ãããŸãã
3. ã¹ããŒããã·ã³
Raftã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ãµãŒããŒã¯state machineãç¶æããŸããããã¯ãã³ãããããããã°ãšã³ããªãåŠçããã¢ããªã±ãŒã·ã§ã³åºæã®ã³ã³ããŒãã³ãã§ããäžè²«æ§ã確ä¿ããããã«ãã¹ããŒããã·ã³ã¯æ±ºå®è«çïŒåãåæç¶æ
ãšã³ãã³ãã®ã·ãŒã±ã³ã¹ãäžããããå Žåãåžžã«åãåºåãšæçµç¶æ
ãçæããïŒã§ããããã€åªçïŒåãã³ãã³ããè€æ°åé©çšããŠããäžåºŠé©çšããã®ãšåã广ããããããã¯å詊è¡ãé©åã«åŠçããã®ã«åœ¹ç«ã€ããRaftã®ãã°ã³ãããã¡ã³ããåäžã®é©çšãã»ãŒä¿èšŒããïŒã§ãªããã°ãªããŸããã
4. ã³ãããã€ã³ããã¯ã¹
commitIndexã¯ãã³ããããããããšãããã£ãŠããæãé«ããã°ãšã³ããªã®ã€ã³ããã¯ã¹ã§ããããã¯ãããããµãŒããŒã®éåæ°ã«å®å
šã«è€è£œãããã¹ããŒããã·ã³ã«é©çšã§ããããšãæå³ããŸãããªãŒããŒãcommitIndexãæ±ºå®ãããã©ãã¯ãŒã¯ãªãŒããŒã®AppendEntries RPCã«åºã¥ããŠèªèº«ã®commitIndexãæŽæ°ããŸããcommitIndexãŸã§ã®ãã¹ãŠã®ãšã³ããªã¯æ°žç¶çãšèŠãªãããããŒã«ããã¯ããããšã¯ã§ããŸããã
5. ã¹ãããã·ã§ãã
æéãçµã€ã«ã€ããŠãè€è£œããããã°ã¯éåžžã«å€§ãããªããããªãã®ãã£ã¹ã¯ã¹ããŒã¹ãæ¶è²»ãããã°ã®è€è£œãšå埩ãé
ãããå¯èœæ§ããããŸããRaftã¯ãããsnapshotsã§è§£æ±ºããŸããã¹ãããã·ã§ããã¯ãç¹å®ã®æç¹ã§ã®ã¹ããŒããã·ã³ã®ç¶æ
ã®ã³ã³ãã¯ããªè¡šçŸã§ãããã°å
šäœãä¿æãã代ããã«ããµãŒããŒã¯å®æçã«ç¶æ
ããã¹ãããã·ã§ãããããã¹ãããã·ã§ãããã€ã³ããŸã§ã®ãã¹ãŠã®ãã°ãšã³ããªãç Žæ£ãããã®ã¹ãããã·ã§ãããæ°ãããã©ãã¯ãŒãé
ããŠãããã©ãã¯ãŒã«è€è£œããããšãã§ããŸãããã®ããã»ã¹ã¯å¹çã倧å¹
ã«åäžãããŸãã
- ãã°ã®å§çž®ïŒæ°žç¶çãªãã°ããŒã¿ã®éãåæžããŸãã
- é«éãªååŸ©ïŒæ°ãããµãŒããŒãã¯ã©ãã·ã¥ãããµãŒããŒã¯ãæåãããã°å šäœãåçãã代ããã«ã¹ãããã·ã§ãããåãåãããšãã§ããŸãã
-
InstallSnapshot RPCïŒRaftã¯ããªãŒããŒãããã©ãã¯ãŒãžã¹ãããã·ã§ããã転éããããã®
InstallSnapshotRPCãå®çŸ©ããŠããŸãã
广çã§ã¯ãããã®ã®ãã¹ãããã·ã§ããäœæã¯å®è£ ã«è€éããå ããŸããç¹ã«ãåæã¹ãããã·ã§ããäœæããã°ã®åãæšãŠãããã³è»¢éã®ç®¡çã«ãããŠé¡èã§ãã
Raftã®å®è£ ïŒã°ããŒãã«ãããã€ã¡ã³ãã«ãããå®è·µçãªèæ ®äºé
Raftã®æŽç·Žãããèšèšããç¹ã«ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã倿§ãªã€ã³ãã©ã¹ãã©ã¯ãã£åãã«ãå ç¢ã§æ¬çªç°å¢ã«å¯Ÿå¿ããã·ã¹ãã ã«å€æããã«ã¯ãããã€ãã®å®è·µçãªãšã³ãžãã¢ãªã³ã°ã®èª²é¡ã«å¯ŸåŠããå¿ èŠããããŸãã
1. ã°ããŒãã«ã³ã³ããã¹ãã«ããããããã¯ãŒã¯ã¬ã€ãã³ã·ãšåæ
ã°ããŒãã«ã«åæ£ãããã·ã¹ãã ã§ã¯ããããã¯ãŒã¯ã¬ã€ãã³ã·ãéèŠãªèŠçŽ ãšãªããŸããRaftã¯ã©ã¹ã¿ãŒã¯éåžžããã°ãšã³ããªãã³ãããããåã«ããŒãã®éåæ°ãåæããå¿ èŠããããŸãã倧éžããŸããã§åºããã¯ã©ã¹ã¿ãŒã§ã¯ãããŒãéã®ã¬ã€ãã³ã·ã¯æ°çŸããªç§ã«ãªãããšããããŸããããã¯çŽæ¥çã«ä»¥äžã«åœ±é¿ããŸãã
- ã³ãããã¬ã€ãã³ã·ïŒã¯ã©ã€ã¢ã³ããªã¯ãšã¹ããã³ãããããããŸã§ã®æéã¯ãã¬ããªã«ã®éåæ°ãžã®æãé ããããã¯ãŒã¯ãªã³ã¯ã«ãã£ãŠããã«ããã¯ã«ãªãå¯èœæ§ããããŸããèªã¿åãå°çšãã©ãã¯ãŒïŒå€ãèªã¿åãã«ã¯ãªãŒããŒãšã®å¯Ÿè©±ãäžèŠïŒããå°ççã«æèããã¯ã©ãŒã©ã æ§æïŒäŸïŒ5ããŒãã¯ã©ã¹ã¿ãŒã§1ã€ã®å°åã«3ããŒããå¥ã®å°åã«2ããŒããé 眮ããéåæ°ãé«éãªåäžå°åå ã«åãŸãããã«ããïŒãªã©ã®æŠç¥ã§ããããç·©åã§ããŸãã
-
ãªãŒããŒéžåºé床ïŒé«ã¬ã€ãã³ã·ã¯
RequestVoteRPCãé å»¶ããã祚ã®åå²ãé »çºããããéžææéãé·ããªã£ããããå¯èœæ§ããããŸããéžæã¿ã€ã ã¢ãŠããå žåçãªããŒãéã¬ã€ãã³ã·ãããå€§å¹ ã«å€§ãã調æŽããããšãéèŠã§ãã - ãããã¯ãŒã¯åæã®åŠçïŒçŸå®äžçã®ãããã¯ãŒã¯ã¯åæããããã§ããRaftã¯ããµãŒããŒã®éåæ°ãå«ãåæã®ã¿ããªãŒããŒãéžåºãã鲿ã§ããããã«ããããšã§ãåæãæ£ããåŠçããŸããå°æ°æŽŸã®åæã¯æ°ãããšã³ããªãã³ãããã§ããªããªããã¹ããªãããã¬ã€ã³ã·ããªãªãé²ããŸããããããã°ããŒãã«ã«åæ£ãããã»ããã¢ããã§é·æéã®åæãçºçãããšãç¹å®ã®å°åã§å¯çšæ§ã倱ãããå¯èœæ§ããããã¯ã©ãŒã©ã ã®é 眮ã«é¢ããæ éãªã¢ãŒããã¯ãã£äžã®æ±ºå®ãå¿ èŠã«ãªããŸãã
2. æ°žç¶ã¹ãã¬ãŒãžãšèä¹ æ§
Raftã®æ£åœæ§ã¯ããã®ãã°ãšç¶æ
ã®æ°žç¶æ§ã«å€§ããäŸåããŠããŸãããµãŒããŒãRPCã«å¿çãããããšã³ããªãã¹ããŒããã·ã³ã«é©çšãããããåã«ãé¢é£ããŒã¿ïŒãã°ãšã³ããªãcurrent termãvotedForïŒãå®å®ããã¹ãã¬ãŒãžã«æžã蟌ãŸããfsyncïŒãã£ã¹ã¯ãžã®ãã©ãã·ã¥ïŒãããŠããããšãä¿èšŒããªããã°ãªããŸãããããã«ãããã¯ã©ãã·ã¥æã®ããŒã¿æå€±ãé²ããŸããèæ
®äºé
ã«ã¯ä»¥äžãå«ãŸããŸãã
- ããã©ãŒãã³ã¹ïŒé »ç¹ãªãã£ã¹ã¯æžã蟌ã¿ã¯ããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸããæžã蟌ã¿ã®ãããåŠçã髿§èœSSDã®äœ¿çšã¯äžè¬çãªæé©åã§ãã
- ä¿¡é Œæ§ïŒå ç¢ã§èä¹ æ§ã®ããã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ïŒããŒã«ã«ãã£ã¹ã¯ããããã¯ãŒã¯æ¥ç¶ã¹ãã¬ãŒãžãã¯ã©ãŠããããã¯ã¹ãã¬ãŒãžïŒãéžæããããšãéèŠã§ãã
- WAL (Write-Ahead Log)ïŒå€ãã®å ŽåãRaftå®è£ ã¯ããŒã¿ããŒã¹ãšåæ§ã«ãèä¹ æ§ã®ããã«å è¡æžã蟌ã¿ãã°ïŒWALïŒã䜿çšãã倿Žãã€ã³ã¡ã¢ãªã§é©çšãããåã«ãã£ã¹ã¯ã«æžã蟌ãŸããããšãä¿èšŒããŸãã
3. ã¯ã©ã€ã¢ã³ããšã®å¯Ÿè©±ãšäžè²«æ§ã¢ãã«
ã¯ã©ã€ã¢ã³ãã¯ãªãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããããšã§Raftã¯ã©ã¹ã¿ãŒãšå¯Ÿè©±ããŸããã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®åŠçã«ã¯ä»¥äžãå«ãŸããŸãã
- ãªãŒããŒã®çºèŠïŒã¯ã©ã€ã¢ã³ãã¯çŸåšã®ãªãŒããŒãèŠã€ããã¡ã«ããºã ãå¿ èŠã§ããããã¯ããµãŒãã¹ãã£ã¹ã«ããªã¡ã«ããºã ããªãã€ã¬ã¯ãããåºå®ãšã³ããã€ã³ãããŸãã¯ãªãŒããŒãšããŠå¿çãããµãŒããŒãèŠã€ãããŸã§è©Šãããšã§å®çŸã§ããŸãã
- ãªã¯ãšã¹ãã®å詊è¡ïŒãªãŒããŒã倿Žãããå Žåããããã¯ãŒã¯ãšã©ãŒãçºçããå Žåãã¯ã©ã€ã¢ã³ãã¯ãªã¯ãšã¹ããå詊è¡ããæºåãããŠããå¿ èŠããããŸãã
-
èªã¿åãäžè²«æ§ïŒRaftã¯äž»ã«æžã蟌ã¿ã«å¯ŸããŠåŒ·åãªäžè²«æ§ãä¿èšŒããŸããèªã¿åãã«ã€ããŠã¯ãããã€ãã®ã¢ãã«ãå¯èœã§ãïŒ
- 匷åãªäžè²«æ§ã®ããèªã¿åãïŒã¯ã©ã€ã¢ã³ãã¯ãªãŒããŒã«ãèªã¿åããæäŸããåã«ãã©ãã¯ãŒã®éåæ°ã«ããŒãããŒããéä¿¡ããŠèªèº«ã®ç¶æ ãææ°ã§ããããšã確èªããããèŠæ±ã§ããŸããããã«ãã鮮床ãä¿èšŒãããŸãããã¬ã€ãã³ã·ã远å ãããŸãã
- ãªãŒããŒãªãŒã¹ã«ããèªã¿åãïŒãªãŒããŒã¯çæéãããŒãã®éåæ°ããããªãŒã¹ããååŸãããã®éã¯èªèº«ããŸã ãªãŒããŒã§ããããšãèªèãããããªãåæãªãã«èªã¿åããæäŸã§ããŸããããã¯é«éã§ãããæéå¶éããããŸãã
- å€ãèªã¿åãïŒãã©ãã¯ãŒããïŒïŒãã©ãã¯ãŒããçŽæ¥èªã¿åãããšã§ã¬ã€ãã³ã·ãäœãã§ããŸããããã©ãã¯ãŒã®ãã°ããªãŒããŒããé ããŠããå Žåã«å€ãããŒã¿ãèªã¿åããªã¹ã¯ããããŸããããã¯ãèªã¿åãã«å¯ŸããŠçµææŽåæ§ã§ååãªã¢ããªã±ãŒã·ã§ã³ã§èš±å®¹ãããŸãã
4. èšå®å€æŽïŒã¯ã©ã¹ã¿ãŒã¡ã³ããŒã·ããïŒ
Raftã¯ã©ã¹ã¿ãŒã®ã¡ã³ããŒã·ããã倿ŽããïŒãµãŒããŒã远å ãŸãã¯åé€ããïŒããšã¯ãäžæŽåãã¹ããªãããã¬ã€ã³ã·ããªãªãé¿ããããã«ãåæ§ã«åæãä»ããŠå®è¡ãããªããã°ãªããªãè€éãªæäœã§ããRaftã¯å ±ååæ (Joint Consensus) ãšåŒã°ããææ³ãææ¡ããŠããŸãã
- 2ã€ã®èšå®ïŒèšå®å€æŽäžãã·ã¹ãã ã¯äžæçã«2ã€ã®éè€ããèšå®ã§åäœããŸãïŒå€ãèšå®ïŒC_oldïŒãšæ°ããèšå®ïŒC_newïŒã
- å ±ååæç¶æ ïŒC_old, C_newïŒïŒãªãŒããŒã¯ãå ±åèšå®ã衚ãç¹å¥ãªãã°ãšã³ããªãææ¡ããŸãããã®ãšã³ããªãã³ãããããããšïŒC_oldãšC_newã®äž¡æ¹ã®éåæ°ããã®åæãå¿ èŠïŒãã·ã¹ãã ã¯ç§»è¡ç¶æ ã«ãªããŸãããã®ç¶æ ã§ã¯ã決å®ã«ã¯äž¡æ¹ã®èšå®ããã®éåæ°ãå¿ èŠã«ãªããŸããããã«ãããç§»è¡äžã«å€ãèšå®ãæ°ããèšå®ãäžæ¹çã«æ±ºå®ãäžãããšãã§ããªããªããåå²ãé²ããŸãã
- C_newãžã®ç§»è¡ïŒå ±åèšå®ã®ãã°ãšã³ããªãã³ãããããããšããªãŒããŒã¯æ°ããèšå®ã®ã¿ïŒC_newïŒã衚ãå¥ã®ãã°ãšã³ããªãææ¡ããŸãããã®2çªç®ã®ãšã³ããªãã³ãããããããšãå€ãèšå®ã¯ç Žæ£ãããã·ã¹ãã ã¯C_newã®äžã§ã®ã¿åäœããŸãã
- å®å šæ§ïŒãã®2ãã§ãŒãºã³ãããã®ãããªããã»ã¹ã¯ãã©ã®æç¹ã§ã2ã€ã®ç«¶åãããªãŒããŒïŒ1ã€ã¯C_oldäžããã1ã€ã¯C_newäžïŒãéžåºãããããšããªããã·ã¹ãã ã倿Žäžãéçšå¯èœã§ããç¶ããããšãä¿èšŒããŸãã
èšå®å€æŽãæ£ããå®è£ ããããšã¯ãç§»è¡ç¶æ äžã®å€æ°ã®ãšããžã±ãŒã¹ãšé害ã·ããªãªã®ãããRaftå®è£ ã®äžã§æãå°é£ãªéšåã®1ã€ã§ãã
5. 忣ã·ã¹ãã ã®ãã¹ãïŒå³æ Œãªã¢ãããŒã
Raftã®ãããªåæ£åæã¢ã«ãŽãªãºã ã®ãã¹ãã¯ããã®é決å®è«çãªæ§è³ªãšå€æ°ã®é害ã¢ãŒãã®ãããéåžžã«å°é£ã§ããåçŽãªãŠããããã¹ãã§ã¯äžååã§ãã峿 Œãªãã¹ãã«ã¯ä»¥äžãå«ãŸããŸãã
- éå®³æ³šå ¥ïŒããŒãã®ã¯ã©ãã·ã¥ããããã¯ãŒã¯åæãã¡ãã»ãŒãžã®é å»¶ãã¡ãã»ãŒãžã®é åºå€æŽãªã©ã®é害ãäœç³»çã«å°å ¥ããŸããJepsenã®ãããªããŒã«ã¯ãã®ç®çã®ããã«ç¹å¥ã«èšèšãããŠããŸãã
- ããããã£ããŒã¹ã®ãã¹ãïŒäžå€æ¡ä»¶ãšå®å šæ§ç¹æ§ïŒäŸïŒ1termã«ã€ãæå€§1人ã®ãªãŒããŒãã³ãããããããšã³ããªã¯å€±ãããªãïŒãå®çŸ©ããå®è£ ãããŸããŸãªæ¡ä»¶äžã§ããããç¶æããããšããã¹ãããŸãã
- ã¢ãã«æ€æ»ïŒã¢ã«ãŽãªãºã ã®éèŠãªéšåã«ã€ããŠã¯ã圢åŒçæ€èšŒæè¡ã䜿çšããŠæ£åœæ§ã蚌æããããšãã§ããŸãããããã¯é«åºŠã«å°éçã§ãã
- ã·ãã¥ã¬ãŒããããç°å¢ïŒã°ããŒãã«ãããã€ã¡ã³ãã«å žåçãªãããã¯ãŒã¯æ¡ä»¶ïŒã¬ã€ãã³ã·ããã±ãããã¹ïŒãã·ãã¥ã¬ãŒãããç°å¢ã§ãã¹ããå®è¡ããŸãã
ãŠãŒã¹ã±ãŒã¹ãšå®äžçã§ã®å¿çš
Raftã®å®çšæ§ãšããããããã¯ãããŸããŸãªéèŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã³ããŒãã³ãã§ã®åºç¯ãªæ¡çšã«ã€ãªãã£ãŠããŸãã
1. 忣ããŒããªã¥ãŒã¹ãã¢ãšããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³
- etcdïŒKubernetesã®åºç€ãšãªãã³ã³ããŒãã³ãã§ããetcdã¯ãRaftã䜿çšããŠèšå®ããŒã¿ããµãŒãã¹ãã£ã¹ã«ããªæ å ±ãã¯ã©ã¹ã¿ãŒã®ç¶æ ãä¿åã»è€è£œããŸãããã®ä¿¡é Œæ§ã¯ãKubernetesãæ£ããæ©èœããããã«äžå¯æ¬ ã§ãã
- ConsulïŒHashiCorpã«ãã£ãŠéçºãããConsulã¯ã忣ã¹ãã¬ãŒãžããã¯ãšã³ãã«Raftã䜿çšããåçãªã€ã³ãã©ã¹ãã©ã¯ãã£ç°å¢ã§ã®ãµãŒãã¹ãã£ã¹ã«ããªããã«ã¹ãã§ãã¯ãèšå®ç®¡çãå¯èœã«ããŸãã
- TiKVïŒåæ£SQLããŒã¿ããŒã¹ã§ããTiDBã§äœ¿çšããã忣ãã©ã³ã¶ã¯ã·ã§ã³ããŒããªã¥ãŒã¹ãã¢ã¯ãããŒã¿ã¬ããªã±ãŒã·ã§ã³ãšäžè²«æ§ã®ä¿èšŒã®ããã«Raftãå®è£ ããŠããŸãã
- CockroachDBïŒãã®ã°ããŒãã«åæ£SQLããŒã¿ããŒã¹ã¯ãè€æ°ã®ããŒããå°åã«ãããããŒã¿è€è£œã«Raftãåºç¯ã«äœ¿çšããå°åèŠæš¡ã®é害ã«çŽé¢ããŠãé«ãå¯çšæ§ãšåŒ·åãªäžè²«æ§ãä¿èšŒããŸãã
2. ãµãŒãã¹ãã£ã¹ã«ããªãšèšå®ç®¡ç
Raftã¯ããµãŒãã¹ãèšå®ã«é¢ããéèŠãªã¡ã¿ããŒã¿ãã¯ã©ã¹ã¿ãŒå šäœã§ä¿åã»é åžããå¿ èŠãããã·ã¹ãã ã«ãšã£ãŠçæ³çãªåºç€ãæäŸããŸãããµãŒãã¹ãç»é²ããããããã®èšå®ã倿ŽãããããããšãRaftã¯ãã¹ãŠã®ããŒããæçµçã«æ°ããç¶æ ã«åæããããšãä¿èšŒããæåä»å ¥ãªãã§ã®åçãªæŽæ°ãå¯èœã«ããŸãã
3. 忣ãã©ã³ã¶ã¯ã·ã§ã³ã³ãŒãã£ããŒã¿ãŒ
è€æ°ã®æäœããµãŒãã¹ã«ãããååæ§ãå¿ èŠãªã·ã¹ãã ã®ããã«ãRaftã¯åæ£ãã©ã³ã¶ã¯ã·ã§ã³ã³ãŒãã£ããŒã¿ãŒãæ¯ããåå è éã§å€æŽãã³ãããããåã«ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãäžè²«ããŠè€è£œãããããšãä¿èšŒããããšãã§ããŸãã
4. ä»ã®ã·ã¹ãã ã«ãããã¯ã©ã¹ã¿ãŒèª¿æŽãšãªãŒããŒéžåº
æç€ºçãªããŒã¿ããŒã¹ãããŒããªã¥ãŒã¹ãã¢ã§ã®äœ¿çšãè¶ ããŠãRaftã¯ãã°ãã°ã©ã€ãã©ãªãã³ã¢ã³ã³ããŒãã³ããšããŠçµã¿èŸŒãŸãã調æŽã¿ã¹ã¯ã管çããããä»ã®åæ£ããã»ã¹ã®ãªãŒããŒãéžåºãããããã倧ããªã·ã¹ãã ã§ä¿¡é Œæ§ã®é«ãã³ã³ãããŒã«ãã¬ãŒã³ãæäŸãããããŸããäŸãã°ãå€ãã®ã¯ã©ãŠããã€ãã£ããœãªã¥ãŒã·ã§ã³ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ã³ã³ããŒãã³ãã®ç¶æ ã管çããããã«RaftãæŽ»çšããŠããŸãã
Raftã®å©ç¹ã𿬠ç¹
Raftã¯å€§ããªå©ç¹ãæäŸããŸããããã®ãã¬ãŒããªããçè§£ããããšãäžå¯æ¬ ã§ãã
å©ç¹ïŒ
- ããããããïŒãã®äž»èŠãªèšèšç®æšã§ãããPaxosã®ãããªå€ãåæã¢ã«ãŽãªãºã ãããå®è£ ããããã°ãæšè«ã容æã§ãã
- 匷åãªäžè²«æ§ïŒã³ãããããããã°ãšã³ããªã«å¯ŸããŠåŒ·åãªäžè²«æ§ä¿èšŒãæäŸããããŒã¿ã®å®å šæ§ãšä¿¡é Œæ§ã確ä¿ããŸãã
-
ãã©ãŒã«ããã¬ã©ã³ã¹ïŒå¯çšæ§ãäžè²«æ§ã倱ãããšãªããããŒãã®å°æ°æŽŸã®é害ïŒ
NããŒãã¯ã©ã¹ã¿ãŒã§æå€§(N-1)/2ã®é害ïŒã蚱容ã§ããŸãã - ããã©ãŒãã³ã¹ïŒå®å®ããç¶æ ïŒãªãŒããŒã®å€æŽããªãïŒã§ã¯ãRaftã¯é«ãã¹ã«ãŒããããéæã§ããŸãããªããªãããªãŒããŒããã¹ãŠã®ãªã¯ãšã¹ããé æ¬¡åŠçãã䞊è¡ããŠè€è£œããããããããã¯ãŒã¯åž¯åå¹ ãå¹ççã«æŽ»çšã§ããããã§ãã
- æç¢ºã«å®çŸ©ããã圹å²ïŒæç¢ºãªåœ¹å²ïŒãªãŒããŒããã©ãã¯ãŒãåè£è ïŒãšç¶æ é·ç§»ãã¡ã³ã¿ã«ã¢ãã«ãšå®è£ ãç°¡çŽ åããŸãã
- èšå®å€æŽïŒäžè²«æ§ãæãªãããšãªãã¯ã©ã¹ã¿ãŒããããŒããå®å šã«è¿œå ãŸãã¯åé€ããããã®å ç¢ãªã¡ã«ããºã ïŒå ±ååæïŒãæäŸããŸãã
æ¬ ç¹ïŒ
- ãªãŒããŒã®ããã«ããã¯ïŒãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã®æžã蟌ã¿ãªã¯ãšã¹ãã¯ãªãŒããŒãçµç±ããªããã°ãªããŸãããéåžžã«é«ãæžã蟌ã¿ã¹ã«ãŒãããã®ã·ããªãªãããªãŒããŒãã¯ã©ã€ã¢ã³ãããå°ççã«é¢ããŠããå Žåããããããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
- èªã¿åãã¬ã€ãã³ã·ïŒåŒ·åãªäžè²«æ§ã®ããèªã¿åããå®çŸããã«ã¯ããã°ãã°ãªãŒããŒãšã®éä¿¡ãå¿ èŠãšãªããã¬ã€ãã³ã·ã远å ãããå¯èœæ§ããããŸãããã©ãã¯ãŒããã®èªã¿åãã¯å€ãããŒã¿ã®ãªã¹ã¯ã䌎ããŸãã
- ã¯ã©ãŒã©ã èŠä»¶ïŒæ°ãããšã³ããªãã³ãããããããã«ã¯ãããŒãã®éåæ°ãå©çšå¯èœã§ããå¿ èŠããããŸãã5ããŒãã¯ã©ã¹ã¿ãŒã§ã¯ã2ã€ã®é害ã蚱容ãããŸãã3ã€ã®ããŒããé害ãèµ·ãããšãã¯ã©ã¹ã¿ãŒã¯æžã蟌ã¿ã«å¯ŸããŠå©çšã§ããªããªããŸããããã¯ãå°åéã§éåæ°ãç¶æããã®ãé£ãããé«åºŠã«åæããããå°ççã«åæ£ããç°å¢ã§ã¯å°é£ãªå ŽåããããŸãã
- ãããã¯ãŒã¯ãžã®æåºŠïŒãããã¯ãŒã¯ã¬ã€ãã³ã·ãåæã«éåžžã«ææã§ãããç¹ã«åºç¯å²ã«åæ£ããããããã€ã¡ã³ãã§ã¯ãéžææéãã·ã¹ãã å šäœã®ã¹ã«ãŒãããã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- èšå®å€æŽã®è€éãïŒå ç¢ã§ããäžæ¹ãå ±ååæã¡ã«ããºã ã¯ãRaftã¢ã«ãŽãªãºã ã®äžã§æ£ããå®è£ ãã培åºçã«ãã¹ãããã®ãããè€éãªéšåã®1ã€ã§ãã
- åäžé害ç¹ïŒæžã蟌ã¿ã«å¯ŸããŠïŒïŒãªãŒããŒã®é害ã«å¯ŸããŠã¯ãã©ãŒã«ããã¬ã©ã³ãã§ããããªãŒããŒãæä¹ çã«ããŠã³ããæ°ãããªãŒããŒãéžåºã§ããªãå ŽåïŒäŸïŒãããã¯ãŒã¯åæãé害ãå€ãããããïŒãã·ã¹ãã ã¯æžã蟌ã¿ãé²ããããšãã§ããŸããã
çµè«ïŒå埩åã®ããã°ããŒãã«ã·ã¹ãã ã®ããã®åæ£åæã®ç¿åŸ
Raftã¢ã«ãŽãªãºã ã¯ãè€éãªåé¡ãåçŽåããææ ®æ·±ãèšèšã®åã®èšŒã§ãããã®ãããããããžã®éç¹ã¯ã忣åæãæ°äž»åããããåºç¯ãªéçºè ãçµç¹ãã以åã®ã¢ãããŒãã®é£è§£ãªè€éãã«å±ããããšãªããé«å¯çšæ§ã§ãã©ãŒã«ããã¬ã©ã³ããªã·ã¹ãã ãæ§ç¯ããããšãå¯èœã«ããŸããã
KubernetesïŒetcdçµç±ïŒã«ããã³ã³ããã¯ã©ã¹ã¿ãŒã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãããCockroachDBã®ãããªã°ããŒãã«ããŒã¿ããŒã¹ã®ããã®å埩åã®ããããŒã¿ã¹ãã¬ãŒãžã®æäŸãŸã§ãRaftã¯éããªåãè ã§ãããç§ãã¡ã®ããžã¿ã«ã¯ãŒã«ããäžè²«æ§ãä¿ã¡ãéçšå¯èœã§ããç¶ããããšãä¿èšŒããŠããŸããRaftã®å®è£ ã¯ç°¡åãªäœæ¥ã§ã¯ãããŸãããããã®ä»æ§ã®æç¢ºããšåšèŸºãšã³ã·ã¹ãã ã®è±ããã¯ã次äžä»£ã®å ç¢ã§ã¹ã±ãŒã©ãã«ãªã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ããããšã«ã³ããããã人ã ã«ãšã£ãŠãããããã®ãã詊ã¿ãšãªããŸãã
éçºè ãšã¢ãŒããã¯ãã®ããã®å®è·µçãªæŽå¯ïŒ
- çè§£ãåªå ããïŒå®è£ ã詊ã¿ãåã«ãRaftã®åã«ãŒã«ãšç¶æ é·ç§»ã培åºçã«çè§£ããããã«æéãæè³ããŠãã ããããªãªãžãã«ã®è«æãèŠèŠçãªèª¬æã¯éåžžã«è²ŽéãªãªãœãŒã¹ã§ãã
- æ¢åã®ã©ã€ãã©ãªã掻çšããïŒã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãèŠä»¶ãéåžžã«å°éçã§ããããåŠè¡ç ç©¶ãè¡ã£ãŠããå Žåãé€ãããŒãããæ§ç¯ããã®ã§ã¯ãªããååã«æ€èšŒãããæ¢åã®Raftå®è£ ïŒäŸïŒetcdãHashiCorpã®Raftã©ã€ãã©ãªïŒã®äœ¿çšãæ€èšããŠãã ããã
- 峿 Œãªãã¹ãã¯äº€æžã®äœå°ãªãïŒéå®³æ³šå ¥ãããããã£ããŒã¹ã®ãã¹ããããã³é害ã·ããªãªã®åºç¯ãªã·ãã¥ã¬ãŒã·ã§ã³ã¯ããããªã忣åæã·ã¹ãã ã«ãšã£ãŠãæéèŠã§ãããåãããšæ±ºããŠæã蟌ãŸãã培åºçã«å£ããŠãã ããã
- ã°ããŒãã«ãªã¬ã€ãã³ã·ãèæ ®ããŠèšèšããïŒã°ããŒãã«ã«ãããã€ããéã¯ãã¯ã©ãŒã©ã ã®é 眮ããããã¯ãŒã¯ããããžãŒãã¯ã©ã€ã¢ã³ãã®èªã¿åãæŠç¥ãæ éã«æ€èšããç°ãªãå°ççå°åéã§ã®äžè²«æ§ãšããã©ãŒãã³ã¹ã®äž¡æ¹ãæé©åããŠãã ããã
-
æ°žç¶æ§ãšèä¹
æ§ïŒåºç€ãšãªãã¹ãã¬ãŒãžå±€ãå
ç¢ã§ãããã¯ã©ãã·ã¥ã·ããªãªã§ã®ããŒã¿æå€±ãé²ãããã«
fsyncãŸãã¯åçã®æäœãæ£ãã䜿çšãããŠããããšã確èªããŠãã ããã
忣ã·ã¹ãã ãé²åãç¶ããäžã§ãRaftãäœçŸããååââæç¢ºããå ç¢æ§ããã©ãŒã«ããã¬ã©ã³ã¹ââã¯ãä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã®ç€ã§ããç¶ããã§ããããRaftãç¿åŸããããšã§ãããªãã¯åæ£ã³ã³ãã¥ãŒãã£ã³ã°ã®é¿ããããªãæ··ä¹±ã«èããããšãã§ãããå埩åã®ãããã°ããŒãã«ã«ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ãæã«å ¥ããããšãã§ããŸãã