泚é
- æ²æšãããããŸãã
- èŠããçç±ããããŸãã
- èŠãã¿ã®åæ¢ããããŸãã
- èŠãã¿ãåãé€ãæ¹æ³ããããŸãã
4ä»æã®é«è²Žãªçå®
ãã®èšäºã§ã¯ã è€è£œããããªããžã§ã¯ããŸãã¯çç¥ãããreplobã®æŠå¿µã玹ä»ããåæã®ãããã¿ã€ãã«ã€ããŠèª¬æããŸã ã ãã®ãããªãªããžã§ã¯ãã¯ãåæ£ã·ã¹ãã ãããã°ã©ãã³ã°ãããšãã«çºçããã³ãŒãã®è€éããšã®éããããã«åèãããã®ã§ãã Replobã¯ããµãŒãããŒãã£ã®ãµãŒãã¹ãžã®äŸåãæé€ââããé¢é£ããããŒã¿ãšæ©èœãè¡šããŠãŒã¶ãŒãªããžã§ã¯ãã«äžè²«ããå€æŽãå®è£ ããŸãã ãã®ã¢ã€ãã¢ã¯ãC ++èšèªã®è¡šçŸåãšãåæ£ãã©ã³ã¶ã¯ã·ã§ã³å ã§ã®è€éãªããžãã¯ã®äœ¿çšãå¯èœã«ãããªããžã§ã¯ãæåã¢ãããŒãã®äœ¿çšã«åºã¥ããŠããŸãã ããã«ããããã©ãŒã«ããã¬ã©ã³ããªã¢ããªã±ãŒã·ã§ã³ãšãµãŒãã¹ã®éçºãå€§å¹ ã«ç°¡çŽ åãããŸãã åŸç¶ã®èšäºã§ã¯ãéçºäžã®ã¢ãããŒãã«ã€ããŠããã«è©³ãã説æããŸãã
ã¯ããã«
èŠå ãã®èšäºã§èšåãããŠããã»ãšãã©ãã¹ãŠã®ã¡ãœããã«ã¯ãããŒãã£ã¡ã¢ãªãããã³ã°ãšC ++èšèªã®ç°åžžãªäœ¿çšãå«ãŸããŠããŸãã ãã®ããããã®ãããªåé¯ã«å¯å®¹ã§ãªãå Žåã¯ããã®èšäºãèªãŸãªãã§ãã ããã
çŸåšãåæ£ã·ã¹ãã ã«é¢é£ãããããã¯ã¯æãèå³æ·±ããã®ã®1ã€ã§ãããéçºè ãç§åŠè ãå«ãå€ãã®äººã ãé äºããŠããŸãã 人æ°ã¯ç°¡åã«èª¬æãããŠããŸããããŸããŸãªæäœãå®è¡ããããŒã¿ãä¿åããããã®å®å šãªç°å¢ãæäŸããä¿¡é Œã§ãããã©ãŒã«ããã¬ã©ã³ãã·ã¹ãã ãäœæããå¿ èŠããããŸãã
åæã«ãåæ£ã·ã¹ãã ã®äžè²«æ§ãç¶æããããšãéèŠãªåœ¹å²ãæãããŸãã é«ã¬ãã«ã®äžè²«æ§ã確ä¿ããã«ã¯ãããªãã®ä»£åã䌎ããŸãã ä»æ¥ãäžè²«æ§ã®æã匱ã圢åŒãæäŸããå€ãã®ãœãªã¥ãŒã·ã§ã³ããããŸããããããé·æçãªäžè²«æ§ïŒæçµçãªäžè²«æ§ïŒã§ãã äžæ¹ã§ã¯ããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯æ¯èŒçåªããããã©ãŒãã³ã¹ãçºæ®ããŸãããä»æ¹ã§ã¯ãæäœã®ãã©ã³ã¶ã¯ã·ã§ã³ã»ãã³ãã£ã¯ã¹ãå¿ èŠãšããå€ãã®åéã§äœ¿çšããããšã¯ã§ããŸããã å®éã«ã¯ã å³å¯ãªäžè²«æ§ãç·åœ¢åå¯èœ æ§ãªã©ã®åŒ·åãªäžè²«æ§ã¬ãã«ã®1ã€ã䜿çšããŠã·ã¹ãã ã«ã€ããŠèããæ¹ãã¯ããã«ç°¡åã§ãã ãããã®ã¬ãã«ã®äžè²«æ§ã«ãããäžé£ã®æäœã®å®è¡ã®å®å šãªã»ãã³ãã£ã¯ã¹ãåããä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ã®éçºãã¯ããã«å®¹æã«ãªããŸãã
埩ç¿
人çã瀺ãããã«ã幞çŠã¯ã»ãšãã©ã®äººãèãããããå€éšã®ãã®ã«äŸåããŸããã
ãŠã©ãŒã¬ã³ã»ã«ãŠããŒ
åæ£ã·ã¹ãã ãéçºããã«ã¯ãç¹å¥ãªãµãŒãã¹ãæããã䜿çšãããŸãã ãããã®ãµãŒãã¹ã¯ãåæ£ã¿ã¹ã¯ã®éåææ§ãããããã¯ãŒã¯ã®åé¡ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãããŒããŠã§ã¢ã®é害ãªã©ãããŸããŸãªçš®é¡ã®é害ã«é¢é£ããè€éãã«å¯ŸåŠãã䟿å©ãªæ¹æ³ãæäŸããå¿ èŠããããŸãã åæ£ç°å¢ã§ã¯ããããã®åé¡ã¯éåžžã®ãã®ãšã¯èŠãªãããŸããããããæ®éã®ãã®ãšããŠæ±ãå¿ èŠããããŸãã ãããã£ãŠãåæ£ã·ã¹ãã ã§çºçããåé¡ã解決ããããã®ä¿¡é Œæ§ã®é«ãäžè²«ãããµãŒãã¹ãäœæããã¿ã¹ã¯ãçŸå Žã«ç»å ŽããŸãã
ææ°ã®ã·ã¹ãã ã§ã¯ã Zookeeper ïŒã»ãšãã©ïŒãŸãã¯etcd ïŒéçºäžïŒãªã©ã®ãã©ãŒã«ããã¬ã©ã³ããµãŒãã¹ã䜿çšããŠããŸãã 圌ãã¯åæ£ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã䜿çšããŸãïŒ Zab ïŒZookeeperïŒãŸãã¯Raft ïŒetcdïŒã¯ãæäœã®ç·åœ¢åãä¿èšŒããŸãã ããã§ã®èãæ¹ã¯æ¬¡ã®ãšããã§ãã æåã®ã¹ãããã§ã¯ããªãŒããŒãéžåºãããæå®ããããªãŒããŒïŒãã¹ã¿ãŒïŒãç¹å®ã®é åºã§ã¡ãã»ãŒãžããã£ããã£ããŸããããã«ãããå¿ èŠãªã¬ãã«ã®äžè²«æ§ã確ä¿ãããŸãã Zookeeperã®ããã¥ã¡ã³ãã§ã¯ãZookeeper ã¯ã¹ããŒããã·ã³ã®ã¬ããªã±ãŒã·ã§ã³ã§ã¯ãªããã©ã€ããªããã¯ã¢ããã䜿çšããŠã¢ãããŒããå®è£ ãããšäž»åŒµããŠããŸããããããã®ã¢ãããŒãã®å¯äžã®éãã¯ããã©ã€ããªããã¯ã¢ãããã¬ããªã«ã§æå®ãããé åºã«åºã¥ããŠããããšãšãã¬ããªã±ãŒã·ã§ã³ã¹ããŒããã·ã³ã¯ãã¯ã©ã€ã¢ã³ããæå®ããã·ãŒã±ã³ã¹ã«åºã¥ããŠããŸãã ããã§ã¯ãäž¡æ¹ã®ã¢ãããŒãããéçºããããã¹ã¿ãŒããŒã¹ã®ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã䜿çšããäžé£ã®æ±ºå®è«çæäœã«åæããããšãéèŠã ãšæããŸãã
æ¢åã®ã¢ãããŒãã®è°è«
ã€ãã³ããå¶åŸ¡ããããšã¯ã§ããŸããããã€ãã³ãã«é©åããå¿ èŠãããããšãåžžã«èŠããŠããå¿ èŠããããŸãã
ãšãã¯ããã¥ã¹
ãã¹ã¿ãŒããŒã¹ã®åæ£ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã®æ¬ ç¹ã¯æããã§ãããã¹ã¿ãŒã®ã¯ã©ãã·ã¥ã«é¢é£ããç¶æ ãåŠçããã«ã¯ãäžå®ã®æéãããããŸãã ãã¹ã¿ãŒã®èœäžãæ€åºããããã®ã¿ã€ã ã¢ãŠãã¯ãæ°ãããã¹ã¿ãŒãéžæããå¯èœæ§ãé«ãããã«ããã©ãŒãã³ã¹ã«æªåœ±é¿ãåãŒãå¯èœæ§ããããããéåžžã«å°ããããããšã¯ã§ããŸããã åæã«ããã¹ã¿ãŒã®ãã©ãŒã«åŠçã®é 延ãå€§å¹ ã«å¢å ãããããã¿ã€ã ã¢ãŠããéåžžã«å€§ããããããšã¯ã§ããŸããã ãããã£ãŠãå®éã«ã¯ãã¡ãã»ãŒãžåŠçã®é 延ãšããã¹ã¿ãŒã®åéžã®å¯èœæ§ãšã®éã«åŠ¥åç¹ããããŸããããã¯ãäžè¬çãªå Žåããããã¯ãŒã¯æ¡ä»¶ãšã¯ã©ã¹ã¿ãŒãã·ã³ã®ããã©ãŒãã³ã¹ã«äŸåããŸãã åæã«ãã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ã¯ããŠã£ã¶ãŒãã®åç¶å¯èœæ§ã«å³å¯ã«äŸåããããã©ãŒãã³ã¹ã®åŸ©å ãšããŒã¿ã®äžè²«æ§ã®ç¶æã«ããªãã®æéããããå ŽåããããŸãã ãã®ãããªããžãã¯ã«ã¯ãå°ãªããšãããã€ãã®ãããã¯ãŒã¯ã¡ãã»ãŒãžã³ã°ãå¿ èŠã§ãããäžå®å šãªæäœãä¿®æ£ããŸãããã®ããã»ã¹ã¯ãååå è ãæ°ãããã¹ã¿ãŒãšããŠå®£èšã§ããããã転åããªãå Žåã§ãäžå®æéã®åæãä¿èšŒããŸããã ãããã£ãŠãäžéšã®æäœã§ã¯ãã·ã¹ãã ãæ¯èŒçé·æé䜿çšã§ããªãå ŽåããããŸãã
- ãœã£ã¡ãã ïŒã»ãšãã©ã®åé¡ã¯çŽ15ç§ä»¥äžç¶ãããã®ãã¡ã®52ã¯çŽ30ç§ã§ããã
- MongoDB ïŒæéã¯ããŸããŸã§ããããã¬ããªã«ã¯1åéãŠã£ã¶ãŒããéžæããŸãã...ãŠã£ã¶ãŒãã®éžæäžãã¯ã©ã¹ã¿ãŒã¯æžã蟌ã¿å¯èœã§ã¯ãããŸããã§ããã
- Zookeeper ïŒ15ç§ã»ã©åŸã«æ°ãããªãŒããŒãéžåºãããé²é³ãåã³ç¶ããããŸããã ãã ãã[n3 n4 n5]ããŒãã®ããããã«ã¢ã¯ã»ã¹ã§ããã¯ã©ã€ã¢ã³ãã®ã¿ãæžã蟌ã¿å¯èœã§ã[n1 n2]ããŒãã«æ¥ç¶ãããã¯ã©ã€ã¢ã³ãã¯ãªãŒããŒã«æ¥ç¶ããããšãããšãã«ã¿ã€ã ã¢ãŠãã§åŠçãå®äºããŸããã
ãã©ã³ã¶ã¯ã·ã§ã³ã®ã»ãã³ãã£ã¯ã¹ãšéèŠãªã·ããªãª
ããžãã¯ãšã¯ãèªåãæ£ãããšèªä¿¡ãæã£ãŠééããç¯ãæè¡ã§ãã
J.W.ã¯ã©ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã»ãã³ãã£ã¯ã¹ãéèªæãªããžãã¯ã«é©çšããããšã¯ãæãé£ããåé¡ã®1ã€ã§ãã Zookeeperã®ãããªä¿¡é Œã§ãããªããžããªãããã次ã®äžé£ã®æäœãå®è¡ãããšããŸãã
- äœæ¥çšã«ã¹ãã¬ãŒãžã®äžéšã®ããŒã¿ãããã»ã¹ã¡ã¢ãªã«ããŠã³ããŒãããŸãã
- ããŒã¿ãåŠçããçµæãååŸããããã®éèŠãªããžãã¯ã®äœ¿çšã
- çµæããªããžããªã«ä¿åããŸãã
ãã®ã·ããªãªã¯ãããã€ãã®ã¢ãããŒããé©çšããããšã§è§£æ±ºã§ããŸãã
æ²èŠ³çãªããããã³ã°
æ²èŠ³çããããã³ã°ã¯ããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã®ãã¥ãŒããã¯ã¹ã¢ãããŒããšåæ§ã«ã䜿çšããããªãœãŒã¹ã®æ瀺çãªããããã³ã°ã«åºã¥ããŠããŸãã äžèšã®ã¿ã¹ã¯ã¯ã次ã®äžé£ã®æäœãé©çšããããšã§è§£æ±ºã§ããŸãã
- æäœãå®äºããããã®æä»ããã¯ã®ååŸã
- äžèšã®æäœïŒããŠã³ããŒãã䜿çšãä¿åïŒãå®è¡ããŸãã
- ããã¯è§£é€ã
ãã®ã¹ããŒã ã®æ¬ ç¹ã¯ãã¢ã¯ã»ã¹ã®æä»æ§ã®èŠä»¶ããçŽæ¥çããŸãã
- æä»çããã¯ã¯ãããã¯/ããã¯è§£é€æäœã®ã¬ã€ãã³ã·ãå€§å¹ ã«å¢å ãããŸãã ãã®çµæãéçšã®åèšæéãæªåããŸãã
- æäœã®éäžã§ããã»ã¹ãã¯ã©ãã·ã¥ãããšãäžè²«æ§ã®ãªãããŒã¿ãåãåãå¯èœæ§ããããŸãïŒæ®å¿µãªãããZookeeperã«ã¯ããã¯è§£é€æ®µéã§ããã€ãã®æäœãååçã«é©çšããæ©èœããããŸãïŒã ããã«ã¯ãããã»ã¹ã®ãããããšããã«ç¶ããªãœãŒã¹ã®ããã¯è§£é€ãæ€åºããããã®è¿œå æéãå¿ èŠã§ããããã®ãããªæäœã®åèšæéãé·ããªããŸãã
Zookeeperã®ãããªã·ã¹ãã ã«ã¯æ瀺çãªããã¯ããã³ããã¯è§£é€æ©èœããªãããšã匷調ããããšæããŸãã æ²èŠ³çãªããããã³ã°ã®å Žåãç¹å¥ãªã¬ã·ãã䜿çšããå¿ èŠããããŸããããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯è¿œå ã®é 延ãçºçããŸãïŒ ZooKeeper Synchronization Inefficiencyã®å¯ŸåŠãåç §ïŒã
ãã®ç¹ã§ãåé¡ã解決ããå¥ã®æ¹æ³ãã·ãŒã³ã«è¡šç€ºãããŸãã
楜芳çãªãããã¯
楜芳çãªã¹ããŒã ã¯ã以åã®ã¢ãããŒãã®ããã©ãŒãã³ã¹ã®åé¡ãåé¿ããããšããŠããŸãã ã¢ã€ãã¢ã¯ãæäœãã³ãããããåã«ããŒã¿ã®å®éã®ç¶æ ã確èªããããšã§ãã
- ã¹ãã¬ãŒãžããçŸåšã®ããŒã¿ç¶æ ãããŠã³ããŒãããŸãã
- èªæã§ã¯ãªãããžãã¯ã®ããŒã«ã«ã¢ããªã±ãŒã·ã§ã³ãšãæžã蟌ã¿ã®ããã®äžé£ã®æäœã®äœæã
- ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ãããŒã¿ãå€æŽããŠããªãããšã®ã¢ãããã¯æ€èšŒãããã³æžã蟌ã¿ã®ããã®äžé£ã®æäœã®ä¿®æ£ã
- ãã¹ãã倱æããå Žå=>æåã®ã¹ãããããæäœãç¹°ãè¿ããŸãã
3çªç®ã®ã¹ãããã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãå€æŽã®ç¢ºèªãšã³ããããå«ããã¢ãããã¯ã«å®è¡ããå¿ èŠããããŸãã ãã®ãããªã¹ããŒã ã¯ãã€ã³ã¯ãªã¡ã³ã¿ã«ããŒãžã§ã³ã«ãŠã³ã¿ãŒã䜿çšããŠå®è£ ã§ããŸããæŽæ°æäœãæåããå Žåãã«ãŠã³ã¿ãŒã1ã€å¢ãããŸãã èãæ¹ã¯ã ã亀æãšæ¯èŒãæäœã䜿çšããããšã§ããããã¯ãããŒã¿ã®ããŒãžã§ã³ãå€æŽãããŠããªãããšãã€ãŸãããŒã¿èªäœãå€æŽãããŠããªãããšãã¢ãããã¯ã«ãã§ãã¯ããŸãã
ãã ãããã®ã¹ããŒã ã«ã¯æ¬ ç¹ããããŸãã
- å®è£ ã®è€éã ïŒãµãŒãã¹ã¯ã亀æãšã®æ¯èŒãããã³ãã±ããã¬ã³ãŒãã®ä¿®æ£ã®æäœãå®è£ ããå¿ èŠããããããã2ã€ã®æäœãã¢ãããã¯ã«å®è¡ã§ããå¿ èŠããããŸãã
- é«ã競äºåãšé«ãã³ã¹ã ïŒããªãã®æ°ã®åææŽæ°ã«ãããã¢ã«ãŽãªãºã ã¯æåããã¹ããããç¹°ãè¿ãå¿ èŠããããããã«ããé »ç¹ãªããŒã¿å€æŽããçãã競åã®ããã«ãªãœãŒã¹ã浪費ããŸãã
ããã«ãæ²èŠ³çããã³æ¥œèŠ³çããã¯ã®å Žåã察å¿ããã·ã¹ãã ã®éå±€ããŒã¹ããŒã¹ã§å éšããŒã¿ãã·ãªã¢ã«åããå¿ èŠããããŸãïŒããšãã°ãZookeeper "znodes"ãŸãã¯etcd "nodes" ïŒã èšåããããã¹ãŠã®äºå®ã¯ãéçºäžã®ã¢ããªã±ãŒã·ã§ã³ãè€éã«ããŸãããã¢ãããŒãã¯ããŸããŸãªçš®é¡ã®ãšã©ãŒã®åœ±é¿ãåããŸãã ãããã£ãŠãç§ã¯å šãç°ãªãæ¹åã«è¡ãããã§ãã
è€è£œããããªããžã§ã¯ãã®æŠå¿µ
åçŽã«è€åäœã«ã¢ãããŒãããå¿ èŠããããŸããããã§ãªããã°ãç§ãã¡ã¯ããã決ããŠç解ããŸããã
æžå·ã¯ãªã·ã¥ãã ã«ãã£
äžæ©åŸéããŠã ãªããžã§ã¯ãæåããã°ã©ãã³ã° ïŒOOPïŒã«ã€ããŠæãåºããŸãããã ããã«ãªããžã§ã¯ãã®æŠå¿µããããŸã ã ãã®ãããªåãªããžã§ã¯ãã¯ããªããžã§ã¯ãã®ç¶æ ãè¡šãç¹å®ã®ããŒã¿ãææããŠããŸãã ããã«ããªããžã§ã¯ãã«ã¯ããªããžã§ã¯ããããç¶æ ããå¥ã®ç¶æ ã«å€æããäžé£ã®ã¡ãœãããå«ãŸããŠããŸãã
ãããã£ãŠãã¢ã€ãã¢ã¯ãããŒã¿èªäœïŒ ãªããžã§ã¯ãã®ç¶æ ïŒãè€è£œããã®ã§ã¯ãªããã¯ã©ã¹ã¿ãŒã®ããŒãéã§ã¢ã¯ã·ã§ã³ïŒ ãªããžã§ã¯ãã®ã¡ãœãã ïŒãè€è£œããããšã§ãã ãããã®ã¢ã¯ã·ã§ã³ã¯ããªããžã§ã¯ãã®ç¶æ ã決å®çã«å€æŽãããªããžã§ã¯ãèªäœãè€è£œãããŠãããããªé¯èŠãäœæããŸãã åæã«ãç·åœ¢åã«ããããã¹ãŠã®ã¬ããªã«ãåãã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ãåãå ¥ããããšãä¿èšŒããããããæ€èšäžã®åæ£ãªããžã§ã¯ãã®äžè²«ããç¶æ ãååŸã§ããŸãã ããã¯ã ã¹ããŒããã·ã³ã®ã¬ããªã±ãŒã·ã§ã³ã¢ãã«ã«éåžžã«ãã䌌ãŠããŸãã å¯äžã®éãã¯ãéåžžã®ãªããžã§ã¯ãã䜿çšããŠç¶æ ãè¡šãã ã¡ãœããã䜿çšããŠãªããžã§ã¯ããå€æããã€ãã³ããè¡šãããšã§ãã ãã®ãããã³ã°ã¯ãéçºã®è€éããå€§å¹ ã«è»œæžããã³ãŒããè¥å€§åãããããšãªãOOPã®äœ¿çšãæåã«ãµããŒããããããC ++èšèªã®ãã¯ãŒã䜿çšã§ããŸãã
è€è£œããããªããžã§ã¯ãã®ããããã£
è€è£œããããªããžã§ã¯ãïŒãŸãã¯åã«replob ïŒã«ã¯æ¬¡ã®ããããã£ããããŸãã
- çµã¿èŸŒã¿
- ãã¹ã¿ãŒãªãã
- ã¡ã¢ãªå ã®ã¹ãã¬ãŒãžã
- ç·åœ¢åå¯èœãªäžè²«æ§ã
- ããã»ã¹ã®FIFOä¿èšŒã
- é«éããŒã«ã«èªã¿åãã
- 競äºåã®ããæè»ãªåæ£ãã©ã³ã¶ã¯ã·ã§ã³ã
- ç¬ç«ããåæãã©ã³ã¶ã¯ã·ã§ã³ãªãã·ã§ã³ã®ãµããŒãã
- ãã€ãã£ãããŒã¿æ§é ã®ãµããŒãã
- ATSãæ§æã§ããŸãã
- ã¬ããªã«ã»ããã®ã¹ã ãŒãºãªå£åã
- ããŸããŸãªãããã¯ãŒã¯ã®åé¡ã«å¯Ÿããã»ãã¥ãªãã£ãšçåæ§ïŒ
- ãããã¯ãŒã¯æ¥ç¶ã®äžæã
- ãããªããžãã¿ã€ãã®ãããã¯ãŒã¯æ¥ç¶ã®éšåçãªéåã
- äžæçãªãããã¯ãŒã¯ã®äžå®å®ã
- ãããã¯ãŒã¯ãã±ããã®éšåçãªæ¹åã
以äžã«åé ç®ãç°¡åã«ç¢ºèªããŸãã
åé·ã§ã¯ã眪ãé¿ããããšã¯ã§ããŸãããã圌ã®å£ã®æå¶ã¯ç¥çã§ãã
äŒéè
ãã«ãã€ã³ ã ããã¯ã¹ã¿ã³ãã¢ãã³ã®ãµãŒãã¹ã§ã¯ãããŸããã æ©èœã¯ãŠãŒã¶ãŒããã»ã¹å ã§æ©èœããã¬ããªã«éã®ãããã¯ãŒã¯ã¡ãã»ãŒãžã®æ°ãæžããããšã§æäœã®é 延ãæžãããŸãã ãã®ã¢ãããŒãã¯ãZookeeperãetcdãªã©ã®ãµãŒãã¹ãžã®å€éšäŸåãå®å šã«æé€ãããã€ãã£ãã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŸããããã«ãããã¬ããªã±ãŒã·ã§ã³ããžãã¯ãšã®å¯Ÿè©±ãå€§å¹ ã«ç°¡çŽ åããããŠãŒã¶ãŒã«å¯ŸããŠå®å šã«ééçã«ãªããŸãã
ãã¹ã¿ãŒãªã ã ã¢ã«ãŽãªãºã ã«ã¯å°çšã®ãã¹ã¿ãŒïŒãªãŒããŒïŒã¯ãããŸããã ãããã£ãŠãåããŒãã¯äºãã«åºå¥ã§ããŸããã ããã«ãããé害ããå埩ããéã®åŸ ã¡æéãå€§å¹ ã«ççž®ãããã»ãšãã©ã®å Žåãããäºæž¬å¯èœãªåäœãäœæãããŸãã
ã¡ã¢ãªå ã®ã¹ãã¬ãŒãž ã çŸåšã®å®è£ ã«ã¯æ°žç¶å±€ããªããåèŠçŽ ã¯ããã»ã¹ã¡ã¢ãªå ã®ã¬ããªã«ã«åæ£ãããŸãã ãã ãããã®ã¢ã«ãŽãªãºã ã䜿çšãããšããªããžã§ã¯ãã®æ°žç¶ããããã£ãè¿œå ã§ããŸãã
ç·åœ¢åå¯èœãªäžè²«æ§ ã è€è£œããããªããžã§ã¯ãã®ã¢ã«ãŽãªãºã ã¯ãæäœã®ç·åœ¢åå¯èœæ§ãä¿èšŒããŸãã
ããã»ã¹ã®FIFOä¿èšŒ ã æå®ãããããã»ã¹ã§ã¯ããã¹ãŠã®æäœã¯ããã®ããã»ã¹ã§èšç»ãããé åºïŒFIFOé åºïŒã§å®äºããŸãã
é«éããŒã«ã«èªã¿åã ã ç¹æ®ã¢ãŒãã䜿çšãããšãäžè²«æ§ã®ã¬ãã«ãäžè²«æ§ã®ããäžè²«æ§ã«äœäžãããããšã«ãããããŒã¿ãããŒã«ã«ã§èªã¿åãããšãã§ããŸãã ããã«ãããã¬ã€ãã³ã·ãšã·ã¹ãã å šäœã®è² è·ãå€§å¹ ã«åæžãããŸãã
競äºåã®ããæè»ãªåæ£ãã©ã³ã¶ã¯ã·ã§ã³ ã ãã©ã³ã¶ã¯ã·ã§ã³å ã§ã¯ãä»»æã®è€é床ã®æ±ºå®è«çãªäžé£ã®æäœã䜿çšã§ããŸãã ãã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã¯ã競äºåã®ããæ¹æ³ã§åŠçãããŸãã
ç¬ç«ããåæãã©ã³ã¶ã¯ã·ã§ã³ãªãã·ã§ã³ã®ãµããŒã ã ãŠãŒã¶ãŒã¯ãã³ã³ã»ã³ãµã¹å®è£ ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãç¬ç«ãããã©ã³ã¶ã¯ã·ã§ã³ã䞊ååã§ããŸãã
ãã€ãã£ãããŒã¿æ§é ã®ãµããŒã ã éçºè ã¯ã
std::vector
ã
std::map
ãªã©ã®æšæºã³ã³ãããã
boost::optional
ã
boost::variant
ãŸãã¯ã³ããŒã»ãã³ãã£ã¯ã¹ããµããŒãããä»ã®ããŒã¿æ§é ã䜿çšã§ããŸãã
ATSãæ§æã§ããŸã ã ãŠãŒã¶ãŒã¯ããããã¯ãŒã¯æ¥ç¶ã倱æããå Žåã«ãç·åœ¢åå¯èœæ§ãšå¯çšæ§ãéžæã§ããŸãã
ã¬ããªã«ã»ããã®ã¹ã ãŒãºãªå£å ã ã¬ããªã«ã®æ°ãå€§å¹ ã«æžå°ããŠããã·ã¹ãã ã®äžè²«æ§ã¯ç¶æãããŸãã ããšãã°ãã¬ããªã«ã®æ°ã5ãã2ã«æžããããšãã§ããç¶æ³ã«ãã£ãŠã¯1ã€ã®ã¬ããªã«ã«æžããããšãã§ããŸãã
ããŸããŸãªãããã¯ãŒã¯åé¡ã®ã»ãã¥ãªãã£ãšçåæ§ ã ãããã¯ãŒã¯ã«ã¯ããŸããŸãªåé¡ããããŸãïŒ AphyrïŒãããã¯ãŒã¯ã¯ä¿¡é Œã§ãããåç §ããŠãã ããïŒã åæã«ãã¢ã«ãŽãªãºã ã¯ãããã®å Žåã«äžè²«æ§ãšããã©ãŒãã³ã¹ãç¶æããŸãã
ããããã¹ãŠã®ãã€ã³ãã«ã€ããŠã¯ãåŸç¶ã®èšäºã§è©³ãã説æããŸãã
äŸ
åå©ãããªãã«äŸåããŠããªãæŠéã«åå ããªããã°ãç¡æµã«ãªãå¯èœæ§ããããŸãã
ãšãã¯ããã¥ã¹
ãã®ã¢ãããŒãã®ãã¹ãŠã®æè»æ§ãšãã¯ãŒãå®èšŒããããã«ãããªãåçŽãªäŸãæ€èšããŸãã
äŸïŒKey-Valueã¹ãã¬ãŒãž
次ã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠã¬ããªã±ãŒãããããªããžããªãå®è£ ããŸãããïŒç¥ããŠ
std::
ããã³
boost::
åå空éã¯çç¥ããŸãïŒã
struct KV { optional<string> get(const string& key) const; void set(const string& key, const optional<string>& value); private: unordered_map<string, string> kv_; };
ç°¡åã«ããããã«ã察称ã€ã³ã¿ãŒãã§ãŒã¹ãéžæããŸããã 空ã®å€ãæž¡ãããå Žåã
set
ã¡ãœããã¯å¯Ÿå¿ããããŒãåé€ããŸãã éåžžã®ãªããžã§ã¯ãã䜿çšããå Žåã察å¿ããå®è£ ã¯æ¬¡ã®ãšããã§ãã
optional<string> KV::get(const string& key) const { if (kv_.count(key) == 0) return {}; return kv_.at(key); } void KV::set(const string& key, const optional<string>& value) { if (value) kv_[key] = *value; else kv_.erase(key); }
次ã«ãéåžžã®ãªããžã§ã¯ããè€è£œããããªããžã§ã¯ãã«å€æããŸã ã ãã®ããã«ãç§ã¯åã«è¿œå ããŸãïŒ
DECL_REPLOB(KV, get, set)
ãã³ã
ãã³ãïŒ
ã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
DECL_REPLOB
ã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
#define DECL_REPLOB DECL_ADAPTER
ãããŠã次ã®ã³ãŒãè¡ã䜿çšããŠã¬ããªã«ã»ããããŒã¿ãè€è£œã§ããŸãã
replob<KV>().set(string{"hello"}, string{"world!"});
KV::set
åŒã³åºã
KV::set
ãã¬ããªã«ã»ããã®ã¿ã€ã
KV
ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã«ãæå®ããããã¢ãå«ãŸããŸãã ã€ã³ã¹ã¿ã³ã¹ã¯ãã¿ã€ã
KV
ãä»ããŠåç §ã§ããããšã«æ³šæããŠãã ãããã€ãŸããåã¬ããªã«ã«ã¯ããã®ãªããžã§ã¯ãã®ç¬èªã®åäžã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŸãã
ç·åœ¢åãããã¬ãã«ã®äžè²«æ§ã§ããŒã¿ãèªã¿åãã«ã¯ã次ã®ããã«èšè¿°ããŸãã
auto world = replob<KV>().get(string{"hello"});
ãããããã®èªã¿åãæäœã®ããã©ãŒãã³ã¹ãåäžãããããã«ã次ã®ããã«èšè¿°ããŸãã
auto localWorld = replobLocal<KV>().get(string{"hello"});
è¡ããïŒ
ååŒ
æå®ããããŒã®å€ãå€æŽããããšããŸãã çŽ æŽãªæ¹æ³ã¯ã次ã®ãããªã³ãŒããæžãããšã§ãã
auto world = replobLocal<KV>().get(string{"hello"}).value_or("world!"); replob<KV>().set(string{"hello"}, "hello " + world);
ããã§ã®å¯äžã®åé¡ã¯ã2ã€ã®é£ç¶ããã¢ãããã¯æäœãåèšã¢ãããã¯æäœãäžããªãããšã§ãïŒãããã第2çš®ã®ç«¶åç¶æ ïŒã ãããã£ãŠããã©ã³ã¶ã¯ã·ã§ã³å ã«ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãé 眮ããå¿ èŠããããŸãã
MReplobTransactInstance(KV) { auto world = $.get(string{"hello"}).value_or("world!"); $.set(string{"hello"}, "hello " + world); };
次ã«ãããããã¹ãŠã®ã¢ã¯ã·ã§ã³ããã¹ãŠã®ã¬ããªã«ã«ã¢ãããã¯ã«é©çšãããŸãã
çµæãã©ã³ã¶ã¯ã·ã§ã³
次ã®ã¿ã¹ã¯ãæ€èšããŠãã ãããæå®ãããããŒã®å€ã®ãµã€ãºãèšç®ããå¿ èŠããããŸãã ãã以äžç°¡åãªããšã¯ãããŸããïŒ
// use local instance because we do not need to update the object auto valueLength = MReplobTransactLocalInstance(KV) { return $.get(string{"hello"}).value_or("").size(); };
åãã¢ãããŒãã䜿çšããŠãªããžã§ã¯ããå€æŽã§ããŸãã
auto valueLength = MReplobTransactInstance(KV) { auto world = $.get(string{"hello"}); $.set(string{"another"}, world); return world.value_or("").size(); };
ãããã®æäœã¯ãã¹ãŠãã¬ããªã«ã«ã¢ãããã¯ã«é©çšãããŸãã
è€æ°ã®replobãæã€ãã©ã³ã¶ã¯ã·ã§ã³
2ã€ã®ç¬ç«ããããŒãšå€ã®ã¹ãã¬ãŒãžã€ã³ã¹ã¿ã³ã¹
KV1
ãš
KV2
ããããšä»®å®ããŸãããã
MReplobTransact
修食åã䜿çšããŠã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ç°ãªãã€ã³ã¹ã¿ã³ã¹ã®æäœãçµåã§ããŸãã
// the first transaction is distributed // performs value copying from KV2 to KV1 for the same key MReplobTransact { $.instance<KV1>().set( string{"hello"}, $.instance<KV2>().get(string{"hello"})); }; // the second transaction is applied locally // returns total value size calculation for the same key auto totalSize = MReplobTransactLocal { auto valueSize = [](auto&& val) { return val.value_or("").size(); }; return valueSize($.instance<KV1>().get(string{"hello"})) + valueSize($.instance<KV2>().get(string{"hello"})); };
æåã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¹ãŠã®ã¬ããªã«ã§åæ£ãããŠå®è¡ãããŸããããããã®ã¢ã¯ã·ã§ã³ã¯ãã¹ãŠã¢ãããã¯ã«å®è¡ãããŸãã
é«åºŠãªäŸ
ãŠãŒã¶ãŒå®çŸ©é¢æ°ã䜿çšããã³ã¬ã¯ã·ã§ã³ã®ç¹°ãè¿ããèŠãŠã¿ãŸãããã
struct KV { optional<string> get(const string& key) const; void set(const string& key, const optional<string>& value); // generic method to iterate through the collection template<typename F> void forEach(F f) const { for (auto&& v: kv_) f(v); } private: unordered_map<string, string> kv_; };
ããã§ã®ã¿ã¹ã¯ã¯ããã¹ãŠã®å€ã®åèšè¡ãµã€ãºãè¿ãããšã§ãã
auto valuesSize = MReplobTransactLocalInstance(KV) { size_t sz = 0; $.forEach([&sz](auto&& v) { sz += v.second.size(); }); return sz; };
ã芧ã®ãšããããã¹ãŠãéåžžã«ç°¡åã«å®è£ ãããŠããŸãã
ä»åŸã®æ¹åæ§
äœã«è¡ãããããåãã£ãŠç¥ã£ãŠããã°ããã®æ¹åãžã®ã¹ãããã¯ãŸã£ããå®éšã§ã¯ãããŸããã
æžå·ã¯ãªã·ã¥ãã ã«ãã£
以åãç§ã¯ãè€è£œããããªããžã§ã¯ãã䜿çšããŠãã®ã¢ãããŒãã䜿çšããæ¹æ³ã®äŸãšããŠãããã€ãã®åçŽã§ããéåžžã«èå³æ·±ãæèŠã調ã¹ãŸããã 以éã®èšäºã§ã¯ã䜿çšããã¢ã€ãã¢ãšæŠå¿µã段éçã«çŽ¹ä»ããŸãã
- ç¥ã®ã¢ããã¿ãŒã
- ãããããã¯ãŸãã¯äž»èŠ³ã¢ãã«ã®ãªãéããããã³ã°åæã
- åçš®ã®ã¢ã¯ã¿ãŒã¢ãã«ãŸãã¯ãã¡ã³ã¯ã¿ãŒã¢ãã« ã
- è¶ æ±çšã·ãªã¢ã«åã
- åäœä¿®é£Ÿåã
- IOããã³ã³ã«ãŒãã³ã
- CAPå®çã®äžè²«æ§ãšé©çšæ§ã®åé¡ã
- ãŠã£ã¶ãŒããªãã®ãã¡ã³ãã ãreplobãããã³ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã
- å®è£
äŸïŒ
- ååé害æ€åºåšã
- åæ£ã¹ã±ãžã¥ãŒã©ã
çµè«
æçãšã¯ãä»äººãžã®äŸåããèªåãžã®äŸåãžã®ç§»è¡ã§ãã
ãã¬ããªãã¯ã»ããŒã«ãº
å€ãã®ç°åžžãªããããã£ãæã€ããã©ãŒã«ããã¬ã©ã³ããªåæ£è€è£œãªããžã§ã¯ãã®çµã¿èŸŒã¿ã«ã€ããŠèª¬æããŸããã ãããã®ããããã£ã¯ãä¿¡é Œæ§ã®é«ãåæ£ã¢ããªã±ãŒã·ã§ã³ãäœæããè€éããå€§å¹ ã«è»œæžããããŸããŸãªæ°ããã¿ã¹ã¯ã§ãã®ãããªãªããžã§ã¯ããé©çšããããã®æ°ããèŠéãéããŸãã
ãŠã£ã¶ãŒãã䜿çšããªãã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã«ãããå€§å¹ ãªæéæ倱ãªãã«ãããŸããŸãªé害ç¶æ³ãäºæž¬å¯èœãªæ¹æ³ã§åŠçã§ããŸãã çµã¿èŸŒã¿ã®ã¢ãããŒãã«ãããããŒã¿èªã¿åãæã®ãããã¯ãŒã¯é 延ããªããªããŸãã åæã«ã匷åãªæŽåæ§ã¢ãã«ã¯è€è£œããããªããžã§ã¯ããšå¯Ÿè©±ãã䟿å©ãªæ¹æ³ãæäŸããåæ£ãã©ã³ã¶ã¯ã·ã§ã³å ã§å¯èœãªéãæè»ã«äœ¿çšããããšãã§ããŸãã
æçšãªã³ã¡ã³ããšãã³ããæäŸããŠãããã»ã«ã²ã€ã»ãããã³ ã ã€ãŠããã»ã¢ãããã«ãŠ ãããã«ã»ãããã¬ã³ã³ãã«æè¬ããŸãã
ã»ã«ããã¹ãã®è³ªå
å¯äžã®å°é£ã¯ãæ£ãã質åãããããšã§ãã
ãã¬ããªãã¯ã»ããŒã«ãº
-
DECL_REPLOB
ã¯ã©ã®ããã«å®è£ ãããŸããïŒ - ããŒã«ã«æäœãšéããŒã«ã«æäœã®éãã¯äœã§ããïŒ
- ãŠã£ã¶ãŒããªãã§ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ãå®è£ ããããšã¯å¯èœã§ããïŒ
- èšäºã«èšèŒãããŠãããã¹ãŠã®åäœä¿®é£Ÿåããªã¹ãããŸãã
åç §è³æ
[1]ããã¥ã¡ã³ãïŒ Zookeeper
[2]ããã¥ã¡ã³ãïŒ etcd
[3]èšäºïŒ ZabïŒé«æ§èœæŸé
ãã©ã€ããªããã¯ã¢ããã·ã¹ãã
[4]èšäºïŒ ç解å¯èœãªã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ãæ±ããŠ
ïŒæ¡åŒµããŒãžã§ã³ïŒ
[5] Zookeeperã®ããã¥ã¡ã³ãïŒ Zabãš ãã¯ãœã¹ ã
[6]èšäºïŒ ççµååæ£ã·ã¹ãã åãã®ãã£ããŒããã¯ãµãŒãã¹ ã
[7] MongoDBããã¥ã¡ã³ãïŒ ã¬ããªã«ã»ããã®ãã§ãŒã«ãªãŒããŒã«ãããæé
[8] Aphyrããã°ïŒ Zookeeper ã
[9]ããã¥ã¡ã³ãïŒ ZooKeeperã®ã¬ã·ããšãœãªã¥ãŒã·ã§ã³ïŒãã㯠ã
[10]èšäºïŒ ZooKeeperã®åæã®éå¹çæ§ã«å¯ŸåŠãã ã
[11]ããã¥ã¡ã³ãïŒ Zookeeper znodes ã
[12]ããã¥ã¡ã³ãïŒ etcdããŒã ã
[13] WikipediaïŒ State Machine Replication ã
[14] Aphyrããã°ïŒ The Network Is Reliable ã
[15]èšäºïŒ ZooKeeperïŒã€ã³ã¿ãŒãããèŠæš¡ã®ã·ã¹ãã ã®åŸ æ©ãªãã®èª¿æŽ ã