2017幎ãç§ãã¡ã¯Alfa-Bankã®æè³ããžãã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ã³ã¢ãéçºããã³ã³ãã§åªåããåãçµã¿ãéå§ããŸããïŒHighLoad++ 2018ã§æè³ããžãã¹ã®ã³ã¢ã«é¢ããã¬ããŒããçºè¡šããŸããïŒ
éçºããã»ã¹äžãã·ã¹ãã ã¯é²åããŠæ©èœãç²åŸããããæç¹ã§ãå³å¯ã«å®çŸ©ãããç¯å²ã®ã¿ã¹ã¯ã解決ããããã«äœæãããåãªãã¢ããªã±ãŒã·ã§ã³ ãœãããŠã§ã¢ä»¥äžã®ãã®ãçµæ¶åããŠããããšã«æ°ã¥ããŸããã æ°žç¶ã¹ãã¬ãŒãžã䜿çšããŠåæ£ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ã·ã¹ãã ã ç§ãã¡ãåŸãçµéšãæ°è£œåã®åºç€ãšãªããŸãã -
TDG ã¢ãŒããã¯ãã£ãšéçºããã»ã¹äžã«ãã©ãçãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠã話ããäž»ãªæ©èœã玹ä»ããåœç€Ÿã®è£œåãå®å
šãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããããã®åºç€ãšãªãæ¹æ³ã瀺ããããšæããŸãã
ã¢ãŒããã¯ãã£çã«ã¯ãã·ã¹ãã ãåå¥ã«åå²ããŸããã 圹å²ããããããäžå®ç¯å²ã®åé¡ã解決ãã責任ãè² ããŸãã å®è¡äžã®åäžã®ã¢ããªã±ãŒã·ã§ã³ ã€ã³ã¹ã¿ã³ã¹ã¯ XNUMX ã€ä»¥äžã®ããŒã« ã¿ã€ããå®è£
ããŸãã ã¯ã©ã¹ã¿ãŒå
ã«ã¯åãã¿ã€ãã®ããŒã«ãè€æ°ååšããå ŽåããããŸãã
ãã³ãžã§ã€ã³ã
ã³ãã¯ã¿ã¯å€éšãšã®éä¿¡ãæ åœããŸãã ãã®ã¿ã¹ã¯ã¯ããªã¯ãšã¹ããåãå ¥ããŠè§£æãããããæåããå Žåã¯ãåŠçããããŒã¿ãå ¥åããã»ããµã«éä¿¡ããããšã§ãã HTTPãSOAPãKafkaãFIX 圢åŒããµããŒãããŸãã ãã®ã¢ãŒããã¯ãã£ãŒã§ã¯ãæ°ãã圢åŒã®ãµããŒããè¿œå ããã ãã§æžã¿ãIBM MQ ã®ãµããŒããè¿æ¥äžã«éå§ãããŸãã ãªã¯ãšã¹ãã®è§£æã倱æããå Žåãã³ãã¯ã¿ã¯ãšã©ãŒãè¿ããŸãã ãã以å€ã®å Žåã¯ããã®åŸã®åŠçäžã«ãšã©ãŒãçºçããå Žåã§ãããªã¯ãšã¹ããæ£åžžã«åŠçããããšå¿çããŸãã ããã¯ããªã¯ãšã¹ããç¹°ãè¿ãæ¹æ³ãããããªãã·ã¹ãã ããŸãã¯éã«ãªã¯ãšã¹ããããŸãã«ããã€ããç¹°ãè¿ãã·ã¹ãã ã§åäœããããã«ç¹å¥ã«è¡ãããŸããã ããŒã¿ã倱ããªãããã«ããããã«ã修埩ãã¥ãŒã䜿çšãããŸãããªããžã§ã¯ãã¯æåã«ä¿®åŸ©ãã¥ãŒã«å ¥ããæ£åžžãªåŠçã修埩ãã¥ãŒããåé€ãããåŸã«ã®ã¿ä¿®åŸ©ãã¥ãŒã«å ¥ããŸãã 管çè ã¯ã修埩ãã¥ãŒã«æ®ã£ãŠãããªããžã§ã¯ãã«é¢ããã¢ã©ãŒããåä¿¡ãããœãããŠã§ã¢ ãšã©ãŒãŸãã¯ããŒããŠã§ã¢é害ãåãé€ããåŸãåè©Šè¡ã§ããŸãã
å ¥åããã»ããµ
å ¥åããã»ããµã¯ãåä¿¡ããããŒã¿ãç¹åŸŽã«åŸã£ãŠåé¡ããé©åãªããã»ããµãåŒã³åºããŸãã ãã³ãã©ãŒã¯ãµã³ãããã¯ã¹å ã§å®è¡ããã Lua ã³ãŒãã§ãããããã·ã¹ãã ã®æ©èœã«åœ±é¿ãäžããããšã¯ã§ããŸããã ãã®æ®µéã§ã¯ãããŒã¿ãå¿ èŠãªåœ¢åŒã«çž®å°ããå¿ èŠã«å¿ããŠãå¿ èŠãªããžãã¯ãå®è£ ã§ããä»»æã®æ°ã®ã¿ã¹ã¯ãèµ·åã§ããŸãã ããšãã°ãTarantool Data Grid äžã«æ§ç¯ããã MDM (ãã¹ã¿ãŒ ããŒã¿ç®¡ç) 補åã§ã¯ãæ°ãããŠãŒã¶ãŒãè¿œå ãããšãã«ããªã¯ãšã¹ãã®åŠçãé ããªããªãããã«ãå¥ã®ã¿ã¹ã¯ãšããŠãŽãŒã«ãã³ ã¬ã³ãŒãã®äœæãéå§ããŸãã ãµã³ãããã¯ã¹ã¯ãããŒã¿ã®èªã¿åããå€æŽãè¿œå ã®ãªã¯ãšã¹ãããµããŒãããã¹ãã¬ãŒãž ã¿ã€ãã®ãã¹ãŠã®ããŒã«ãšçµæã®éèš (ããã/ãªãã¥ãŒã¹) ã«å¯ŸããŠäœããã®æ©èœãå®è¡ã§ããããã«ããŸãã
ãã³ãã©ãŒã¯æ¬¡ã®ãã¡ã€ã«ã«èšè¿°ã§ããŸãã
sum.lua
local x, y = unpack(...)
return x + y
ãããŠãèšå®ã§æ¬¡ã®ããã«å®£èšããŸãã
functions:
sum: { __file: sum.lua }
ãªãã«ã¢ãªã®ãïŒ Lua ã¯éåžžã«ã·ã³ãã«ãªèšèªã§ãã ç§ãã¡ã®çµéšã«ãããšã人ã ã¯ãããç解ããŠããæ°æéåŸã«ãåé¡ã解決ããã³ãŒããæžãå§ããŸãã ãããŠããããã¯ããã®éçºè ã ãã§ãªããããšãã°ã¢ããªã¹ããå«ãŸããŸãã ããã«ãjit ã³ã³ãã€ã©ãŒã®ãããã§ãLua ã¯éåžžã«é«éã«å®è¡ãããŸãã
Storage
ã¹ãã¬ãŒãžã«ã¯æ°žç¶çãªããŒã¿ãä¿åãããŸãã ä¿åããåã«ãããŒã¿ã¯ããŒã¿ ã¹ããŒãã«å¯ŸããŠæ€èšŒãããŸãã åè·¯ãèšè¿°ããããã«æ¡åŒµãã©ãŒãããã䜿çšããŸã
{
"name": "User",
"type": "record",
"logicalType": "Aggregate",
"fields": [
{ "name": "id", "type": "string"},
{"name": "first_name", "type": "string"},
{"name": "last_name", "type": "string"}
],
"indexes": ["id"]
}
ãã®èšè¿°ã«åºã¥ããŠãTarantula DBMS çšã® DDL (ããŒã¿å®çŸ©èšèª) ãèªåçæããã
éåæããŒã¿ ã¬ããªã±ãŒã·ã§ã³ããµããŒããããŠããŸã (åæãè¿œå ããäºå®ã§ã)ã
åºåããã»ããµ
å Žåã«ãã£ãŠã¯ãå€éšã³ã³ã·ã¥ãŒãã«æ°ããããŒã¿ã®å°çãéç¥ããå¿ èŠãããå ŽåããããŸãããã®ç®çã®ããã«ãåºåããã»ããµã®åœ¹å²ããããŸãã ããŒã¿ãä¿åããåŸãããŒã¿ãé©åãªãã³ãã©ãŒ (ããšãã°ãã³ã³ã·ã¥ãŒããŒãå¿ èŠãšãããã©ãŒã ã«ç§»åãããã) ã«æž¡ããéä¿¡ã®ããã«ã³ãã¯ã¿ã«æž¡ãããšãã§ããŸãã ããã§ã¯ä¿®åŸ©ãã¥ãŒã䜿çšãããŸãã誰ããªããžã§ã¯ããåãå ¥ããªãã£ãå Žåã管çè ã¯åŸã§åè©Šè¡ã§ããŸãã
ã¹ã±ãŒãªã³ã°
ã³ãã¯ã¿ãå
¥åããã»ããµãããã³åºåããã»ããµã®åœ¹å²ã¯ã¹ããŒãã¬ã¹ã§ãããããç®çã®åœ¹å²ã¿ã€ããæå¹ã«ããŠæ°ããã¢ããªã±ãŒã·ã§ã³ ã€ã³ã¹ã¿ã³ã¹ãè¿œå ããã ãã§ãã·ã¹ãã ãæ°Žå¹³æ¹åã«æ¡åŒµã§ããŸãã ã¹ãã¬ãŒãžã¯æ°Žå¹³æ¹åã®ã¹ã±ãŒãªã³ã°ã«äœ¿çšãããŸã
ããŒã¿ã®ããããã£
ãªããžã§ã¯ãã¯éåžžã«å€§ãããªããä»ã®ãªããžã§ã¯ããå«ãŸããå ŽåããããŸãã ãã¹ãŠã®äŸåé¢ä¿ãæã€ãªããžã§ã¯ãã XNUMX ã€ã®ä»®æ³ãã±ããã«ä¿åããããšã§ãããŒã¿ã®è¿œå ãšæŽæ°ã®ã¢ãããã¯æ§ã確ä¿ããŸãã ããã«ããããªããžã§ã¯ããè€æ°ã®ç©çãµãŒããŒã«ãåæ£ãããã®ãé²ããŸãã
ããŒãžã§ã³ç®¡çããµããŒããããŠããŸãããªããžã§ã¯ããæŽæ°ããããã³ã«æ°ããããŒãžã§ã³ãäœæããããã€ã§ãã¿ã€ã ã¹ã©ã€ã¹ãååŸããŠãåœæã®äžçãã©ã®ããã«èŠããŠãããã確èªã§ããŸãã é·ãå±¥æŽãå¿ èŠãšããªãããŒã¿ã®å Žåã¯ãããŒãžã§ã³ã®æ°ãå¶éããããææ°ããŒãžã§ã³ã 1 ã€ã ãä¿åãããããããšãã§ããŸããã€ãŸããç¹å®ã®ã¿ã€ãã®ããŒãžã§ã³ç®¡çãåºæ¬çã«ç¡å¹ã«ããããšãã§ããŸãã æéã«ãã£ãŠå±¥æŽãå¶éããããšãã§ããŸããããšãã°ãXNUMX 幎ããå€ãç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ãããã¹ãŠåé€ããŸãã ã¢ãŒã«ã€ãããµããŒããããŠããŸããæå®ãããæéããå€ããªããžã§ã¯ããã¢ã³ããŒãããŠãã¯ã©ã¹ã¿ãŒå ã®ã¹ããŒã¹ã解æŸã§ããŸãã
ã¿ã¹ã¯
èå³æ·±ãæ©èœã®äžã§ããã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠããŠãŒã¶ãŒã®ãªã¯ãšã¹ãã«å¿ããŠããŸãã¯ãµã³ãããã¯ã¹ããããã°ã©ã çã«ã¿ã¹ã¯ãèµ·åã§ããæ©èœã¯æ³šç®ã«å€ããŸãã
ããã§ã¯ãå¥ã®åœ¹å²ã§ããã©ã³ããŒã衚瀺ãããŸãã ãã®ããŒã«ã¯ã¹ããŒãã¬ã¹ã§ãããå¿
èŠã«å¿ããŠããã®ããŒã«ãæã€è¿œå ã®ã¢ããªã±ãŒã·ã§ã³ ã€ã³ã¹ã¿ã³ã¹ãã¯ã©ã¹ã¿ãŒã«è¿œå ã§ããŸãã ã©ã³ããŒã®è²¬ä»»ã¯ã¿ã¹ã¯ãå®äºããããšã§ãã åè¿°ããããã«ããµã³ãããã¯ã¹ããæ°ããã¿ã¹ã¯ãçæããããšãã§ããŸãã ãããã¯ã¹ãã¬ãŒãžäžã®ãã¥ãŒã«ä¿åãããã©ã³ããŒäžã§å®è¡ãããŸãã ãã®ã¿ã€ãã®ã¿ã¹ã¯ã¯ãžã§ããšåŒã°ããŸãã Task ãšåŒã°ããã¿ã¹ã¯ ã¿ã€ãããããŸãããããã¯ãã¹ã±ãžã¥ãŒã« (cron æ§æã䜿çš) ãŸãã¯ãªã³ããã³ãã§å®è¡ããããŠãŒã¶ãŒå®çŸ©ã®ã¿ã¹ã¯ã§ãã ãã®ãããªã¿ã¹ã¯ãèµ·åããŠè¿œè·¡ããããã«ã䟿å©ãªã¿ã¹ã¯ ãããŒãžã£ãŒãçšæãããŠããŸãã ãã®æ©èœã䜿çšããã«ã¯ãã¹ã±ãžã¥ãŒã©ãŒã®åœ¹å²ãæå¹ã«ããå¿
èŠããããŸãã ãã®ããŒã«ã«ã¯ç¶æ
ããããããã¹ã±ãŒã«ããŸããããããã¯å¿
é ã§ã¯ãããŸããã åæã«ãä»ã®ãã¹ãŠã®ããŒã«ãšåæ§ã«ããã¹ã¿ãŒãçªç¶æåŠããå Žåã«åäœãéå§ããã¬ããªã«ãæã€ããšãã§ããŸãã
ãã¬ãŒ
ãã XNUMX ã€ã®åœ¹å²ã¯ãã¬ãŒãšåŒã°ããŸãã ã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã¡ã³ããŒãããã°ãåéããWeb ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã°ãã¢ããããŒãããã³è¡šç€ºããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
ãµãŒãã¹
ç¹çãã¹ãã¯ããã®ã·ã¹ãã ã«ãããµãŒãã¹ãç°¡åã«äœæã§ããããšã§ãã æ§æãã¡ã€ã«ã§ã¯ããµã³ãããã¯ã¹å ã§å®è¡ããããŠãŒã¶ãŒäœæã®ãã³ãã©ãŒã«ã©ã®ãªã¯ãšã¹ããéä¿¡ããããæå®ã§ããŸãã ãã®ãã³ãã©ãŒã§ã¯ãããšãã°ãããçš®ã®åæã¯ãšãªãå®è¡ããŠçµæãè¿ãããšãã§ããŸãã
ãµãŒãã¹ã¯æ§æãã¡ã€ã«ã«èšè¿°ãããŠããŸãã
services:
sum:
doc: "adds two numbers"
function: sum
return_type: int
args:
x: int
y: int
GraphQL API ãèªåçã«çæããããµãŒãã¹ãåŒã³åºãããšãã§ããããã«ãªããŸãã
query {
sum(x: 1, y: 2)
}
ããã«ãããã³ãã©ãŒãåŒã³åºãããŸã sum
ããã¯çµæãè¿ããŸã:
3
ã¯ãšãªãããã¡ã€ãªã³ã°ãšã¡ããªã¯ã¹
ã·ã¹ãã ã®åäœãšãªã¯ãšã¹ãã®ãããã¡ã€ãªã³ã°ãç解ããããã«ãOpenTracing ãããã³ã«ã®ãµããŒããå®è£ ããŸããã ã·ã¹ãã ã¯ãZipkin ãªã©ã®ãã®ãããã³ã«ããµããŒãããããŒã«ã«ãªã³ããã³ãã§æ å ±ãéä¿¡ã§ããŸããããã«ããããªã¯ãšã¹ããã©ã®ããã«å®è¡ãããããç解ã§ããããã«ãªããŸãã
åœç¶ã®ããšãªããããã®ã·ã¹ãã ã¯ãPrometheus ã䜿çšããŠåéããGrafana ã䜿çšããŠèŠèŠåã§ããå
éšã¡ããªãã¯ãæäŸããŸãã
å±éãã
Tarantool Data Grid ã¯ããã£ã¹ããªãã¥ãŒã·ã§ã³ãŸã㯠Ansible ã®ãŠãŒãã£ãªãã£ã䜿çšããŠãRPM ããã±ãŒãžãŸãã¯ã¢ãŒã«ã€ããããããã€ã§ããŸããKubernetes ã®ãµããŒãããããŸã (
ããžãã¹ ããžã㯠(æ§æããã³ãã©ãŒ) ãå®è£ ããã¢ããªã±ãŒã·ã§ã³ã¯ãUI ãä»ããŠã¢ãŒã«ã€ãã®åœ¢åŒã§ããŸãã¯åœç€ŸãæäŸãã API ãä»ããŠã¹ã¯ãªããã䜿çšããŠããããã€ããã Tarantool Data Grid ã¯ã©ã¹ã¿ãŒã«ããŒããããŸãã
å²åŠã®å ¥éæž
Tarantool Data Grid ã䜿çšããŠã©ã®ãããªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã? å®éãã»ãšãã©ã®ããžãã¹ ã¿ã¹ã¯ã¯ãããŒã¿ ãããŒã®åŠçãä¿åãã¢ã¯ã»ã¹ã«äœããã®åœ¢ã§é¢é£ããŠããŸãã ãããã£ãŠãå®å šã«ä¿åããŠã¢ã¯ã»ã¹ããå¿ èŠããã倧éã®ããŒã¿ ã¹ããªãŒã ãããå Žåãåœç€Ÿã®è£œåã䜿çšãããšéçºæéãå€§å¹ ã«ç¯çŽããããžãã¹ ããžãã¯ã«éäžã§ããŸãã
ããšãã°ãäžåç£åžå Žã«é¢ããæ å ±ãåéããŠãå°æ¥çã«ã¯æè¯ã®ãªãã¡ãŒã«é¢ããæ å ±ãåŸãããšãã§ããããã«ããããšèããŠããŸãã ãã®å Žåã次ã®ã¿ã¹ã¯ã«çŠç¹ãåœãŠãŸãã
- ãªãŒãã³ãœãŒã¹ããæ å ±ãåéãããããããããŒã¿ãœãŒã¹ã«ãªããŸãã ãã®åé¡ã¯ãæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããä»»æã®èšèªã§ã³ãŒããäœæããããšã§è§£æ±ºã§ããŸãã
- 次ã«ãTarantool Data Grid ãããŒã¿ãåãå ¥ããŠä¿åããŸãã ç°ãªããœãŒã¹ããã®ããŒã¿åœ¢åŒãç°ãªãå Žåã¯ãåäžåœ¢åŒãžã®å€æãå®è¡ããã³ãŒãã Lua ã§äœæã§ããŸãã ååŠç段éã§ã¯ãããšãã°ãéè€ãããªãã¡ãŒããã£ã«ã¿ãªã³ã°ããããããŒã¿ããŒã¹å ã®åžå Žã§åããŠãããšãŒãžã§ã³ãã«é¢ããæ å ±ãè¿œå æŽæ°ãããããããšãã§ããŸãã
- ããã§ãã¯ã©ã¹ã¿ãŒå ã«ããŒã¿ãå ¥åããŠããŒã¿ãéžæã§ããã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ããã§ã«å®æããŸããã ãã®åŸãæ°ããæ©èœãå®è£ ã§ããŸããããšãã°ãããŒã¿ããªã¯ãšã¹ãã㊠XNUMX æ¥ãããæãæå©ãªãªãã¡ãŒãæäŸãããµãŒãã¹ãäœæããŸããããã«ã¯ãæ§æãã¡ã€ã«ã«æ°è¡ãšå°ãã® Lua ã³ãŒããå¿ èŠã§ãã
次ã¯äœã§ããïŒ
ç§ãã¡ã®åªå
äºé
ã¯ã
å®å
šæ§ã«ã现å¿ã®æ³šæãæã£ãŠãããŸãã çŸåšãå人ããŒã¿æ
å ±ã·ã¹ãã ãæ¿åºæ
å ±ã·ã¹ãã ã§äœ¿çšããããœãããŠã§ã¢è£œåã®èªèšŒèŠä»¶ãæºãããããé«ãã»ãã¥ãªãã£ã¬ãã«ã確èªããããããã·ã¢ã®FSTECã«ããèªèšŒãåããŠããŸãã
åºæïŒ habr.com