
矩åã®åé¡ãšããŠãåæ£ã¢ããªã±ãŒã·ã§ã³ã®èšèšãšéçºã«å¯ŸåŠããå¿ èŠããããŸãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ãå€ãã®å Žåãããã»ã¹éã®éä¿¡ã®ããŸããŸãªæ段ã䜿çšããŠãã³ã³ããŒãã³ãã®çžäºäœçšãç·šæããŸãã åæ£æ¹åŒã§é¢é£ããŒã¿ãåŠçããã¢ã«ãŽãªãºã ãå®è£ ããããã»ã¹ã§ã¯ãç¹å®ã®å°é£ãçºçããŸãã ãã®ãããªã¿ã¹ã¯ããµããŒãããããã«ãå°çšã®åæ£èª¿æŽã·ã¹ãã ã䜿çšãããŸãã æã人æ°ããããåºã䜿çšãããŠãã補åã¯Apache Zookeeperã§ãã
Zookeeperã¯è€éãªè£œåã§ãã ããªãã®å¹Žéœ¢ã«ãããããããå®æçã«ç¹å®ã®ãšã©ãŒãèŠã€ãããŸããã ãã ããããã¯ãã®æ©èœã®çµæã«éãããåæ£ã·ã¹ãã ã®å€ãã®éçºè ã®ç掻ã楜ã«ããŸãã 次ã«ããã®æ©èœãããããç解ããã®ã«åœ¹ç«ã€Zookeeperã®ããã€ãã®æ©èœãèŠãŠãããApache CuratorïŒNetflixïŒã©ã€ãã©ãªã«ç§»ããŸããããã«ãããåæ£ãœãããŠã§ã¢éçºè ã®ç掻ã楜ãããªããåæ£èª¿æŽãªããžã§ã¯ããå®è£ ããããã®å€ãã®æ¢è£œã®ã¬ã·ããæäŸãããŸãã
Apache zookeeper
åè¿°ããããã«ãZookeeperã¯åæ£ã·ã¹ãã ã®éèŠãªã³ã³ããŒãã³ãã§ãã ZookeeperããŒã¿ããŒã¹ã¯ããã¡ã€ã«ã·ã¹ãã ã«äŒŒãããªãŒã®åœ¢ã§æ³åããã®ãæãç°¡åã§ãããªãŒã®åèŠçŽ ã¯ïŒ/ a / path / to / nodeïŒã§èå¥ãããä»»æã®ããŒã¿ãæ ŒçŽããŸãã ãããã£ãŠãZookeperã®å©ããåããŠãéå±€åã®åæ£ããŒã¿ãŠã§ã¢ããŠã¹ããã®ä»ã®èå³æ·±ãèšèšãæŽçããããšãã§ããŸãã Zookeeperã®æçšæ§ãšåºç¯ãªäœ¿çšã¯ã以äžã«ãªã¹ãããããã€ãã®éèŠãªããããã£ã«ãã£ãŠæäŸãããŸãã
åæ£ã³ã³ã»ã³ãµã¹
ã³ã³ã»ã³ãµã¹ã¯ZABã¢ã«ãŽãªãºã ã䜿çšããŠéæãããŸãããã®ã¢ã«ãŽãªãºã ã¯ã CAPå®çã®CïŒäžè²«æ§ïŒããã³PïŒããŒãã£ã·ã§ã³èš±å®¹å€ïŒããããã£ãæäŸããŸããããã¯ãåé¢ã«å¯ŸããæŽåæ§ãšèæ§ãæå³ããã¢ã¯ã»ã·ããªãã£ãç ç²ã«ããŸãã å®éã«ã¯ãããã¯æ¬¡ã®åœ±é¿ããããããŸãã
- ã©ã®ãµãŒããŒã§ãã®ç¶æ ãèŠæ±ããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¯åãç¶æ ãåç §ããŸãã
- ç¶æ ã®å€åã¯æŽç¶ãšçºçãããã¬ãŒã¹ãã¯äžå¯èœã§ãïŒã»ããæäœã®å Žåãget-setæäœã¯ã¢ãããã¯ã§ã¯ãããŸããïŒã
- Zookeeprã¯ã©ã¹ã¿ãŒã¯ããã©ãã©ãã«ãªããå®å šã«ã¢ã¯ã»ã¹ã§ããªããªãå¯èœæ§ããããŸãããåæã«ãã¹ãŠã®ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããªããªããŸãã
ã³ã³ã»ã³ãµã¹ã¯ãåæ£ã·ã¹ãã ãçŸåšã®ç¶æ ã«äœããã®åœ¢ã§åæããèœåã§ãã Zookeeperã¯ZABã¢ã«ãŽãªãºã ã䜿çšããŸãããä»ã®ã¢ã«ãŽãªãºã ããã䜿çšãããŸã-Raft ã
ããã ã
äžæããŒã
Zookeeperã¯ã©ã¹ã¿ãŒãšã®æ¥ç¶ã確ç«ããã¯ã©ã€ã¢ã³ãã¯ãã»ãã·ã§ã³ãäœæããŸãã ã»ãã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ãä»ã®ã¯ã©ã€ã¢ã³ãã«è¡šç€ºããããããã®æå¹æéãã»ãã·ã§ã³ã®æå¹æéãšçããããŒããäœæããããšãã§ããŸãã ã»ãã·ã§ã³ã®çµäºæã«ããããã®ããŒãã¯åé€ãããŸãã ãã®ãããªããŒãã«ã¯å¶éããããŸã-ã¿ãŒããã«ã®ã¿ã§ãããåå«ãæã€ããšã¯ã§ããŸãããã€ãŸããäžæçãªãµãããªãŒãæã€ããšã¯ã§ããŸããã äžæããŒãã¯ãå€ãã®å Žåã«äœ¿çšãããŸã
ãµãŒãã¹çºèŠã·ã¹ãã ã®å®è£
ã
è² è·åæ£ãå®è¡ãããè€æ°ã®ãµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ããããšããŸãã ã€ã³ã¹ã¿ã³ã¹ã®ããããã衚瀺ããããšããã®ããŒãã®äžæçãªããŒããäœæããããã®ããŒãã«ãµãŒãã¹ã®ã¢ãã¬ã¹ãé 眮ãããŸãããµãŒãã¹é害ãçºçãããšããã®ããŒãã¯åé€ããããã©ã³ã·ã³ã°ã«äœ¿çšã§ããªããªããŸãã äžæããŒãã¯éåžžã«é »ç¹ã«äœ¿çšãããŸãã
ããŒãã€ãã³ãã®ãµãã¹ã¯ã©ã€ã
ã¯ã©ã€ã¢ã³ãã¯ãããŒãã€ãã³ãããµãã¹ã¯ã©ã€ãïŒç£èŠïŒãããããã®ããŒãã«é¢é£ããã€ãã³ããçºçãããšãã«æŽæ°ãåä¿¡ã§ããŸãã ãã ããããã§ãå¶éããããŸããããŒãã§ã€ãã³ããçºçããåŸããµãã¹ã¯ãªãã·ã§ã³ã¯ãã£ã³ã»ã«ãããå床埩å ããå¿ èŠããããŸãããæããã«ããã®ããŒãã§çºçããä»ã®ã€ãã³ããã¹ãããããå¯èœæ§ããããŸãã ãã®äºå®ã«é¢é£ããŠããã®æ©èœã䜿çšããå¯èœæ§ã¯éåžžã«éãããŠããŸãã
ããšãã°ãæ€åºãµãŒãã¹ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ãæ§æã®å€æŽã«å¯Ÿå¿ããããã«äœ¿çšã§ããŸããããµãã¹ã¯ãªãã·ã§ã³ãã€ã³ã¹ããŒã«ããåŸãç¶æ ã®å€æŽãã¹ããããããªãããšã確èªããããã«ãæåãæäœãå®è¡ããå¿ èŠãããããšã«æ³šæããå¿ èŠããããŸãã
ã·ãªã¢ã«ããŒã
Zookeeperã䜿çšãããšãååãäžæçã«å¢å ããå¯èœæ§ãããäžæ¹ã§ãé£ç¶ããŠå¢å ããçªå·ãè¿œå ããããšã§ååã圢æãããããŒããäœæã§ããŸãã ãã®æ©èœã¯ãé©çšãããåé¡ïŒããšãã°ãåãã¿ã€ãã®ãã¹ãŠã®ãµãŒãã¹ãçåœããŒããšããŠç»é²ããïŒã®è§£æ±ºãšã å ¬å¹³ãªåæ£ããããã³ã°ãªã©ã®Zookeeperã®ãã¬ã·ããã®å®è£ ã®äž¡æ¹ã§åºã䜿çšãããŠããŸãã
ããŒãã®ããŒãžã§ã³
ããŒãã®ããŒãžã§ã³ã䜿çšãããšãèªã¿åããšæžã蟌ã¿ã®éã«ããŒãã®å€æŽããã£ããã©ãããå€æã§ããŸããã€ãŸããèšå®æäœäžã«ããŒãã®äºæ³ãããããŒãžã§ã³ãæå®ã§ããŸããäžèŽããªãå Žåã¯ãããŒãã®å€æŽãå¥ã®ã¯ã©ã€ã¢ã³ãã«ãã£ãŠè¡ãããç¶æ ãå床èªã¿åãå¿ èŠãããããšãæå³ããŸãã ãã®ã¡ã«ããºã ã䜿çšãããšãããšãã°ãã¬ã·ãã åæ£ã«ãŠã³ã¿ãå®è£ ããå Žåãªã©ãããŒã¿ã®ç¶æ ã«é åºä»ããããå€æŽãå®è£ ã§ããŸãã
ããŒãããšã®ACL
ä¿¡é Œã§ããªãã¢ããªã±ãŒã·ã§ã³ããããŒã¿ãä¿è·ããããã«èšèšããããããŒãã®ACLã«ãã£ãŠå®çŸ©ãããã¢ã¯ã»ã¹å¶éãèšå®ããããšãã§ããŸãã ãã¡ãããACLã¯æªæã®ããã¯ã©ã€ã¢ã³ããäœæã§ããéè² è·ããä¿è·ãããã³ã³ãã³ããžã®ã¢ã¯ã»ã¹ãå¶éããã¡ã«ããºã ã®ã¿ãæäŸããŸãã
ããŒãããšã®TTL
Zookeeperã§ã¯ãTTLããŒããã€ã³ã¹ããŒã«ã§ããŸãããã®åŸãïŒæŽæ°ããªãå ŽåïŒããŒããåé€ãããŸãã ãã®æ©èœã¯æ¯èŒçæè¿ç»å ŽããŸããã
ãªãã¶ãŒããŒãµãŒããŒ
ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒã«ãªãã¶ãŒããŒã¢ãŒãã§æ¥ç¶ããå¯èœæ§ããããŸãïŒãªãã¶ãŒããŒïŒãããã¯ãèªã¿åãæäœã®å®è¡ã«äœ¿çšã§ããŸããããã¯ãæžã蟌ã¿æäœã«ãã£ãŠçæãããã¯ã©ã¹ã¿ãŒã®è² è·ãé«ãå Žåã«éåžžã«äŸ¿å©ã§ãã ãªãã¶ãŒããŒãµãŒããŒã䜿çšãããšãåé¡ã解決ã§ããŸãã çåãçãããããããŸãããããªãéåžžã®ããŒããã¯ã©ã¹ã¿ãŒã«è¿œå ããã ãã§ã¯ãããŸãããïŒ çãã¯ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã«ãããŸããããŒã¿ãæžã蟌ãããšãã§ããããŒããå€ãã»ã©ãã³ã³ã»ã³ãµã¹ã«éãããŸã§ã«æéãããããã¯ã©ã¹ã¿ãŒã®æžã蟌ã¿ããã©ãŒãã³ã¹ãäœäžããŸãã ãªãã¶ãŒããŒãµãŒããŒã¯ã³ã³ã»ã³ãµã¹ã«åå ããŠããªããããæžã蟌ã¿æäœã®ããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããã
ããŒãã®æå»åæ
Zookeeperã¯ãããŒãã®åæã«å€éšæéã䜿çšããŸããã ããã¯ããªãæçšãªããããã£ã§ãããæ£ç¢ºãªæéã«çŠç¹ãåœãŠãã·ã¹ãã ã¯ããã®äžäžèŽã«é¢é£ãããšã©ãŒãèµ·ãããããåŸåããããŸãã
ãã¡ãããè»èã«ã¯ã¿ãŒã«ãå«ãŸããŠããå¿ èŠããããŸããå®éã«ã¯ãZookeeperã«ã¯äœ¿çšãå¶éã§ããããããã£ããããŸãã Zookeeper- Single Cluster of Failure ©Pinterestã§ã®äœæ¥ã®è€éããç®èã«ã説æããè¡šçŸããããŸããããã¯ãZookeeperã䜿çšããåæ£ã·ã¹ãã ã䜿çšããŠåäžé害ç¹ãåãé€ãããšãããšããŸãã«é害ç¹ã
ZookeeperããŒã¿ããŒã¹ã¯RAMã«åãŸãå¿ èŠããããŸã
Zookeeperã¯ããŒã¹ãã¡ã¢ãªã«ããŒãããããã«ä¿æããŸãã ããŒã¿ããŒã¹ãRAMã«åãŸããªãå Žåãã¹ã¯ããã«é 眮ãããããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãã ããŒã¿ããŒã¹ã倧ããå Žåã¯ãååãªéã®RAMãåãããµãŒããŒãå¿ èŠã§ãïŒãã ãããµãŒããŒäžã®1 TBã®RAMãå¶éããããé¢ããŠããå ŽåãçŸæç¹ã§ã¯åé¡ã«ãªããŸããïŒã
ã»ãã·ã§ã³ã¿ã€ã ã¢ãŠãæé
ã¯ã©ã€ã¢ã³ãã®æ§æäžã«ã»ãã·ã§ã³ã¿ã€ã ã¢ãŠãæéã誀ã£ãŠéžæããããšãã¯ã©ã¹ã¿ãŒã®è² è·ãå¢å ããäžéšã®ã¯ã©ã¹ã¿ãŒããŒãã§é害ãçºçããå Žåã«ãäºæž¬äžèœãªçµæãæªåããå¯èœæ§ããããŸãã ãŠãŒã¶ãŒã¯ã»ãã·ã§ã³ã®æéïŒããã©ã«ãã§ã¯30ç§ïŒãççž®ããŠã·ã¹ãã ã®åææ§ãé«ããããšããŸããããã¯ãäžæããŒããããéãåé€ãããããã§ãã
ã¯ã©ã¹ã¿ãŒå ã®ããŒãã®æ°ã«ããçç£æ§ã®äœäž
éåžžãã¯ã©ã¹ã¿ãŒã¯ã³ã³ã»ã³ãµã¹ã®éæã«é¢äžãã3ã€ã®ããŒãã䜿çšããŸãããããŒããè¿œå ãããå Žåãæžã蟌ã¿æäœã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãã ããŒãã®æ°ã¯ããããå¥æ°ã§ããå¿ èŠãããïŒZABã¢ã«ãŽãªãºã ã®èŠä»¶ïŒãã¯ã©ã¹ã¿ãŒã5ã7ã9ããŒãã«æ¡åŒµãããšããã©ãŒãã³ã¹ã«æªåœ±é¿ãåãŒããŸãã åé¡ãèªã¿åãæäœã«ããå Žåã¯ããªãã¶ãŒããŒããŒãã䜿çšããŸãã
ããŒãããšã®æ倧ããŒã¿ãµã€ãº
ããŒããããã®æ倧ããŒã¿ãµã€ãºã¯1MBã«å¶éãããŠããŸãã 倧éã®ããŒã¿ãä¿åããå¿ èŠãããå ŽåãZookeeperã¯ä¿åããŸããã
åå«ãªã¹ãå ã®ããŒãã®æ倧æ°
Zookepeerã¯ãããŒããåå«ãæã€ããšãã§ããéã課ããŸãããããµãŒããŒãã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããããŒã¿ãã±ããã®æ倧ãµã€ãºã¯4MBïŒjute.maxbufferïŒã§ãã ããŒãã«ãã®ãªã¹ãã1ã€ã®ããã±ãŒãžã«åãŸããªãã»ã©å€ãã®åå«ãããå Žåãæ®å¿µãªããããããã«é¢ããæ å ±ãååŸããæ¹æ³ã¯ãããŸããã ãã®å¶éã¯ããã£ãã·ã¥ããã¡ã€ã«ã·ã¹ãã ã«æ§ç¯ããããªããžã§ã¯ãåãŸãã¯ãã€ãžã§ã¹ããéšåã«åå²ãããéå±€æ§é ã«ç·šæãããã®ãšåãæ¹æ³ã§éå±€ãæ¬äŒŒãã©ããããªã¹ããç·šæããããšã«ãã£ãŠãã€ãã¹ãããŸãã
æ¬ ç¹ã«ããããããããããã®å©ç¹ãäžåããããZookeeperã¯ãCloudera CDH5ãDC / OSãApache Kafkaãªã©ã®å€ãã®åæ£ãšã³ã·ã¹ãã ã®äžå¯æ¬ ãªã³ã³ããŒãã³ãã«ãªããŸãã
éçºè åãã®Zookeeper
Zookeeperã¯Javaèšèªã䜿çšããŠå®è£ ãããŠãããããJVMç°å¢ã§ã®äœ¿çšã¯èªç¶ãªãã®ã§ããããšãã°ãJavaãããµãŒããŒãŸãã¯ãµãŒããŒã¯ã©ã¹ã¿ãŒãèµ·åãããµãŒãããŒãã£ãµãŒããŒãå±éããããšãªãã¢ããªã±ãŒã·ã§ã³ã®çµ±åãŸãã¯ã¹ã¢ãŒã¯ãã¹ããå®è£ ããã®ã¯éåžžã«ç°¡åã§ãã ãã ããZookeeperã¯ã©ã€ã¢ã³ãAPIã¯éåžžã«äœã¬ãã«ã§ãããæäœãå®è¡ã§ããŸãããå·ã«éãã£ãŠæ³³ãããšã«äŒŒãŠããŸãã ããã«ãäŸå€åŠçãé©åã«å®è£ ããã«ã¯ãZookeeperã®åºæ¬ãæ·±ãç解ããå¿ èŠããããŸãã ããšãã°ãZookeeperã§ã®äœæ¥ã«åºæ¬çãªã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå Žåãåæ£èª¿æŽããã³æ€åºã³ãŒãã®ãšã©ãŒã®ãããã°ãšæ€çŽ¢ã¯éåžžã«å€§ããªåé¡ãåŒãèµ·ãããããªãã®æéãå¿ èŠãšããŸããã
ãã ããNetflixéçºè ã®Jordan Zimmermanã«ãã£ãŠãœãªã¥ãŒã·ã§ã³ãååšããã³ãã¥ããã£ã«å¯ä»ãããŠããŸãã Apache Curatorã«äŒã£ãŠãã ããã
Apacheãã¥ã¬ãŒã¿ãŒ
ãããžã§ã¯ãã®ã¡ã€ã³ããŒãžã«ã¯åŒçšããããŸãã
ãã®å£°æã¯ãã¥ã¬ãŒã¿ãŒã100ïŒ åæ ããŠããŸãã ãã®ã©ã€ãã©ãªã®äœ¿çšãéå§ãããšãZookeeperãæäœããããã®ã³ãŒããã·ã³ãã«ã§ç解ãããããªãããšã©ãŒã®æ°ãšãããã解決ããæéãèŠå ã«ãã£ãŠæžå°ããããšãããããŸããã åè¿°ã®ããã«ãæšæºã¯ã©ã€ã¢ã³ãã朮ã«éãã£ãŠæ³³ãããšã«äŒŒãŠããå Žåããã¥ã¬ãŒã¿ãŒã«ãã£ãŠç¶æ³ã¯180床å€åããŸãã ããã«ããã¥ã¬ãŒã¿ãŒã®ãã¬ãŒã ã¯ãŒã¯å ã§ãå€æ°ã®æ¢è£œã®ã¬ã·ããå®è£ ãããŠããŸããããã«ã€ããŠã¯ããã«æ€èšããŸãã
ããŒã¹API
APIã¯ãéåžžã«äŸ¿å©ãªæµäœã€ã³ã¿ãŒãã§ãŒã¹ã®åœ¢ã§äœæãããŠãããå¿ èŠãªã¢ã¯ã·ã§ã³ãç°¡åãã€ç°¡æœã«æ±ºå®ã§ããŸãã äŸïŒä»¥äžãScalaèšèªã§äŸã瀺ããŸãïŒïŒ
client .create() .orSetData() .forPath("/object/path", byteArray)
ããã¯ã ãããŒããäœæããããååšããå Žåã¯ããã¹ã®ããŒã¿ãèšå®ããã ãã/ãªããžã§ã¯ã/ãã¹ãããã³ããã«byteArrayãæžã蟌ãããšç¿»èš³ã§ããŸãã
ãŸãã¯ãäŸãã°ïŒ
client .create() .withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath("/head/child", byteArray)
ããã¹ã«ã·ãªã¢ã«ã¿ã€ããšãšãã§ã¡ã©ã«ã¿ã€ãã®ããŒããäœæããã/ head / child000000XXXXãããã«byteArrayãæžã蟌ãã ãã®ããã¥ã¢ã«ããŒãžã«ã¯ãããã«ããã€ãã®äŸããããŸã ã
éåææäœ
ãã¥ã¬ãŒã¿ãŒã¯ãåææäœãšéåææäœã®äž¡æ¹ããµããŒãããŠããŸãã éåæ䜿çšã®å Žåãã¯ã©ã€ã¢ã³ãã¯ãåæCuratorFramework
ãšã¯ç°ãªããã¿ã€ãAsyncCuratorFramework
CuratorFramework
ã ãããŠãååŒã³åºããã§ãŒã³ã¯thenAccept
ã¡ãœãããåãå
¥ããŸããããã¯ãæäœãå®äºãããšåŒã³åºãããCallbackã瀺ããŸãã éåæã€ã³ã¿ãŒãã§ã€ã¹ã®è©³çŽ°ã«ã€ããŠã¯ãå°çšã®ããã¥ã¢ã«ããŒãžãåç
§ããŠãã ãã ã
val async = AsyncCuratorFramework.wrap(client); async.checkExists().forPath(somePath).thenAccept(stat -> mySuccessOperation(stat))
Scalaã䜿çšããå Žåãéåæã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã¯æ£åœåãããŠããªãããã«æãããŸããæ©èœã¯Scala Futureã䜿çšããŠç°¡åã«å®è£ ã§ãããããã³ãŒãã¯scala-wayéçºã®æ©èœãä¿æã§ããŸãã ãã ããJavaããã³ä»ã®JVMèšèªã®å Žåããã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯äŸ¿å©ã§ãã
ããŒã¿ã¹ããŒãã®ãµããŒã
Zookeeperã¯ãä¿åãããããŒã¿ã®ã»ãã³ãã£ã¯ã¹ããµããŒãããŠããŸããã ããã¯ãããŒã¿ãä¿åããã圢åŒãšãã®é 眮æ¹æ³ã«ã€ããŠãéçºè ãåç¬ã§è²¬ä»»ãè² ãããšãæå³ããŸãã ããã¯ãããšãã°æ°ããéçºè ãããââãžã§ã¯ãã«æ¥ããšããªã©ãå€ãã®å Žåã«äžäŸ¿ã«ãªãå¯èœæ§ããããŸãã ãããã®åé¡ã解決ããããã«ããã¥ã¬ãŒã¿ãŒã¯ããããã®ãã¹å ã®ãã¹ãšããŒãã¿ã€ãã«å¶éãèšå®ã§ããããŒã¿ã¹ããŒã ããµããŒãããŠããŸãã æ§æããäœæãããåè·¯ã¯ãJson圢åŒã§è¡šãããšãã§ããŸãã
[ { "name": "test", "path": "/a/b/c", "ephemeral": "must", "sequential": "cannot", "metadata": { "origin": "outside", "type": "large" } } ]
移è¡ãµããŒã
ãã¥ã¬ãŒã¿ãŒã®ç§»è¡ã¯ãZookeeperã®Liquibaseã«äŒŒãŠããŸãã 圌ãã®å©ããåããŠãããŒã¿ããŒã¹ã®é²åã補åã®æ°ããããŒãžã§ã³ã«åæ ãããããšãã§ããŸãã 移è¡ã¯ãé£ç¶ããŠå®è¡ãããäžé£ã®æäœã§æ§æãããŸãã åæäœã¯ãZookeeperããŒã¿ããŒã¹ã«å¯Ÿããããã€ãã®å€æã«ãã£ãŠè¡šãããŸãã ãã¥ã¬ãŒã¿ãŒã¯ãZookeeperã䜿çšããŠç§»è¡ã®ã¢ããªã±ãŒã·ã§ã³ãåå¥ã«ç£èŠããŸãã ãã®æ©èœã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ããããã€ããããã»ã¹ã§äœ¿çšã§ããŸãã 移è¡ã«ã€ããŠã¯ã察å¿ããããã¥ã¢ã«ããŒãžã§è©³ãã説æããŠããŸã ã
ãã¹ããµãŒããŒãšãã¹ãã¯ã©ã¹ã¿ãŒ
ãã¹ããç°¡çŽ åããããã«ããã¥ã¬ãŒã¿ãŒã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã«ãµãŒããŒãŸãã¯ZookeeperãµãŒããŒã®ã¯ã©ã¹ã¿ãŒãåã蟌ãããšãã§ããŸãã ãã®åé¡ã¯ãZookeeperã䜿çšããå Žåã®ã¿ãCuratorã䜿çšããã«éåžžã«ç°¡åã«è§£æ±ºã§ããŸãããCuratorã¯ããç°¡æœãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã ããšãã°ããã¥ââã¬ãŒã¿ãŒã®ãªãZookeeperã®å ŽåïŒ
class ZookeeperTestServer(zookeperPort: Int, tmp: String) { val properties = new Properties() properties.setProperty("tickTime", "2000") properties.setProperty("initLimit", "10") properties.setProperty("syncLimit", "5") properties.setProperty("dataDir", s"$tmp") properties.setProperty("clientPort", s"$zookeperPort") val zooKeeperServer = new ZooKeeperServerMain val quorumConfiguration = new QuorumPeerConfig() quorumConfiguration.parseProperties(properties) val configuration = new ServerConfig() configuration.readFrom(quorumConfiguration) private val thread = new Thread() { override def run() = { zooKeeperServer.runFromConfig(configuration) } } def start = { thread.start() } def stop = { thread.interrupt() } } ... val s = new ZookeeperTestServer(port, tmp) s.start ... s.stop
ãã¥ã¬ãŒã¿ãŒã®å ŽåïŒ
val s = new TestingServer(port) s.start() ... s.stop()
ãã¥ã¬ãŒã¿ãŒã®ã¬ã·ã
ãã¥ã¬ãŒã¿ãŒã¬ã·ãã¯ããã®ã©ã€ãã©ãªã䜿çšããŠåæ£ããã»ã¹çžäºäœçšã¡ã«ããºã ãå®è£ ããäž»ãªåæ©ã§ãã 次ã«ããã¥ã¬ãŒã¿ãŒããµããŒãããäž»ãªã¬ã·ããšããããã®é©çšæ¹æ³ããªã¹ãããŸãã ç§ã¯å®éã«ã¯ããã€ãã®ã¬ã·ããé©çšããªãã£ãã®ã§ãããã¥ã¢ã«ã«å¯èœãªéãè¿ã翻蚳ãäžããããŸããã
ãªãŒããŒãºãã§ã€ã¹
ãããã®ã¬ã·ãã¯ãçŸåšã®ãªãŒããŒãããŠãããã€ãã®ããã»ã¹ãããããªã¶ãŒãå ã«ãããã©ãŒã«ããã¬ã©ã³ãããã»ã¹å®è¡ã¢ãã«ãå®è£ ããããšãç®çãšããŠããŸãã ãªãŒããŒãæ©èœãæããã®ãããããšããã«ãå¥ã®ããã»ã¹ããªãŒããŒã«ãªããŸãã 2ã€ã®é©åãªã¬ã·ãããããŸãã
- Leader Latchã¯ãCountDownLatchã«é¡äŒŒããŠãããããã»ã¹ããªãŒããŒã«ãªããŸã§ããã¯ãããŸãã
- Leader Election ãã¡ãœããåŒã³åºããéããŠãªãŒããŒã®éžæãå®è£ ããŸãã ããã»ã¹ããªãŒããŒã«ãªã£ãç¬éã«ã¡ãœãããåŒã³åºãããããããã®åºå£ã¯ãªãŒããŒã·ããã®åªå€±ã瀺ããŸãã
ããã¯
ããã¯ã¯ãåæ£ããã»ã¹éåæã®æãéèŠãªã¡ã«ããºã ã®1ã€ã§ãã ãã¥ã¬ãŒã¿ãŒã¯ãå¹ åºãããã¯ãªããžã§ã¯ããæäŸããŸãã
- å ±æåå ¥å¯èœãã㯠-ã¢ã¯ã»ã¹ã§ããã¯ã©ã€ã¢ã³ããåå ¥åã§ããåæ£ããã¯ã
- å ±æãã㯠-åæ£ããã¯ã
- å ±æãªãšã³ãã©ã³ãèªã¿åã/æžã蟌ã¿ãã㯠-èªã¿åããšæžã蟌ã¿ãå¥ã ã«ããã¯ã§ãããªããžã§ã¯ããè€æ°ã®ã¯ã©ã€ã¢ã³ããåæã«èªã¿åãçšã«ãªããžã§ã¯ããããã¯ã§ããŸãããæžã蟌ã¿ããã¯ã¯æä»çã§ãã
- å ±æã»ããã© -ã«ãŠã³ãã»ããã©ã®å©ããåããŠã32ãããæŽæ°ã§æå®ãããéãããéã®ãªãœãŒã¹ã§ç°¡åã«äœæ¥ã§ããŸãã
- ãã«ãå ±æããã¯ã¯ãè€æ°ã®åæ£ããã¯ã®æäœãã¢ãããã¯ã«å®è¡ã§ããé«ã¬ãã«ã®ãªããžã§ã¯ãã§ãã
éå£
- ããªã¢ -ç¹å®ã®æ¡ä»¶ãæºãããããŸã§ãä»ã®åå è ã®ã³ãŒãã»ã¯ã·ã§ã³ãžã®ã¢ã¯ã»ã¹ãã¯ã©ã€ã¢ã³ãããããã¯ããçºçããå Žåã«ã¢ã¯ã»ã¹ãããã¯è§£é€ã§ãããªããžã§ã¯ããããã«ããããã¹ãŠã®åå è ãå®è¡ãç¶ç¶ã§ããŸãã
- ããã«ããªã¢ -ãã®ãªããžã§ã¯ãã䜿çšãããšãç¹å®ã®æ°ã®ã¯ã©ã€ã¢ã³ãã®ãšã³ããªãã³ãŒãã»ã°ã¡ã³ãã«åæããããããçµäºããããšãã§ããŸãã
ã«ãŠã³ã¿ãŒ
- å ±æã«ãŠã³ã¿ãŒ -ã¬ãŒã¹ä¿è·ä»ãã®éåžžã®æŽæ°ã«ãŠã³ã¿ãŒïŒ32ãããïŒã
- åæ£ã¢ãããã¯ãã³ã° -ã«ãŠã³ã¿ãŒã¿ã€ããã³ã°ïŒ64ãããïŒã
ãã£ãã·ã¥
- ãã¹ãã£ãã·ã¥ -ããŒããç£èŠãããã®åããŒãã«ã€ããŠããŒã«ã«ãã£ãã·ã¥ãæŽæ°ãããªãã·ã§ã³ã§ããŒã¿ãå€æŽããããšãã«ããŒã¿ã«ã€ããŠæŽæ°ãããªããžã§ã¯ãã
- ããŒããã£ãã·ã¥ - ããŒããç£èŠããããŒããšãã®ããŒã¿ã«é¢ããããŒã«ã«ãã£ãã·ã¥ãæŽæ°ãããªããžã§ã¯ãã
- ããªãŒãã£ãã·ã¥ -ããŒãã®åå«ã®ããªãŒå šäœãç£èŠããããªãŒå ã§å€æŽããããšããŒã«ã«ãã£ãã·ã¥ãæŽæ°ãããªããžã§ã¯ãã
çµã³ç®
- æ°žç¶ããŒã -ãã®ã¬ã·ãã䜿çšãããšãå€éšã®åœ±é¿äžã§ããã¥ã¬ãŒã¿ãŒããã®ååšãšäžå€æ§ã確ä¿ããããã«åªåããããŒã¿ãæã€ããŒããäœæã§ããŸãã
- æ°žç¶çTTLããŒã -åç¶æéãTTLã«ãã£ãŠæ±ºå®ãããããŒããäœæããããã®ã¬ã·ããæ°žç¶çããŒããšåãããããã£ããµããŒãããŸãã
- ã°ã«ãŒãã¡ã³ã㌠- ã¡ã³ããŒã®ã°ã«ãŒããç·šæã§ããŸãã
ãã¥ãŒ
Zookeeperã¯ãéäžåæ£ãã¥ãŒãç·šæããã®ã«æé©ãªåè£ã§ã¯ãªãããšã«æ³šæããŠãã ããã倧éã®ã¡ãã»ãŒãžã確å®ã«ééãããå¿ èŠãããå Žåã¯ãApache KafkaãRabbitMQãªã©ã®ç¹å¥ã«èšèšããããœãªã¥ãŒã·ã§ã³ã䜿çšããããšããå§ãããŸãã ãã ãããã¥ã¬ãŒã¿ãŒã¯ãã¥ãŒããµããŒãããããã®äžé£ã®ã¬ã·ããæäŸããŸãã
- åæ£ãã¥ãŒ -åªå 床ã®é«ãé ã«ã¡ãã»ãŒãžãå ¥ãããåãåºãããã§ããéåžžã®åæ£ãã¥ãŒã
- åæ£IDãã¥ãŒ -åã¡ãã»ãŒãžã«èå¥åãæ ŒçŽããèå¥åã䜿ã£ãŠãã¥ãŒããã¡ãã»ãŒãžãããã«åé€ã§ããããã«ããåæ£ãã¥ãŒã
- åæ£åªå 床ãã¥ãŒ -åªå 床ãã¥ãŒã
- åæ£é 延ãã¥ãŒ -ãã¥ãŒã䜿çšãããšãè¿œå ãããåã¢ã€ãã ã®æéãUnixtime圢åŒã§èšå®ã§ãããã¥ãŒããã®èªã¿åããå¯èœã«ãªããŸãã
- Simple Distributed Queueã¯ãæšæºã®Zookeeper APIã«ãã£ãŠæäŸããããã¥ãŒã«é¡äŒŒããŠããŸãã
ãããã«
Apache Curatorã©ã€ãã©ãªãŒã¯ç¢ºãã«äœ¿çšãæ€èšãã䟡å€ãããããšã³ãžãã¢ãªã³ã°äœæ¥ã®åªããäŸã§ãããApache Zookeeperãšã®å¯Ÿè©±ãå€§å¹ ã«ç°¡çŽ åã§ããŸãã ã©ã€ãã©ãªã®çæã«ã¯ãããã¥ã¡ã³ãã®éãå°ãªããããåå¿è ã®éçºè ã«ãšã£ãŠåå ¥éå£ãé«ããªããŸãã ç§ã®å®è·µã§ã¯ãç¹å®ã®ã¬ã·ããã©ã®ããã«æ©èœããããç解ããããã«ãã©ã€ãã©ãªã®ãœãŒã¹ã³ãŒããç¹°ãè¿ã調æ»ããå¿ èŠããããŸããã ãã ããããã«ã¯ãã©ã¹ã®å¹æããããŸããå®è£ ãæ·±ãç解ããããšã§ãä»®å®ã«åºã¥ããè«çãšã©ãŒãå°ãªããªããŸãã
ãã¥ã¬ãŒã¿ãŒã®éçºè ã¯ãã©ã€ãã©ãªã®äœ¿çšãéå§ããåã«ãZookeeperã®ããã¥ã¡ã³ããåŠç¿ããããšããå§ãããŸãã Zookeeperã¯å¹æçãªäœ¿çšã®ããã®è£œåã§ããããã®APIãç¥ã£ãŠããã ãã§ãªãããã®ä»çµã¿ãç解ããå¿ èŠããããããããã¯éåžžã«åççãªã¢ããã€ã¹ã§ãã ãããã®ã³ã¹ãã¯ç¢ºå®ã«å ±ãããçµéšè±å¯ãªãšã³ãžãã¢ãZookeeperæ©èœã䜿çšããããšã§ãä¿¡é Œæ§ãé«ãçç£çãªåæ£ã·ã¹ãã ãäœæã§ããŸãã