VKontakte ã®äœæã®æŽå²ã¯ Wikipedia ã«ãããPavel èªèº«ã«ãã£ãŠèªãããŠããŸãã 誰ãã圌女ã®ããšããã§ã«ç¥ã£ãŠããããã§ãã HighLoad++ Pavel ã®ãµã€ãã®å
éšãã¢ãŒããã¯ãã£ãæ§é ã«ã€ããŠ
ã¢ã¬ã¯ã»ã€ã»ã¢ã¯ããŽã£ãã (
XNUMX 幎以äžãç§ã¯ããã¯ãšã³ãã«é¢é£ããããããçš®é¡ã®ã¿ã¹ã¯ã«åãçµãã§ããŸããã
- ã¡ãã£ã¢ã®ã¢ããããŒããä¿åãåŠçãé åž: ãããªãã©ã€ã ã¹ããªãŒãã³ã°ããªãŒãã£ãªãåçãããã¥ã¡ã³ãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ããã©ãããã©ãŒã ãéçºè ã®ç£èŠããã°ãå°åãã£ãã·ã¥ãCDNãç¬èªã® RPC ãããã³ã«ã
- å€éšãµãŒãã¹ãšã®çµ±å: ããã·ã¥éç¥ãå€éšãªã³ã¯è§£æãRSS ãã£ãŒãã
- ååã®ããŸããŸãªè³ªåããµããŒãããŸããããã®çããåŸãã«ã¯æªç¥ã®ã³ãŒãã«é£ã³èŸŒãå¿ èŠããããŸãã
ãã®éãç§ã¯ãµã€ãã®å€ãã®ã³ã³ããŒãã³ãã«æºãããŸããã ãã®çµéšãå ±æããããšæããŸãã
äžè¬çãªã¢ãŒããã¯ãã£
ãã€ãã®ããã«ããã¹ãŠã¯ãªã¯ãšã¹ããåãå ¥ãããµãŒããŒãŸãã¯ãµãŒããŒã®ã°ã«ãŒãããå§ãŸããŸãã
ããã³ããµãŒããŒ
ããã³ã ãµãŒããŒã¯ãHTTPSãRTMPãããã³ WSS çµç±ã§ãªã¯ãšã¹ããåãå ¥ããŸãã
HTTPS - ãããã¯ããµã€ãã®ã¡ã€ã³ããã³ã¢ãã€ã« Web ããŒãžã§ã³ (vk.com ããã³ m.vk.com)ãããã³ API ã®ãã®ä»ã®å ¬åŒããã³éå ¬åŒã¯ã©ã€ã¢ã³ã (ã¢ãã€ã« ã¯ã©ã€ã¢ã³ããã¡ãã»ã³ãžã£ãŒ) ã«å¯Ÿãããªã¯ãšã¹ãã§ãã åä»ãè¡ã£ãŠãããŸã RTMP- åå¥ã®ããã³ã ãµãŒããŒã䜿çšããã©ã€ã ãããŒããã£ã¹ãã®ãã©ãã£ãã¯ãš WSS- ã¹ããªãŒãã³ã° API ã®æ¥ç¶ã
ãµãŒããŒäžã® HTTPS ãš WSS ã®å Žåã¯äŸ¡å€ããããŸã nginxã RTMP ãããŒããã£ã¹ãã«ã€ããŠã¯ãæè¿ç¬èªã®ãœãªã¥ãŒã·ã§ã³ã«åãæ¿ããŸããã ã«ã€ãããããããã¯ã¬ããŒãã®ç¯å²ãè¶ ããŠããŸãã ãã©ãŒã«ã ãã¬ã©ã³ã¹ãå®çŸããããã«ããããã®ãµãŒããŒã¯å ±éã® IP ã¢ãã¬ã¹ãã¢ããã¿ã€ãºããã°ã«ãŒãã§åäœãããããããããã®ãµãŒããŒã«åé¡ãçºçããå Žåã§ããŠãŒã¶ãŒã®ãªã¯ãšã¹ãã倱ãããªãããã«ããŸãã HTTPS ãš WSS ã®å Žåããããã®åããµãŒããŒã¯ãCPU è² è·ã®äžéšãèªåèªèº«ã«è² æ ãããããã«ãã©ãã£ãã¯ãæå·åããŸãã
WSS ãš RTMP ã«ã€ããŠã¯ãã以äžèª¬æããŸãããéåžžãWeb ãããžã§ã¯ãã«é¢é£ä»ããããæšæºã® HTTPS ãªã¯ãšã¹ãã«ã€ããŠã®ã¿èª¬æããŸãã
ããã¯ãšã³ã
éåžžãããã³ãã®èåŸã«ã¯ããã¯ãšã³ã ãµãŒããŒããããŸãã ããã³ã ãµãŒããŒãã¯ã©ã€ã¢ã³ãããåä¿¡ãããªã¯ãšã¹ããåŠçããŸãã
ãã kPHPãµãŒããŒHTTPS ã¯ãã§ã«åŸ©å·åãããŠãããããHTTP ããŒã¢ã³ãå®è¡ãããŠããŸãã kPHP ã¯ãäžã§å®è¡ããããµãŒããŒã§ãã ããªãã©ãŒã¯ã¢ãã«: ãã¹ã¿ãŒããã»ã¹ãšå€æ°ã®åããã»ã¹ãéå§ãããªã¹ãã³ã°ãœã±ããããããã«æž¡ãããªã¯ãšã¹ããåŠçããŸãã ãã®å Žåãããã»ã¹ã¯ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ãããšã«åèµ·åããããåèµ·åããã®ã§ã¯ãªããåã«å ã®ãŒãå€ã®ç¶æ ã«ãªã»ãããããŸã (ãªã¯ãšã¹ãããšã«)ã
è² è·åæ£
ãã¹ãŠã®ããã¯ãšã³ãã¯ããããããªã¯ãšã¹ããåŠçã§ãã巚倧ãªãã·ã³ã®ããŒã«ã§ã¯ãããŸããã ç§ãã¡åœŒã å¥ã ã®ã°ã«ãŒãã«åãããã: äžè¬ãã¢ãã€ã«ãAPIããããªãã¹ããŒãžã³ã°... ãã·ã³ã®å¥ã®ã°ã«ãŒãã§ã®åé¡ã¯ãä»ã®ãã¹ãŠã®ãã·ã³ã«ã¯åœ±é¿ããŸããã ãããªã«åé¡ãçºçããå Žåãé³æ¥œãèŽããŠãŒã¶ãŒã¯ãã®åé¡ã«ããæ°ã¥ããŸããã ã©ã®ããã¯ãšã³ãã«ãªã¯ãšã¹ããéä¿¡ãããã¯ãèšå®ââã«åŸã£ãŠããã³ãã® nginx ã«ãã£ãŠæ±ºå®ãããŸãã
ã¡ããªã¯ã¹ã®åéãšåãã©ã³ã¹
åã°ã«ãŒãã«äœå°ã®è»ãå¿ èŠããç解ããã«ã¯ã次ã®ããã«ããŸãã QPSã«äŸåããªãã§ãã ããã ããã¯ãšã³ããç°ãªããç°ãªããªã¯ãšã¹ãããããåãªã¯ãšã¹ãã® QPS èšç®ã®è€éããç°ãªããŸãã ã ããããç§ãã¡ã¯ ç§ãã¡ã¯ãµãŒããŒå šäœãã€ãŸã CPU ãšããã©ãŒãã³ã¹ã«å¯Ÿããè² è·ã®æŠå¿µã䜿çšããŠåäœããŸãã.
åœç€Ÿã«ã¯ãã®ãããªãµãŒããŒãæ°åå°ãããŸãã åç©çãµãŒããŒã¯ kPHP ã°ã«ãŒããå®è¡ããŠããã¹ãŠã®ã³ã¢ããªãµã€ã¯ã«ããŸã (kPHP ã¯ã·ã³ã°ã«ã¹ã¬ããã§ãããã)ã
ã³ã³ãã³ããµãŒããŒ
CS ãŸãã¯ã³ã³ãã³ã ãµãŒããŒã¯ã¹ãã¬ãŒãžã§ãã CS ã¯ããã¡ã€ã«ãä¿åããã¢ããããŒãããããã¡ã€ã«ããã¡ã€ã³ã® Web ããã³ããšã³ããå²ãåœãŠãããããçš®é¡ã®ããã¯ã°ã©ãŠã³ãåæã¿ã¹ã¯ãåŠçãããµãŒããŒã§ãã
ãã¡ã€ã«ãä¿åããç©çãµãŒããŒãæ°äžå°ãããŸãã ãŠãŒã¶ãŒã¯ãã¡ã€ã«ãã¢ããããŒãããã®ã奜ãã§ãç§ãã¡ããã¡ã€ã«ãä¿åãããå ±æãããããã®ã奜ãã§ãã ãããã®ãµãŒããŒã®äžéšã¯ãç¹å¥ãª pu/pp ãµãŒããŒã«ãã£ãŠéããããŠããŸãã
ã/ãã
VK ã§ãããã¯ãŒã¯ ã¿ããéããšãpu/pp ã衚瀺ãããŸãã
pu/ppãšã¯äœã§ãã? ãµãŒããŒã次ã
ãšéããå ŽåãéãããããµãŒããŒã«ãã¡ã€ã«ãã¢ããããŒãããã³ããŠã³ããŒãããã«ã¯ XNUMX ã€ã®ãªãã·ã§ã³ããããŸãã çŽæ¥ ã¹ã«ãŒ http://cs100500.userapi.com/path
ãŸã㯠äžéãµãŒããŒçµç± - http://pu.vk.com/c100500/path
.
Pu ã¯åçã¢ããããŒãã®æŽå²çãªååãpp ã¯åçãããã·ã§ãã ã€ãŸããXNUMX ã€ã®ãµãŒããŒã¯åçã®ã¢ããããŒãçšã§ããããã XNUMX ã€ã®ãµãŒããŒã¯ã¢ããããŒãçšã§ãã åçãèªã¿èŸŒãŸããã ãã§ãªããååãä¿æãããããã«ãªããŸããã
ãããã®ãµãŒã㌠HTTPSã»ãã·ã§ã³ãçµäºããã¹ãã¬ãŒãžããããã»ããµã®è² è·ã軜æžããŸãã ãŸãããŠãŒã¶ãŒ ãã¡ã€ã«ã¯ãããã®ãµãŒããŒã§åŠçãããããããããã®ãã·ã³ã«ä¿åãããæ å ±ã®æ©å¯æ§ã¯äœãã»ã©åªããŠããŸãã ããšãã°ãHTTPS æå·åããŒãªã©ã§ãã
ãããã®ãã·ã³ã¯ä»ã®ãã·ã³ã«ãã£ãŠéããããŠããããããããã«ããã¯ã€ããå€éš IP ãä»äžããªããŠãæžã¿ãŸãã ãç°è²ããäžããã ãã®ããã«ããŠãIP ããŒã«ãä¿åããå€éšã¢ã¯ã»ã¹ãããã·ã³ãä¿è·ããããšãä¿èšŒãããŸãããåã«ããã«å ¥ã IP ãååšããªãã ãã§ãã
å ±æIPãä»ãã埩å åã ãã©ãŒã«ã ãã¬ã©ã³ã¹ã®èŠ³ç¹ããã¯ããã®ã¹ããŒã ã¯åãããã«æ©èœããŸããè€æ°ã®ç©çãµãŒããŒãå ±éã®ç©ç IP ãæã¡ããã®åã«ããããŒããŠã§ã¢ããªã¯ãšã¹ãã®éä¿¡å ãéžæããŸãã ä»ã®ãªãã·ã§ã³ã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
ç©è°ãéžããŠããç¹ã¯ããã®å Žåã ã¯ã©ã€ã¢ã³ããä¿æããæ¥ç¶ãå°ãªããªããŸãã åããã¹ã (pu.vk.com ãŸã㯠pp.vk.com) ã䜿çšããè€æ°ã®ãã·ã³ã«åã IP ãããå Žåãã¯ã©ã€ã¢ã³ã ãã©ãŠã¶ã«ã¯ 2 ã€ã®ãã¹ãã«å¯Ÿããåæãªã¯ãšã¹ãã®æ°ã«å¶éããããŸãã ããããHTTP/XNUMX ããŠããã¿ã¹ã«ãªã£ãæ代ã«ã¯ãããã¯ãã¯ãããŸãæå³ããªããšæããŸãã
ãã®ã¹ããŒã ã®æãããªæ¬ ç¹ã¯ã次ã®ããšã§ãã ãã¹ãŠã®ãã©ãã£ãã¯ããã³ããããå¥ã®ãµãŒããŒãä»ããŠã¹ãã¬ãŒãžã«ç§»åããŸãã ãã·ã³ãä»ããŠãã©ãã£ãã¯ããã³ããããããåãã¹ããŒã ã䜿çšããŠãããªãªã©ã®å€§éã®ãã©ãã£ãã¯ããã³ãããããšã¯ãŸã ã§ããŸããã ç§ãã¡ã¯ãããçŽæ¥éä¿¡ããŸã - ãããªå°çšã®åå¥ã®ã¹ãã¬ãŒãžãžã®åå¥ã®çŽæ¥æ¥ç¶ã 軜ãã³ã³ãã³ãã¯ãããã·çµç±ã§éä¿¡ããŸãã
å°ãåã«ããããã·ã®æ¹è¯çãå ¥æããŸããã ããã§ã¯ãããããéåžžã®ãã®ãšã©ã®ããã«ç°ãªãã®ãããããŠãªããããå¿ èŠãªã®ãã説æããŸãã
æ¥
2017 幎 XNUMX æã以åã« Sun ãè²·åãã Oracle ã¯ã
ppã«ã¯ããã€ãã®åé¡ããããŸããã ã°ã«ãŒãããšã« XNUMX ã€ã® IP - éå¹ççãªãã£ãã·ã¥ã è€æ°ã®ç©çãµãŒããŒãå
±éã® IP ã¢ãã¬ã¹ãå
±æããŠããããããªã¯ãšã¹ããã©ã®ãµãŒããŒã«éä¿¡ãããããå¶åŸ¡ããæ¹æ³ã¯ãããŸããã ãããã£ãŠãç°ãªããŠãŒã¶ãŒãåããã¡ã€ã«ãååŸããå Žåããããã®ãµãŒããŒã«ãã£ãã·ã¥ãããå Žåããã¡ã€ã«ã¯åãµãŒããŒã®ãã£ãã·ã¥ã«ä¿åãããŸãã ããã¯éåžžã«éå¹çãªèšç»ã§ãããäœãããããšãã§ããŸããã§ããã
ãã®çµæ - ã³ã³ãã³ããã·ã£ãŒãã£ã³ã°ããããšã¯ã§ããŸããããã®ã°ã«ãŒãã«ç¹å®ã®ãµãŒããŒãéžæããããšã¯ã§ããªãããããããã¯å ±éã® IP ãæã£ãŠããŸãã ãŸããããã€ãã®å éšçãªçç±ã«ããã ãã®ãããªãµãŒããŒããªãŒãžã§ã³ã«ã€ã³ã¹ããŒã«ããããšã¯ã§ããŸããã§ããã 圌ãã¯ãµã³ã¯ãããã«ãã«ã¯ã«ã®ã¿ç«ã£ãŠããã
ãµã³ãºã§ã¯éžæå¶åºŠãå€æŽããŸããã ä»ã§ã¯ã ãšããŒãã£ã¹ãã«ãŒãã£ã³ã°: åçã«ãŒãã£ã³ã°ããšããŒãã£ã¹ããã»ã«ããã§ã㯠ããŒã¢ã³ã åãµãŒããŒã«ã¯ç¬èªã®åå¥ã® IP ããããŸãããå ±éã®ãµããããããããŸãã XNUMX ã€ã®ãµãŒããŒã«é害ãçºçããå Žåããã©ãã£ãã¯ãåãã°ã«ãŒãã®ä»ã®ãµãŒããŒã«èªåçã«åæ£ãããããã«ããã¹ãŠãæ§æãããŠããŸãã ç¹å®ã®ãµãŒããŒãéžæã§ããããã«ãªããŸããã åé·ãªãã£ãã·ã¥ã¯ãããŸãããä¿¡é Œæ§ã«ã¯åœ±é¿ããŸããã§ããã
äœéãµããŒãã çŸåšã§ã¯ãå¿ èŠã«å¿ããŠããŸããŸãªåºåã®æ©æ¢°ãèšçœ®ããäœè£ãããããŸããäžæçãªåé¡ãçºçããå Žåã«ã¯ã皌åäžã®ã倪éœãã®éããå€æŽããŠè² è·ã軜æžãã倪éœããäŒãã§ãåã³åãå§ããããã«ããããšãã§ããŸãã
ã³ã³ãã³ãIDã«ããã·ã£ãŒãã£ã³ã°ã ã·ã£ãŒãã£ã³ã°ã«é¢ããé¢çœãç¹ã¯ãéåžžãç°ãªããŠãŒã¶ãŒãåãã倪éœããéããŠåããã¡ã€ã«ã«ã¢ã¯ã»ã¹ããå ±éã®ãã£ãã·ã¥ãæãŠãããã«ã³ã³ãã³ããã·ã£ãŒãã£ã³ã°ããããšã§ãã
ãã®ãã³ãCloverãã¢ããªããªãªãŒã¹ããŸããã ããã¯çæŸéã§ã®ãªã³ã©ã€ã³ ã¯ã€ãºã§ããã¹ãã質åãããŠãŒã¶ãŒã¯ãªãã·ã§ã³ãéžæããŠãªã¢ã«ã¿ã€ã ã§åçããŸãã ã¢ããªã«ã¯ãŠãŒã¶ãŒããã£ããã§ãããã£ããããããŸãã ãããŒããã£ã¹ãã«åæã«æ¥ç¶ã§ããŸã 100äžäººä»¥äžã 圌ãã¯å šå¡ãåå è å šå¡ã«éä¿¡ãããã¡ãã»ãŒãžãæžããã¢ãã¿ãŒãã¡ãã»ãŒãžãšäžç·ã«ãã£ãŠæ¥ãŸãã 100 åã®ã倪éœãã« XNUMX äžäººã XNUMX ã€ã®ã¢ãã¿ãŒãæ±ããŠãã£ãŠæ¥ããšãé²ã«é ããŠããŸãããšããããŸãã
åããã¡ã€ã«ã«å¯Ÿãããªã¯ãšã¹ãã®ããŒã¹ãã«èããããã«ãç¹å®ã®çš®é¡ã®ã³ã³ãã³ãã«å¯ŸããŠã¯ããã®å°åã§å©çšå¯èœãªãã¹ãŠã®ã倪éœãã«ãã¡ã€ã«ãåæ£ãããæããªèšç»ãæå¹ã«ããŠããŸãã
å åŽããã®å€ªéœ
nginx äžã®ãªããŒã¹ ãããã·ãRAM ãŸãã¯é«é Optane/NVMe ãã£ã¹ã¯ã®ããããã«ãã£ãã·ã¥ããŸãã äŸïŒ http://sun4-2.userapi.com/c100500/path
â 100500 çªç®ã®å°åãXNUMX çªç®ã®ãµãŒã㌠ã°ã«ãŒãã«ããã倪éœããžã®ãªã³ã¯ã ç©ççã«ãµãŒã㌠XNUMX ã«ãããã¹ ãã¡ã€ã«ãéããŸãã
ãã£ãã·ã¥
ã¢ãŒããã¯ãã£ã¹ããŒã ã«ãã XNUMX ã€ã®ããŒããã€ãŸããã£ãã·ã¥ç°å¢ãè¿œå ããŸãã
以äžã¯ã¬ã€ã¢ãŠãå³ã§ã å°åãã£ãã·ã¥ã20åã»ã©ãããŸãã ãããã¯ããã£ãã·ã¥ãšããµã³ããé
眮ãããããèªäœãä»ããŠãã©ãã£ãã¯ããã£ãã·ã¥ã§ããå Žæã§ãã
ããã¯ãã«ãã¡ãã£ã¢ ã³ã³ãã³ãã®ãã£ãã·ã¥ã§ããããã«ã¯ãŠãŒã¶ãŒ ããŒã¿ã¯ä¿åããããé³æ¥œããããªãåçã®ã¿ãä¿åãããŸãã
ãŠãŒã¶ãŒã®å°åãç¹å®ããããã«ã ãªãŒãžã§ã³ã§çºè¡šããã BGP ãããã¯ãŒã¯ ãã¬ãã£ãã¯ã¹ãåéããŸãã ãã©ãŒã«ããã¯ã®å Žåããã¬ãã£ãã¯ã¹ã§ IP ãèŠã€ãããªãã£ãå Žåã¯ãgeoip ããŒã¿ããŒã¹ã解æããå¿ èŠããããŸãã ãŠãŒã¶ãŒã®IPã«ãã£ãŠå°åã決å®ããŸãã ã³ãŒãã§ã¯ããŠãŒã¶ãŒã® XNUMX ã€ä»¥äžã®å°åãã€ãŸããŠãŒã¶ãŒãå°ççã«æãè¿ãå°ç¹ã調ã¹ãããšãã§ããŸãã
ããã¯ã©ã®ããã«åäœããŸããïŒ
ãã¡ã€ã«ã®äººæ°ãå°åããšã«ã«ãŠã³ãããŸãã ãŠãŒã¶ãŒãããå°åãã£ãã·ã¥ã®çªå·ãšãã¡ã€ã«èå¥åãããããã®ãã¢ãååŸããŠãããŠã³ããŒãããšã«è©äŸ¡ãå¢åããŸãã
åæã«ãããŒã¢ã³ (ãªãŒãžã§ã³å ã®ãµãŒãã¹) ãæã API ã«ãã£ãŠæ¥ãŠãããèšããŸãã ã API ã¯è©äŸ¡å¥ã«åé¡ãããå€æ°ã®ãã¡ã€ã«ãé ä¿¡ããããŒã¢ã³ã¯ããããããŠã³ããŒãããŠãªãŒãžã§ã³ã«åã蟌ã¿ããããããã¡ã€ã«ãé ä¿¡ããŸãã ãããããã£ãã·ã¥ããã® pu/pp ãš Sun ã®æ ¹æ¬çãªéãã§ãããã£ãã·ã¥ã«ãã¡ã€ã«ãååšããªãå Žåã§ãããã£ãã·ã¥ã¯ããã«ãã¡ã€ã«ãèªåèªèº«ã«æž¡ãããã£ãã·ã¥ã¯æåã«ãã¡ã€ã«ãèªåèªèº«ã«ããŠã³ããŒãããŠããããã®ãã¡ã€ã«ãè¿ãå§ããŸãã
ãã®å Žåã次ã®ããã«ãªããŸãã ãŠãŒã¶ãŒã«è¿ãã³ã³ãã³ã ãããŠãããã¯ãŒã¯è² è·ãåæ£ããŸãã ããšãã°ãã¢ã¹ã¯ã¯ ãã£ãã·ã¥ããã®ã¿ãããŒã¯æã« 1 Tbit/s 以äžãé åžããŸãã
ããããåé¡ããããŸã - ãã£ãã·ã¥ãµãŒããŒã¯ãŽã ã§ã¯ãããŸããã éåžžã«äººæ°ã®ããã³ã³ãã³ãã®å Žåãå¥ã®ãµãŒããŒãèšçœ®ããã®ã«ååãªãããã¯ãŒã¯ããªãå ŽåããããŸãã åœç€Ÿã®ãã£ãã·ã¥ ãµãŒããŒã¯ 40 ïœ 50 Gbit/s ã§ããããã®ãããªãã£ãã«ãå®å šã«è©°ãŸãããã³ã³ãã³ãããããŸãã ç§ãã¡ã¯ããã®å°åã§äººæ°ã®ãããã¡ã€ã«ã®è€æ°ã®ã³ããŒã®ã¹ãã¬ãŒãžã®å®è£ ã«åããŠåãçµãã§ããŸãã 幎æ«ãŸã§ã«å®è£ ã§ããããšãé¡ã£ãŠããŸãã
äžè¬çãªã¢ãŒããã¯ãã£ãèŠãŠãããŸããã
- ãªã¯ãšã¹ããåãå ¥ããããã³ããµãŒããŒã
- ãªã¯ãšã¹ããåŠçããããã¯ãšã³ãã
- XNUMX çš®é¡ã®ãããã·ã«ãã£ãŠéããããã¹ãã¬ãŒãžã
- å°åãã£ãã·ã¥ã
ãã®å³ã«ã¯äœãæ¬ ããŠããŸãã? ãã¡ãããããŒã¿ãä¿åããããŒã¿ããŒã¹ã§ãã
ããŒã¿ããŒã¹ãŸãã¯ãšã³ãžã³
äžè¬ã«åãå ¥ããããŠããæå³ã§ã®ããŒã¿ããŒã¹ãå®éã«ã¯ååšããªããããç§ãã¡ã¯ããããããŒã¿ããŒã¹ã§ã¯ãªããšã³ãžã³ãšåŒã³ãŸãã
ããã¯å¿
èŠãªæ段ã§ããã ããã¯ãVK ã®äººæ°ãççºçã«é«ãŸã£ã 2008 幎ãã 2009 幎ã«ããããžã§ã¯ããå®å
šã« MySQL ãš Memcache äžã§åäœããåé¡ãçºçããããã«èµ·ãããŸããã MySQL ã¯é »ç¹ã«ã¯ã©ãã·ã¥ããŠãã¡ã€ã«ãç Žæãããã®åŸå埩ã§ããªããªããMemcache ã®ããã©ãŒãã³ã¹ãåŸã
ã«äœäžããŠåèµ·åããå¿
èŠããããŸããã
人æ°ãé«ãŸã£ãŠãããããžã§ã¯ãã«ã¯ãããŒã¿ãç Žæããæ°žç¶ã¹ãã¬ãŒãžãšãé床ãäœäžããããã£ãã·ã¥ãååšããŠããããšãå€æããŸããã ãã®ãããªç¶æ³ã§ã¯ãæé·ãããããžã§ã¯ããéçºããããšã¯å°é£ã§ãã ãã®ãããžã§ã¯ããçŠç¹ãåœãŠãŠããéèŠãªããšãèªåãã¡ã®èªè»¢è»ã«æžãæããŠã¿ãããšã«ããŸããã
解決çã¯æåããŸããã åœæã¯ä»ã®ã¹ã±ãŒãªã³ã°æ¹æ³ãååšããŠããªãã£ãã®ã§ããããè¡ãæ©äŒããã£ããšåæã«ãéåžžã«å¿ èŠã§ããã ããŒã¿ããŒã¹ã¯ããã»ã©å€ãã¯ãªããNoSQL ããŸã ååšãããMySQLãMemcacheãPostrgreSQL ãããããŸããã§ãããããã ãã§ããã
ãŠãããŒãµã«æäœã éçºã¯ C éçºè ã®ããŒã ã«ãã£ãŠäž»å°ããããã¹ãŠãäžè²«ããæ¹æ³ã§è¡ãããŸããã ãšã³ãžã³ã«é¢ä¿ãªãããããã¯ãã¹ãŠã»ãŒåããã¡ã€ã«åœ¢åŒã§ãã£ã¹ã¯ã«æžã蟌ãŸããåãèµ·åãã©ã¡ãŒã¿ãæã¡ãåãæ¹æ³ã§ä¿¡å·ãåŠçãããšããžã®ç¶æ³ãåé¡ãçºçããå Žåã«ã»ãŒåãããã«åäœããŸããã ãšã³ãžã³ã®æé·ã«äŒŽãã管çè ã¯ã·ã¹ãã ãæäœããã®ã䟿å©ã«ãªããŸããã管çããå¿ èŠã®ããåç©åããªããªããæ°ãããµãŒãããŒã㣠ããŒã¿ããŒã¹ããšã«æäœæ¹æ³ãååŠç¿ããå¿ èŠããããããè¿ éãã€äŸ¿å©ã«ããŒã¿ããŒã¹ãå¢ããããšãå¯èœã«ãªããŸããã圌ãã®çªå·ã
ãšã³ãžã³ã®çš®é¡
ããŒã ã¯ããªãã®æ°ã®ãšã³ãžã³ãäœæããŸããã 以äžã«ãããã®ã»ãã®äžéšã瀺ããŸã: å人ããã³ããç»åãipdbãæçŽããªã¹ãããã°ãmemcachedãmeowdbããã¥ãŒã¹ããã¹ãã©ãã ã¹ãåçããã¬ã€ãªã¹ããpmemcachedããµã³ãããã¯ã¹ãæ€çŽ¢ãã¹ãã¬ãŒãžãããããã¿ã¹ã¯ãªã©ã
ç¹å®ã®ããŒã¿æ§é ãå¿ èŠãšããã¿ã¹ã¯ããç¹æ®ãªãªã¯ãšã¹ããåŠçããã¿ã¹ã¯ããšã«ãC ããŒã ã¯æ°ãããšã³ãžã³ãäœæããŸãã ãªãã ãã§ããã
ç¬ç«ãããšã³ãžã³ãæèŒããŠããŸã memcachedãéåžžã®ãã®ãšäŒŒãŠããŸãããããããã®ç¹å žããããé床ãäœäžããããšã¯ãããŸããã ClickHouse ã§ã¯ãããŸãããããããæ©èœããŸãã å¥éè³Œå ¥å¯èœ pmemcached - ã§ã æ°žç¶çãªmemcachedããã«ãåèµ·åæã«ããŒã¿ã倱ãããªãããã«ãRAM ã«åãŸãããããã£ã¹ã¯ã«ããŒã¿ãä¿åããããšãã§ããŸãã åã ã®ã¿ã¹ã¯ã«ã¯ããŸããŸãªãšã³ãžã³ããããŸã: ãã¥ãŒããªã¹ããã»ãããªã©ããããžã§ã¯ãã«å¿ èŠãªãã®ãã¹ãŠã§ãã
ã¯ã©ã¹ã¿ãŒ
ã³ãŒãã®èŠ³ç¹ããèŠããšããšã³ãžã³ãããŒã¿ããŒã¹ãããã»ã¹ããšã³ãã£ãã£ããŸãã¯ã€ã³ã¹ã¿ã³ã¹ãšããŠèããå¿ èŠã¯ãããŸããã ãã®ã³ãŒãã¯ãç¹ã«ã¯ã©ã¹ã¿ãŒããšã³ãžã³ã®ã°ã«ãŒãã§åäœããŸãã ã¯ã©ã¹ã¿ãŒããšã« XNUMX ã€ã®ã¿ã€ãã memcached ã¯ã©ã¹ã¿ãŒããããšããŸããããã¯åãªããã·ã³ã®ã°ã«ãŒãã§ãã
ã³ãŒãã¯ãµãŒããŒã®ç©ççãªå Žæããµã€ãºãæ°ãç¥ãå¿ èŠã¯ãŸã£ãããããŸããã 圌ã¯ç¹å®ã®èå¥åã䜿çšããŠã¯ã©ã¹ã¿ãŒã«ã¢ã¯ã»ã¹ããŸãã
ãããæ©èœãããã«ã¯ãã³ãŒããšãšã³ãžã³ã®éã«ãšã³ãã£ãã£ããã XNUMX ã€è¿œå ããå¿ èŠããããŸãã 代ç.
RPC ãããã·
ãããã· é£çµ¡ãã¹ããµã€ãã®ã»ãŒå šäœããã®äžã§å®è¡ãããŸãã åæã«ãç§ãã¡ã¯ ãµãŒãã¹æ€åºããããŸãã â 代ããã«ããã®ãããã·ã®æ§æãããããã®ãããã·ã¯ããã¹ãŠã®ã¯ã©ã¹ã¿ãŒãšãã®ã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã·ã£ãŒãã®å ŽæãèªèããŠããŸãã ããã¯ç®¡çè ãè¡ãããšã§ãã
ããã°ã©ããŒã¯ãã©ãã«ã©ããããã®è²»çšããããããªã©ãŸã£ããæ°ã«ããããã ã¯ã©ã¹ã¿ãŒã«ã¢ã¯ã»ã¹ããã ãã§ãã ããã«ãããå€ãã®ããšãå¯èœã«ãªããŸãã ãªã¯ãšã¹ããåä¿¡ãããšããããã·ã¯ã©ãã«ããããèªèããŠãªã¯ãšã¹ãããªãã€ã¬ã¯ãããŸããããã¯ãããã·èªèº«ã決å®ããŸãã
ãã®å Žåããããã·ã¯ãµãŒãã¹é害ã«å¯Ÿããä¿è·ç¹ãšãªããŸãã äžéšã®ãšã³ãžã³ãé
ããªã£ããã¯ã©ãã·ã¥ããããããšããããã·ã¯ãããç解ããã¯ã©ã€ã¢ã³ãåŽã«å¿ããŠå¿çããŸãã ããã«ãããã¿ã€ã ã¢ãŠããåé€ã§ããŸããã³ãŒãã¯ãšã³ãžã³ã®å¿çãåŸ
æ©ããŸãããããšã³ãžã³ãæ©èœããŠããããäœããã®æ¹æ³ã§å¥ã®åäœãããå¿
èŠãããããšãç解ããŸãã ããŒã¿ããŒã¹ãåžžã«æ©èœãããšã¯éããªããšããäºå®ã«åããŠãã³ãŒããæºåããå¿
èŠããããŸãã
å ·äœçãªå®è£
å Žåã«ãã£ãŠã¯ããšã³ãžã³ãšããŠäœããã®éæšæºçãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠã«ãªãããšããããŸãã åæã«ããšã³ãžã³å°çšã«äœæãããæ¢è£œã® rpc ãããã·ã䜿çšãããã¿ã¹ã¯çšã«å¥ã®ãããã·ãäœæããããšã決å®ãããŸããã
MySQL ã«ã¯ãŸã ãã¡ãã¡ã«ãããŸãããdb-proxy ã䜿çšããClickHouse ã«ã¯ - åç«ã®å®¶.
倧äœãããªæãã§åäœããŸãã ç¹å®ã®ãµãŒããŒããããkPHPãGoãPythonãã€ãŸã RPC ãããã³ã«ã䜿çšã§ããããããã³ãŒããå®è¡ããŸãã ã³ãŒã㯠RPC ãããã·äžã§ããŒã«ã«ã«å®è¡ãããŸããã³ãŒããé 眮ãããŠããåãµãŒããŒã¯ç¬èªã®ããŒã«ã« ãããã·ãå®è¡ããŸãã èŠæ±ã«å¿ããŠã代ç人ã¯ã©ãã«è¡ãã¹ãããç解ããŸãã
ãããšã³ãžã³ãå¥ã®ãšã³ãžã³ã«ã¢ã¯ã»ã¹ãããå Žåããããé£æ¥ãšã³ãžã³ã§ãã£ãŠããé£æ¥ãšã³ãžã³ãå¥ã®ããŒã¿ ã»ã³ã¿ãŒã«ååšããå¯èœæ§ãããããããããã·ãçµç±ããŸãã ãšã³ãžã³ã¯ãããèªäœä»¥å€ã®å Žæãç¥ãããšã«äŸåãã¹ãã§ã¯ãããŸããããããç§ãã¡ã®æšæºãœãªã¥ãŒã·ã§ã³ã§ãã ãããããã¡ããäŸå€ããããŸã:)
ãã¹ãŠã®ãšã³ãžã³ãåäœãã TL ã¹ããŒã ã®äŸã
memcache.not_found = memcache.Value;
memcache.strvalue value:string flags:int = memcache.Value;
memcache.addOrIncr key:string flags:int delay:int value:long = memcache.Value;
tasks.task
fields_mask:#
flags:int
tag:%(Vector int)
data:string
id:fields_mask.0?long
retries:fields_mask.1?int
scheduled_time:fields_mask.2?int
deadline:fields_mask.3?int
= tasks.Task;
tasks.addTask type_name:string queue_id:%(Vector int) task:%tasks.Task = Long;
ããã¯ãã€ã㪠ãããã³ã«ã§ãããããã«æãè¿ããã®ã¯æ¬¡ã®ãšããã§ãã ãããããã ã¹ããŒãã¯ããªãã·ã§ã³ã®ãã£ãŒã«ããè€åå (çµã¿èŸŒã¿ã¹ã«ã©ãŒã®æ¡åŒµ)ãããã³ã¯ãšãªãäºåã«èšè¿°ããŸãã ãã¹ãŠã¯ãã®ãããã³ã«ã«åŸã£ãŠåäœããŸãã
RPC over TL over TCP/UDPâŠUDP?
TL ã¹ããŒã äžã§å®è¡ããããšã³ãžã³ ãªã¯ãšã¹ããå®è¡ããããã® RPC ãããã³ã«ããããŸãã ããã¯ãã¹ãŠ TCP/UDP æ¥ç¶çµç±ã§æ©èœããŸãã TCP ã¯ç解ã§ããŸããããªãé »ç¹ã« UDP ãå¿ èŠã«ãªãã®ã§ãããã?
UDP ã圹ç«ã¡ãŸã ãµãŒããŒéã®èšå€§ãªæ°ã®æ¥ç¶ã®åé¡ãåé¿ããã åãµãŒããŒã« RPC ãããã·ããããäžè¬ã«ä»»æã®ãšã³ãžã³ã«æ¥ç¶ã§ããå ŽåããµãŒããŒããšã«æ°äžã® TCP æ¥ç¶ãååšããŸãã è² è·ã¯ãããŸããã圹ã«ç«ã¡ãŸããã UDP ã®å Žåããã®åé¡ã¯ååšããŸããã
åé·ãª TCP ãã³ãã·ã§ã€ã¯ãªãã ããã¯å žåçãªåé¡ã§ããæ°ãããšã³ãžã³ãŸãã¯æ°ãããµãŒããŒãèµ·åããããšãäžåºŠã«å€æ°ã® TCP æ¥ç¶ã確ç«ãããŸãã UDP ãã€ããŒããªã©ã®å°èŠæš¡ã§è»œéãªãªã¯ãšã¹ãã®å Žåãã³ãŒããšãšã³ãžã³éã®ãã¹ãŠã®é信㯠XNUMX ã€ã® UDP ãã±ãã: XNUMX æ©ã¯äžæ¹åã«é£è¡ããXNUMX æ©ç®ã¯å¥ã®æ¹åã«é£è¡ããŸãã XNUMX åŸåŸ©ã§ãã³ãŒãã¯ãã³ãã·ã§ã€ã¯ãªãã§ãšã³ãžã³ããå¿çãåãåããŸããã
ã¯ãããã¹ãŠããŸããããŸã ãã±ããæ倱ã®å²åãéåžžã«å°ããã ãã®ãããã³ã«ã¯åéä¿¡ãšã¿ã€ã ã¢ãŠãããµããŒãããŠããŸããã倧éã«å€±ããããšã»ãŒ TCP ãååŸããããšã«ãªããæçã§ã¯ãããŸããã ç§ãã¡ã¯ UDP ãæµ·ãè¶ããŠæšé²ããããã§ã¯ãããŸããã
åœç€Ÿã«ã¯ãã®ãããªãµãŒããŒãäœåå°ããããã¹ããŒã ã¯åãã§ãããšã³ãžã³ã®ããã¯ãåç©çãµãŒããŒã«ã€ã³ã¹ããŒã«ãããŸãã ãããã¯ãããã¯ããããšãªãã§ããã ãæ©ãå®è¡ã§ããããã«ã»ãšãã©ãã·ã³ã°ã«ã¹ã¬ããã§ãããã·ã³ã°ã«ã¹ã¬ãã ãœãªã¥ãŒã·ã§ã³ãšããŠã·ã£ãŒãåãããŠããŸãã åæã«ããããã®ãšã³ãžã³ã»ã©ä¿¡é Œã§ãããã®ã¯ãªããæ°žç¶çãªããŒã¿ ã¹ãã¬ãŒãžã«ã¯çŽ°å¿ã®æ³šæãæãããŠããŸãã
æ°žç¶çãªããŒã¿ã¹ãã¬ãŒãž
ãšã³ãžã³ã¯ãã€ããªãã°ãæžã蟌ã¿ãŸãã ãã€ããªãã°ã¯ãç¶æ
ãŸãã¯ããŒã¿ã®å€æŽã«é¢ããã€ãã³ããæ«å°Ÿã«è¿œå ããããã¡ã€ã«ã§ãã ãœãªã¥ãŒã·ã§ã³ã«ãã£ãŠã¯ããã€ã㪠ãã°ããã€ã㪠ãã°ãªã©ãåŒã³æ¹ãç°ãªããŸãã
åèµ·åæã«ãšã³ãžã³ãäœå¹Žã«ãããã£ãŠãã€ããªå šäœãåèªã¿åãããã®ãé²ãããã«ããšã³ãžã³ã¯æ¬¡ã®ããã«æžã蟌ã¿ãŸãã ã¹ãããã·ã§ãã - çŸåšã®ç¶æ ã å¿ èŠã«å¿ããŠãæåã«ãã€ããªãã°ããèªã¿åãã次ã«ãã€ããªãã°ããã®èªã¿åããçµäºããŸãã ãã¹ãŠã®ãã€ããªãã°ã¯ãTL ã¹ããŒã ã«åŸã£ãŠåããã€ããªåœ¢åŒã§æžã蟌ãŸããããã管çè ã¯ããŒã«ã䜿çšããŠãã€ããªãã°ãåçã«ç®¡çã§ããŸãã ã¹ãããã·ã§ãããªã©ã¯å¿ èŠãããŸããã ã¹ãããã·ã§ããã int ã§ããããšããšã³ãžã³ã®éæ³ã§ããããšãããã³èª°ã«ãšã£ãŠãéèŠã§ã¯ãªãæ¬äœã瀺ãäžè¬çãªããããŒããããŸãã ããã¯ãã¹ãããã·ã§ãããèšé²ãããšã³ãžã³ã«åé¡ããããŸãã
åäœåçãç°¡åã«èª¬æããŸãã ãšã³ãžã³ãåäœãããµãŒããŒããããŸãã 圌ã¯æžã蟌ã¿çšã«æ°ãã空ã®ãã€ããªãã°ãéããããã«å€æŽãå ããã€ãã³ããæžã蟌ã¿ãŸãã
ããæç¹ã§ã圌ã¯èªåã§ã¹ãããã·ã§ãããæ®ãããšã決å®ããããä¿¡å·ãåä¿¡ããŸãã ãµãŒããŒã¯æ°ãããã¡ã€ã«ãäœæãããã¡ã€ã«ã®ç¶æ
å
šäœããã®ãã¡ã€ã«ã«æžã蟌ã¿ãçŸåšã®ãã€ã㪠ãã° ãµã€ãº (ãªãã»ãã) ããã¡ã€ã«ã®æ«å°Ÿã«è¿œå ããŠãããã«æžã蟌ã¿ãç¶ããŸãã æ°ãããã€ããªãã°ã¯äœæãããŸããã
ããæç¹ã§ããšã³ãžã³ãåèµ·åãããšããã£ã¹ã¯äžã«ãã€ããªãã°ãšã¹ãããã·ã§ããã®äž¡æ¹ãäœæãããŸãã ãšã³ãžã³ã¯ã¹ãããã·ã§ããå
šäœãèªã¿åããç¹å®ã®æç¹ã§ãã®ç¶æ
ãåŒãäžããŸãã
ã¹ãããã·ã§ããã®äœææã®äœçœ®ãšãã€ããªãã°ã®ãµã€ãºãèªã¿åããŸãã
ãã€ããªãã°ã®æ«å°Ÿãèªãã§çŸåšã®ç¶æ
ãååŸããããã«ã€ãã³ãã®æžã蟌ã¿ãç¶ããŸãã ããã¯åçŽãªã¹ããŒã ã§ããããã¹ãŠã®ãšã³ãžã³ã¯ããã«åŸã£ãŠåäœããŸãã
ããŒã¿è€è£œ
ãã®çµæãåœç€Ÿã®ããŒã¿ã¬ããªã±ãŒã·ã§ã³ã¯ ã¹ããŒãã¡ã³ãããŒã¹ã® â binlog ã«ã¯ããŒãžå€æŽãæžããŸããããã€ãŸã å€æŽãªã¯ãšã¹ãã ãããã¯ãŒã¯çµç±ã§éä¿¡ããããã®ãšéåžžã«äŒŒãŠããŸããããããã«å€æŽãããŠããã ãã§ãã
åãã¹ããŒã ã¯ã¬ããªã±ãŒã·ã§ã³ã ãã§ãªãã ããã¯ã¢ãããäœæããã«ã¯ã ãã€ããªãã°ã«æžã蟌ãæžã蟌ã¿ãã¹ã¿ãŒãšãããšã³ãžã³ããããŸãã 管çè ãã»ããã¢ããããä»ã®å Žæã§ã¯ããã®ãã€ããªãã°ãã³ããŒãããããã ãã§ããã¯ã¢ãããäœæãããŸãã
å¿
èŠã«å¿ã㊠ãªãŒãã£ã³ã°ã¬ããªã«CPU ã®èªã¿åãè² è·ã軜æžããããã«ãèªã¿åããšã³ãžã³ãèµ·åãããã ãã§ããã€ããªã®æ«å°Ÿãèªã¿åãããããã®ã³ãã³ããããŒã«ã«ã§å®è¡ããŸãã
ããã§ã®é ãã¯éåžžã«å°ãããã¬ããªã«ããã¹ã¿ãŒããã©ãã ãé ããŠããããç¥ãããšãã§ããŸãã
RPC ãããã·ã§ã®ããŒã¿ ã·ã£ãŒãã£ã³ã°
ã·ã£ãŒãã£ã³ã°ã¯ã©ã®ããã«æ©èœããŸãã? ãããã·ã¯ã©ã®ã¯ã©ã¹ã¿ãŒ ã·ã£ãŒãã«éä¿¡ããããã©ã®ããã«ç解ããã®ã§ãããã? ã³ãŒãã«ã¯ã15 åã®ã·ã£ãŒããéã£ãŠãã ãã!ããšã¯æžãããŠããŸããã - ããããããã¯ãããã·ã«ãã£ãŠè¡ãããŸãã
æãåçŽãªã¹ããŒã 㯠firstint ã§ã â ãªã¯ãšã¹ãã®æåã®çªå·ã
get(photo100_500) => 100 % N.
ããã¯åçŽãª memcached ããã¹ã ãããã³ã«ã®äŸã§ããããã¡ãããã¯ãšãªã¯è€éã§æ§é åãããå¯èœæ§ããããŸãã ãã®äŸã§ã¯ãã¯ãšãªã®æåã®æ°å€ãååŸããã¯ã©ã¹ã¿ãŒ ãµã€ãºã§å²ã£ãæ®ããååŸããŸãã
ããã¯ãåäžãšã³ãã£ãã£ã®ããŒã¿å±ææ§ãå¿ èŠãªå Žåã«äŸ¿å©ã§ãã 100 ããŠãŒã¶ãŒãŸãã¯ã°ã«ãŒã ID ã§ãè€éãªã¯ãšãªã®ããã« XNUMX ã€ã®ãšã³ãã£ãã£ã®ãã¹ãŠã®ããŒã¿ã XNUMX ã€ã®ã·ã£ãŒãäžã«çœ®ããããšããŸãã
ãªã¯ãšã¹ããã¯ã©ã¹ã¿ãŒå šäœã«ã©ã®ããã«åæ£ãããããæ°ã«ããªãå Žåã¯ãå¥ã®ãªãã·ã§ã³ããããŸãã ã·ã£ãŒãå šäœãããã·ã¥ãã.
hash(photo100_500) => 3539886280 % N
ããã·ã¥ãé€ç®ã®äœããã·ã£ãŒãçªå·ãååŸããŸãã
ãããã®ãªãã·ã§ã³ã¯äž¡æ¹ãšããã¯ã©ã¹ã¿ãŒã®ãµã€ãºãå¢ãããšãã«åå²ããããè€æ°åã«ãããšããäºå®ãèŠæããŠããå Žåã«ã®ã¿æ©èœããŸãã ããšãã°ã16 åã®ã·ã£ãŒãããããŸããããååã§ã¯ãªãã®ã§ããã£ãšæ¬²ããå Žåã¯ãããŠã³ã¿ã€ã ãªãã§å®å šã« 32 åãååŸã§ããŸãã åæ°ã§ã¯ãªãå¢ããããå Žåã¯ãæ倱ãªããã¹ãŠãæ£ç¢ºã«åå²ããããšãã§ããªããããããŠã³ã¿ã€ã ãçºçããŸãã ãããã®ãªãã·ã§ã³ã¯äŸ¿å©ã§ãããåžžã«åœ¹ç«ã€ããã§ã¯ãããŸããã
ä»»æã®æ°ã®ãµãŒããŒãè¿œå ãŸãã¯åé€ããå¿ èŠãããå Žåã¯ã次ã䜿çšããŸãã Ketama ã®ãããªãªã³ã°äžã®äžè²«ããããã·ã¥ã ãããåæã«ãããŒã¿ã®å±ææ§ãå®å šã«å€±ãããŸããåéšåãç¬èªã®å°ããªå¿çãè¿ãããã«ãªã¯ãšã¹ããã¯ã©ã¹ã¿ãŒã«ããŒãžãããã®å¿çããããã·ã«ããŒãžããå¿ èŠããããŸãã
è¶ å ·äœçãªèŠæããããŸãã 次ã®ããã«ãªããŸããRPC ãããã·ããªã¯ãšã¹ããåä¿¡ããã©ã®ã¯ã©ã¹ã¿ãŒã«ç§»åãããã決å®ããã·ã£ãŒãã決å®ããŸãã 次ã«ãæžã蟌ã¿ãã¹ã¿ãŒãååšããããã¯ã©ã¹ã¿ãŒã«ã¬ããªã«ããµããŒããããŠããå Žåã¯ããªã³ããã³ãã§ã¬ããªã«ã«éä¿¡ããŸãã ãããã·ãããããã¹ãŠãè¡ããŸãã
ãã°
ç§ãã¡ã¯ããã€ãã®æ¹æ³ã§ãã°ãæžã蟌ã¿ãŸãã æãæçœã§åçŽãªãã®ã¯ã ãã°ãmemcacheã«æžã蟌ã.
ring-buffer: prefix.idx = line
ããŒã®ãã¬ãã£ãã¯ã¹ãã€ãŸããã°ã®ååãè¡ãããããã®ãã°ã®ãµã€ãºãã€ãŸãè¡æ°ããããŸãã 0 ããè¡æ°ãã 1 ãåŒããå€ãŸã§ã®ä¹±æ°ãååŸããŸããmemcache ã®ããŒã¯ããã®ä¹±æ°ãšé£çµããããã¬ãã£ãã¯ã¹ã§ãã ãã°è¡ãšçŸåšã®æå»ãå€ã«ä¿åããŸãã
ãã°ã®èªã¿èŸŒã¿ãå¿ èŠãªå Žåã«å®æœããŸãã ãã«ãã²ãã ãã¹ãŠã®ããŒãæéé ã«äžŠã¹æ¿ããŠããªã¢ã«ã¿ã€ã ã§éçšãã°ãååŸããŸãã ãã®ã¹ããŒã ã¯ãå®çšŒåç°å¢ã§äœãããªã¢ã«ã¿ã€ã ã§ãäœãå£ãããä»ã®ãã·ã³ãžã®ãã©ãã£ãã¯ãåæ¢ãããèš±å¯ãããããããšãªããããã°ããå¿ èŠãããå Žåã«äœ¿çšãããŸããããã®ãã°ã¯é·ãä¿åãããŸããã
ãã°ã確å®ã«ä¿ç®¡ããããã®ãšã³ãžã³ããããŸã ãã°ãšã³ãžã³ã ããããŸãã«ãããäœæãããèšå€§ãªæ°ã®ã¯ã©ã¹ã¿ãŒã§åºã䜿çšãããŠããçç±ã§ãã ç§ãç¥ã£ãŠããæ倧ã®ã¯ã©ã¹ã¿ãŒã«ã¯ã600 TB ã®å§çž®ããããã°ãä¿åãããŠããŸãã
ãšã³ãžã³ã¯éåžžã«å€ãããã§ã« 6 ïœ 7 幎åã®ã¯ã©ã¹ã¿ãŒããããŸãã ããã«ã¯è§£æ±ºããããšããŠããåé¡ããããããšãã°ããã°ãä¿åããããã« ClickHouse ãç©æ¥µçã«äœ¿çšãå§ããŸããã
ClickHouse ã§ã®ãã°ã®åé
ãã®å³ã¯ãç§ãã¡ãã©ã®ããã«ãšã³ãžã³ã«å ¥ãã®ãã瀺ããŠããŸãã
RPC ãä»ããŠããŒã«ã«ã§ RPC ãããã·ã«éä¿¡ãããã³ãŒããããããšã³ãžã³ã®ã©ãã«éä¿¡ããããèªèããŸãã ClickHouse ã«ãã°ãæžã蟌ã¿ããå Žåã¯ããã®ã¹ããŒã ã® XNUMX ã€ã®éšåãå€æŽããå¿
èŠããããŸãã
- äžéšã®ãšã³ãžã³ã ClickHouse ã«çœ®ãæããŸãã
- ClickHouse ã«ã¢ã¯ã»ã¹ã§ããªã RPC ãããã·ããRPC çµç±ã§ã¢ã¯ã»ã¹ã§ãããœãªã¥ãŒã·ã§ã³ã«çœ®ãæããŸãã
ãšã³ãžã³ã¯ã·ã³ãã«ã§ããClickHouse ã䜿çšããŠãµãŒããŒãŸãã¯ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒã«çœ®ãæããŸãã
ãããŠãClickHouseã«è¡ãããã«ãç§ãã¡ã¯ããããŸãã åç«ããŠã¹ã KittenHouse ãã ClickHouse ã«çŽæ¥ç§»åãããšã察å¿ã§ããŸããã ãªã¯ãšã¹ãããªããŠããèšå€§ãªæ°ã®ãã·ã³ã® HTTP æ¥ç¶ãå ç®ãããŸãã ã¹ããŒã ãæ©èœããã«ã¯ãClickHouse ãåãããµãŒããŒäžã§ ããŒã«ã« ãªããŒã¹ ãããã·ãèµ·åããããå¿ èŠãªæ¥ç¶éã«èããããããã«æžãããŠããŸãã ãŸããæ¯èŒç確å®ã«ããŒã¿ãå éšã«ãããã¡ãªã³ã°ããããšãã§ããŸãã
å Žåã«ãã£ãŠã¯ãnginx ãªã©ã®éæšæºãœãªã¥ãŒã·ã§ã³ã« RPC ã¹ããŒã ãå®è£
ããããªãå ŽåããããŸãã ãããã£ãŠãKittenHouse ã«ã¯ UDP çµç±ã§ãã°ãåä¿¡ããæ©èœããããŸãã
ãã°ã®éä¿¡è
ãšåä¿¡è
ãåããã·ã³äžã§äœæ¥ããŠããå ŽåãããŒã«ã« ãã¹ãå
㧠UDP ãã±ããã倱ãããå¯èœæ§ã¯éåžžã«äœããªããŸãã ãµãŒãããŒã㣠ãœãªã¥ãŒã·ã§ã³ã§ RPC ãå®è£
ããå¿
èŠæ§ãšä¿¡é Œæ§ã®éã®åŠ¥åçãšããŠãåçŽã« UDP éä¿¡ã䜿çšããŸãã ãã®èšç»ã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
ç£èŠ
ãã°ã«ã¯ XNUMX çš®é¡ãããŸãã管çè ããµãŒããŒäžã§åéãããã°ãšãéçºè ãã³ãŒãããæžã蟌ãã ãã°ã§ãã ãããã¯ã次㮠XNUMX çš®é¡ã®ã¡ããªã¯ã¹ã«å¯Ÿå¿ããŸãã ã·ã¹ãã ãšè£œå.
ã·ã¹ãã ã¡ããªã¯ã¹
ãã¹ãŠã®ãµãŒããŒã§åäœããŸã
補åã®ææš
䟿å®äžããããããªããšãæžããŸããã ããšãã°ãCounts ã UniqueCounts ã®å€ãçµ±èšã«æžã蟌ãã§ãã©ããã«éä¿¡ã§ããäžé£ã®éåžžã®é¢æ°ããããŸãã
statlogsCountEvent ( âstat_nameâ, $key1, $key2, âŠ)
statlogsUniqueCount ( âstat_nameâ, $uid, $key1, $key2, âŠ)
statlogsValuetEvent ( âstat_nameâ, $value, $key1, $key2, âŠ)
$stats = statlogsStatData($params)
ãã®åŸã䞊ã¹æ¿ããã£ã«ã¿ãŒãšã°ã«ãŒãåãã£ã«ã¿ãŒã䜿çšããŠãã°ã©ãã®æ§ç¯ããŠã©ããããã°ã®æ§æãªã©ãçµ±èšããå¿ èŠãªããšããã¹ãŠå®è¡ã§ããããã«ãªããŸãã
ãšãŠãæžããŸã å€ãã®ææš ã€ãã³ãã®æ°ã¯ 600 æ¥ããã 1 åãã XNUMX å ã§ãã ããããç§ãã¡ã¯ããããä¿æããããšèããŠããŸã å°ãªããšãæ°å¹Žã¯ææšã®åŸåãç解ããããã ãããããã¹ãŠãŸãšããã®ã¯å€§ããªåé¡ã§ããããŸã 解決ãããŠããŸããã ããæ°å¹Žã®ææãã話ããŸãã
ãããã®ã¡ããªã¯ã¹ãæžã蟌ãé¢æ°ããããŸã ããŒã«ã«ã®ã¡ã¢ãªãã£ãã·ã¥ãžãšã³ããªãŒæ°ãæžããããã çæéã«ããŒã«ã«ã§èµ·åããã çµ±èšããŒã¢ã³ ãã¹ãŠã®èšé²ãåéããŸãã 次ã«ãããŒã¢ã³ã¯ã¡ããªã¯ã¹ã XNUMX ã€ã®ãµãŒããŒå±€ã«ããŒãžããŸãã ãã°ã³ã¬ã¯ã¿ãŒãèåŸã®å±€ãæ»ãªãªãããã«ãå€æ°ã®ãã·ã³ããã®çµ±èšãéçŽããŸãã
å¿
èŠã«å¿ããŠããã°ã³ã¬ã¯ã¿ãŒã«çŽæ¥æžã蟌ãããšãã§ããŸãã
ãã ããstas-daemom ããã€ãã¹ããŠã³ãŒãããã³ã¬ã¯ã¿ãŒã«çŽæ¥æžã蟌ãããšã¯ãã³ã¬ã¯ã¿ãŒã®è² è·ãå¢å ãããããã¹ã±ãŒã©ããªãã£ã«ä¹ãããœãªã¥ãŒã·ã§ã³ã§ãã ãã®è§£æ±ºçã¯ãäœããã®çç±ã§ãã·ã³äžã§ memcache stats-daemon ãèµ·åã§ããªãå ŽåããŸãã¯ã¯ã©ãã·ã¥ããŠçŽæ¥å®è¡ããå Žåã«ã®ã¿é©ããŠããŸãã
次ã«ããã°ã³ã¬ã¯ã¿ãŒãçµ±èšãããŒãžããŸãã ãã£ãŒDB - ããã¯ç§ãã¡ã®ããŒã¿ããŒã¹ã§ãããã¡ããªã¯ã¹ãä¿åã§ããŸãã
次ã«ãã³ãŒããããã€ããªã®ãSQL ã«è¿ããéžæãè¡ãããšãã§ããŸãã
å®éš
2018 幎ã®å€ã«ç€Ÿå ããã«ãœã³ãéå¬ããå³ã®èµ€ãéšåã ClickHouse ã®ã¡ããªã¯ã¹ãä¿åã§ãããã®ã«çœ®ãæããŠã¿ããšããã¢ã€ãã¢ãçãŸããŸããã ClickHouse ã«ãã°ããããŸã - è©ŠããŠã¿ãŠã¯ãããã§ãããã?
KittenHouse ãéããŠãã°ãæžã蟌ãã¹ããŒã ããããŸããã
æã
ã¯æ±ºããŸãã å¥ã®ã*Houseããå³ã«è¿œå ããŸãããã¯ãã³ãŒãã UDP çµç±ã§ã¡ããªã¯ã¹ãæžã蟌ããšãã®åœ¢åŒã§ã¡ããªã¯ã¹ãæ£ç¢ºã«åãåããŸãã 次ã«ããã® *House ã¯ãããã䞞倪ã®ãããªã€ã³ãµãŒãã«å€æããKittenHouse ã¯ãããç解ããŸãã 圌ã¯ãããã®ãã°ã ClickHouse ã«å®å
šã«éä¿¡ã§ããClickHouse ã¯ããããèªã¿åãããšãã§ããã¯ãã§ãã
memcacheãstats-daemonãlogs-collectors ããŒã¿ããŒã¹ã䜿çšããã¹ããŒã ã¯ãããã«çœ®ãæããããŸãã
memcacheãstats-daemonãlogs-collectors ããŒã¿ããŒã¹ã䜿çšããã¹ããŒã ã¯ãããã«çœ®ãæããããŸãã
- ããã«ã¯ãStatsHouse ã§ããŒã«ã«ã«æžãããã³ãŒãããã®ãã£ã¹ãããããããŸãã
- StatsHouse ã¯ããã§ã« SQL æ¿å ¥ã«å€æãããŠãã UDP ã¡ããªã¯ã¹ãããã㧠KittenHouse ã«æžã蟌ã¿ãŸãã
- KittenHouse ã¯ãããã ClickHouse ã«éããŸãã
- ããããèªã¿åãããå Žåã¯ãStatsHouse ããã€ãã¹ããŠãéåžžã® SQL ã䜿çšã㊠ClickHouse ããçŽæ¥èªã¿åããŸãã
ãŸã ã§ãã å®éšãããããçµæã¯æ°ã«å ¥ã£ãŠããŸãã ãã®å¶åºŠã®åé¡ç¹ã解決ããã°ãããããå®å šã«åãæ¿ããããšã«ãªãã§ãããã å人çã«ã¯ããé¡ã£ãŠããŸãã
ã¹ããŒã éåãç¯çŽããªãã å¿ èŠãªãµãŒããŒã¯å°ãªããŠæžã¿ãããŒã«ã«ã®çµ±èšããŒã¢ã³ããã°ã³ã¬ã¯ã¿ãŒã¯å¿ èŠãããŸããããClickHouse ã«ã¯çŸåšã®ã¹ããŒã ããã倧ããªãµãŒããŒãå¿ èŠã§ãã å¿ èŠãªãµãŒããŒã®æ°ã¯å°ãªããªããŸãããããé«äŸ¡ã§ãã匷åãªãã®ã§ãªããã°ãªããŸãã.
å±éãã
ãŸããPHP ã®ãããã€ã¡ã³ããèŠãŠã¿ãŸãããã ç§ãã¡ã¯ã§éçºããŠããŸã gitïŒ äœ¿çš GitLab О TeamCity å±éçšã«ã éçºãã©ã³ãã¯ãã¹ã¿ãŒ ãã©ã³ãã«ããŒãžããããã¹ãçšã®ãã¹ã¿ãŒããã¹ããŒãžã³ã°ã«ããŒãžãããã¹ããŒãžã³ã°ããå®çšŒåã«ããŒãžãããŸãã
ãããã€ã¡ã³ãã®åã«ãçŸåšã®éçšãã©ã³ããšä»¥åã®éçšãã©ã³ããååŸããããããã®å·®åãã¡ã€ã«ã®å€æŽ (äœæãåé€ãå€æŽ) ãèæ ®ãããŸãã ãã®å€æŽã¯ç¹å¥ãªã³ããŒãã¡ã¹ã ãšã³ãžã³ã®ãã€ããªãã°ã«èšé²ããããµãŒã㌠ããªãŒãå šäœã«å€æŽãè¿ éã«è€è£œã§ããŸãã ããã§äœ¿çšããŠããã®ã¯çŽæ¥ã³ããŒããããã§ã¯ãããŸãããã ãŽã·ããã®ã¬ããªã±ãŒã·ã§ã³XNUMX ã€ã®ãµãŒããŒãå€æŽãæãè¿ããµãŒããŒã«éä¿¡ãããšãããã®ãµãŒããŒã®å€æŽããã®ãµãŒããŒã®è¿é£ã«éä¿¡ãããšããªã©ã§ãã ããã«ãããããªãŒãå šäœã§ã³ãŒããæ°åç§åäœã§æŽæ°ã§ããããã«ãªããŸãã å€æŽãããŒã«ã« ã¬ããªã«ã«å°éãããšããããã®ããããããŒã«ã« ã¬ããªã«ã«é©çšãããŸãã ããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ã ããŒã«ããã¯ãåãã¹ããŒã ã«åŸã£ãŠå®è¡ãããŸãã
ç§ãã¡ã¯ kPHP ãé »ç¹ã«å°å ¥ããŠãããç¬èªã®éçºãè¡ã£ãŠããŸãã git äžã®å³ã«ãããšã ãããã HTTPãµãŒããŒãã€ããªå Žåãå·®åãçæã§ããŸããããªãªãŒã¹ ãã€ããªã®éãã¯æ°çŸ MB ã§ãã ãããã£ãŠãããã«ã¯å¥ã®ãªãã·ã§ã³ããããŸã - ããŒãžã§ã³ã¯æ¬¡ã®ããã«æžã蟌ãŸããŸã ãã³ãã°ã³ããŒãã¡ã¹ãã ãã«ããããã³ã«å¢å ããããŒã«ããã¯äžã«ãå¢å ããŸãã ããŒãžã§ã³ ãµãŒããŒã«è€è£œãããã ããŒã«ã«ã®ã³ããŒãã¡ã¹ãã¯ãæ°ããããŒãžã§ã³ããã€ããªãã°ã«å ¥ã£ãããšã確èªããåããŽã·ããã¬ããªã±ãŒã·ã§ã³ã«ãã£ãŠããã¹ã¿ãŒãµãŒããŒãç²ããããããšãªãããããã¯ãŒã¯å šäœã«è² è·ãæ éã«åæ£ããªããããã€ããªã®ææ°ããŒãžã§ã³ãèªåãã¡ã§ååŸããŸãã 次ã«ç¶ãããš åªé ãªåèµ·å æ°ããããŒãžã§ã³çšã
ç§ãã¡ã®ãšã³ãžã³ãæ¬è³ªçã«ãã€ããªã§ãããã¹ããŒã ã¯éåžžã«äŒŒãŠããŸãã
- gitãã¹ã¿ãŒãã©ã³ã;
- ãã€ããªå ¥å debãã¡ã€ã«;
- ããŒãžã§ã³ã¯ binlog copyfast ã«æžã蟌ãŸããŸãã
- ãµãŒããŒã«ã¬ããªã±ãŒããããŸãã
- ãµãŒããŒã¯æ°ãã .dep ãåãåºããŸãã
- dpkg-i;
- æ°ããããŒãžã§ã³ãžã®æ£åžžãªåèµ·åã
éãã¯ããã€ããªãã¢ãŒã«ã€ãã«ããã±ãŒãžåãããŠããããšã§ãã debãã¡ã€ã«ãããŠãããããæ±²ã¿åºããšãã dpkg-i ã·ã¹ãã äžã«é 眮ãããŸãã kPHP ã¯ãã€ããªãšããŠãããã€ããããšã³ãžã³ã¯ dpkg ãšããŠãããã€ãããã®ã¯ãªãã§ãã? ããã¯ãã®ããã«èµ·ãããŸããã åäœããŸãã®ã§ã觊ããªãã§ãã ããã
䟿å©ãªãªã³ã¯ïŒ
- ã¢ã³ãã³ã»ããªã·ã¥ãã³ã«ããã¬ããŒã
ããã³ã³ã¿ã¯ãã®ã·ã¹ãã 管çè ã§ãã ã©ããã£ãŠïŒ" ã³ããŒãã¡ã¹ããšãŽã·ããã«ã€ããŠè©³ãã説æããŸãã - ãŠãŒãªã»ãã¹ã¬ãã£ããã«ããã¬ããŒã
ãVK ãæ°äžå°ã®ãµãŒããŒããããŒã¿ã CLIckHouse ã«æ¿å ¥ããæ¹æ³ã . - ç§ã®å ±åæž
ãVKontakte ã®äŸã䜿çšããæé·ãããžã§ã¯ãã®ã¢ãŒããã¯ãã£ã ããã ãããŒããŠã§ã¢ã§ã¯ãªãéçºã®èŠ³ç¹ããã§ãã
Alexey Akulovich ã¯ãããã°ã©ã å§å¡äŒã®äžå¡ãšããŠã
PHP ãã·ã¢ 17 æ XNUMX æ¥ã«éå¬ããããã®ã€ãã³ãã¯ãPHP éçºè ã«ãšã£ãŠã¯è¿å¹Žæ倧ã®ã€ãã³ããšãªãã§ãããã èŠãŠãã ãããç§ãã¡ãæã£ãŠããçŽ æŽããã PC ã¯äœã§ããïŒã¹ããŒã«ãŒ (ãã®ãã¡ã® XNUMX 人㯠PHP ã³ã¢ãéçºããŠããŸã!) - PHP ãæžããªãæ¬ ãããªããã®ã®ããã§ãã
åºæïŒ habr.com