
ããã«ã¡ã¯ãHabrïŒ æ¬æ¥ã2017幎3æ2æ¥ã«Mail.Ru Groupã§éå¬ãããTarantool Meetupã§çºè¡šãããã¬ããŒãã®ããã¹ãçãå
±æããããšæããŸãã誰ãããã©ãŒãã³ã¹ãèŠãŸãããã ç§ã¯ããªã³ã©ã€ã³èª¿æ»ãµãŒãã¹ãéçºããeVoteã§åããŠããŸãã 補åã§Windowsããã³.NETãã¯ãããžãç©æ¥µçã«äœ¿çšããŠããŸãããã®æçš¿ã§ã¯ãTarantool DBMSããã¯ãããžã¹ã¿ãã¯ã«è¿œå ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã®èšäºã®å·çã«ååããŠãããMail.Ru Groupã®ååãå人ãåŸæ¥å¡ã«æè¬ããŸãã
DBMSã®éžæ
ãã¹ãŠã®ãããžã§ã¯ãã®å¯¿åœã«ãããŠãé
ããæ©ããããã¹ãŠã®ããŒã¿ãä¿åããDBMSãéžæããå¿
èŠããããšãã«è»¢æç¹ãçããŸãã ãã®èгç¹ãããç§ãã¡ã®ãããžã§ã¯ãã¯åçŽã§ãïŒãŠãŒã¶ãŒãæç¥šãåçãéäžã§åéãããäœããã®æ
å ±-ãããã¯ãã¹ãŠãããŒããªã¥ãŒã¹ãã¬ãŒãžã«å®å
šã«ä¿åã§ããŸãã ãããã£ãŠãæåã«ãRedisãTarantoolãããã³handlersocketãåããMySQLã®3ã€ã®ãªãã·ã§ã³ãæ€èšããŸããã æåããã®ãæ°ã«å
¥ãã¯Redisã§ããã ããã¯é«éã«åäœããStack OverflowããŒã ã«ãã£ãŠäœæããããã°ããã.NETã³ãã¯ã¿ãåããŠããŸãã ã¡ãªã¿ã«ãStack Overflowèªäœã¯.NETã§èšè¿°ãããWindowsäžã§å®è¡ãããMicrosoftãRedisãªã©ã®SQL ServerããããŸãã Redisã«ã¯åªããããã¥ã¡ã³ãããããŸã ã Redisãšäžç·ã«ä»äºããããšã®ãªãæ°ããããã°ã©ããŒãéã£ããã圌ãããã«éããŸãã3æ¥åŸã«ã¯ãRedisã䜿çšããããã«ç¥ã£ãŠããå¿
èŠãããããšããã¹ãŠç¥ã£ãŠããŸãã
2çªç®ã®æ°åã¯Tarantoolã§ããã æ®å¿µãªããã圌ã¯Redisã®ãããªäŸ¿å©ãªãµã€ããæã£ãŠããŸããã§ããã .NETã®ã³ãã¯ã¿ãšåæ§ã 圌ã¯Redisãšããã»ã©éãããªãã£ãã®ã§ãã¹ããŒãã«ãããŠåœŒã¯å®å
šã«ç§ãã¡ã«åã£ãŠããŸããã å
èªã¿ãã°ãæå¹ã«ãããšããã¹ãŠã®ã¬ã³ãŒãããã£ã¹ã¯ã«ä¿åãããŸãã ãŸããã³ã³ãããŒã©ãŒããã£ã¹ã¯ããŸãã¯ä»ã®ããŒããŠã§ã¢ã«ãã°ããªãå Žåãéåžžã«ç¢ºå®ã«ãªããŸãã Tarantoolã«ã¯ã»ã«ã³ããªã€ã³ããã¯ã¹ããããŸãã å Žåã«ãã£ãŠã¯ãããã¯éåžžã«éèŠãªæ©èœã§ãã Redisã§ã¯ããã§ã¯ãªããæåã§è¡ãå¿
èŠããããŸãã
Handlersocketã¯éšå€è
ã§ããããšã倿ããŸããã Redisããã³Tarantoolãããäœéã§ãã ãã ããACIDã¢ãã«ã¯ãMySQLã®ãšã³ãžã³ããµããŒãããŠããå Žåã«äœ¿çšã§ããŸãã MySQLã®ã€ã³ãã©ã¹ãã©ã¯ãã£å
šäœïŒã¬ããªã±ãŒã·ã§ã³ãã¢ãã¿ãªã³ã°ããšã¯ã¹ããã€ããããã¯ã¢ããïŒãå©çšã§ããŸãã ãã¬ãŒã³SQLã§è€éãªã¬ããŒããäœæã§ããŸãã .NETçšã®ã³ãã¯ã¿ããããŸããã§ããã

ãã®çµæãRedisãéžæããã¯ããŒãºãã¢ã«ãã¡ã§èµ·åããŸããã ãããããã°ãããããšãã»ã«ã³ããªã€ã³ããã¯ã¹ã®æ¬ åŠããç§ãã¡ãæã£ãŠãããããæ·±å»ãªåé¡ã§ããããšãæããã«ãªããŸããã äœæè
ãäœæãããã¹ãŠã®æç¥šãéžæããå¿
èŠãããå Žåã¯ãã¹ãã¬ãŒãžçšã®è¿œå ãªã¹ããäœæããå¿
èŠããããŸãïŒãã¡ããã培åºçãªæ€çŽ¢ãå®è¡ã§ããŸãããããã¯ç§ãã¡ã®å Žåã§ã¯ãããŸããïŒã ããŸããŸãªé害ã®çµæãšããŠãããŒã¿ã®äžè²«æ§ã倱ããããªã¹ã¯ããããŸãã Luaã¹ã¯ãªãããŸãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãä»ããŠãããä¿®æ£ããããšãããšãRedisãçŽ3ã4åé
ããªããšããäºå®ã«è³ããŸããã ç§ã®æèŠã§ã¯ãããã¯Redisèªäœã®åé¡ã§ã¯ãªãã誀çšã®çµæã§ãã

次ã«ãTarantoolã«åãæ¿ããããšã«ããŸããã ãããŠãããã«2ã€ã®åé¡ã«çŽé¢ããŸããã Tarantoolã«ã¯Windowsçšã®ãã€ããªããŸã ãããŸããïŒãã€è¡šç€ºããããã¯äžæã§ãïŒã .NETçšã®ã³ãã¯ã¿ã¯ãããŸããã§ãã-2ã äžè¬çã«èšãã°ãããã¯è°è«ã®äœå°ã®ãã質åã§ãããWindowsã§ã®ã¹ãã¬ãŒãžã®ããŒãžã§ã³ã®æ¬ åŠãäžå©ãšåŒã¶ããšã¯ã§ããŸããïŒ ããã¯å©ç¹ã ãšæããŸãã å®éãå®çšŒåç°å¢ã§ã¯Linuxãååšããå¯èœæ§ãé«ããWindowsçšã®ããŒãžã§ã³ããªããããããã°ã©ãã¯ãã¹ãŠãå®éã«ã©ã®ããã«æ©èœããããçè§£ããå¿
èŠããããŸãã ãããã°ãšç£èŠã®ããã°ã©ãã¯ãæ¬çªç°å¢ãšåãããŒã«ã䜿çšããŸãã ç§ã®èгå¯ã«ãããšãããã«ããããšã©ãŒãªãã§é«å質ã®ã³ãŒããèšè¿°ããå¯èœæ§ãé«ãŸããçœå®³æã®ããŠã³ã¿ã€ã ãççž®ãããŸãã
éçºçšã®Docker for Windowsã䜿çšããŠãæåã®åé¡ã解決ããŸããã ãããã2çªç®ã®åé¡ã¯ããè€éã§ããã
ã³ãã¯ã¿ãŒ
Tarantoolçšã®æ¢æã®ã³ãã¯ã¿ããªãã£ããããç¬èªã«äœæããŸããã ãã®ããã«ã2ã€ã®åé¡ã解決ããå¿
èŠããããŸããã æåïŒããã¯Tarantoolã®ããŒã¿äº€æåœ¢åŒã§ããããã msgpackã§ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãå®è£
ããŸãã MsgPack.Lightãããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯å
ã§è§£æ±ºããŸãããããã¯ã msgpackã«ããã±ãŒãžåãããããŒã¿ãä¿åããããã§ãã 2çªç®ã®ã¿ã¹ã¯ã¯ãæåéãTarantool iProtoã§ããŒã¿äº€æãããã³ã«ãå®è£
ããããšã§ãã ã progaudi.tarantoolãããžã§ã¯ãã®äžéšãšããŠè§£æ±ºãããŸããã
ãµããŒãããŸã
- .NET 4.6以é
- æ°ãããªãŒãã³ãœãŒã¹ãã¬ãŒã ã¯ãŒã¯.NET CoreïŒnetstandard 1.4以éã
ã³ãã¯ã¿ã¯tarantool.csharpãšåŒã°ããŠããŸãããã ã³ãã¥ããã£ããã®ãã£ãŒãããã¯ãåããŠãprogaudi.tarantoolãšããååã«å€æŽããŸããã ããã§ãååã«ãã£ãŠæ··ä¹±ãçããããšã¯ãããŸãããFïŒããã®ã³ãã¯ã¿ã䜿çšã§ãããã©ããã ããã¯æåããå¯èœã§ããã
MsgPack.Lightã®æè¿ã®æ¹åã®ãããã§ãã³ãã¯ã¿ãŒã¯Tarantulaã¹ã«ã©ãŒããŒã¿åã§åäœããããšãåŠã³ãŸããã å°æ¥çã«ã¯ãã³ãã¯ã¿ã§ã®äœæ¥ãããã«ç°¡çŽ åãããŠãŒã¶ãŒãªããžã§ã¯ãã®TarantoolTupleæ§é ãžã®æç€ºçãªå€æãåé¿ããäºå®ã§ãã
DDLã¯iProtoã®ç¯å²å€ã§ãããEVALã³ãã³ãã®ã©ãããŒã§å®è£
ããå¿
èŠããããããDDLããµããŒãããŠããŸããã å人çã«ã¯ãããã°ã©ããŒãTarantoolã䜿çšããå Žåã¯ãLuaã§ã¹ããŒã ãäœæããå¿
èŠããããšæããŸãããã®å Žåã管çè
ãšã®ããåããè¡ããããã«äœæ¥ç°å¢ã«é
åžã§ããããã§ãã ãã¶ãç§ã¯ééã£ãŠãããç§ãã¡ã¯.NETãããããè¡ãèœåãå®çŸããŠããŸãã
çŸåšã1ã€ã®TarantoolããŒãã®ã¿ãšæ¥ç¶ããŠããŸãã CALL_16ãå®å
šã«ã¯ãµããŒãããŠããŸãããç¹å®ã®å ŽåãTarantoolåŽã§å¥åŠãªããã±ãŒãžã³ã°ãçºçããéã·ãªã¢ã«åäžã«ãšã©ãŒãçºçããŸãã æ°ããCALLã¯å®å
šã«ãµããŒããããŠããŸãã䜿çšããããšããå§ãããŸãã
æ®å¿µãªãããTarantoolã§ã¯ããã¹ãŠã®ãªã¯ãšã¹ãããã°ã«åºåãããããµãŒããŒã«äŸé Œããããšã¯ã§ããŸããã ç¶æ³ã«ãã£ãŠã¯ãããã«ãããããã°ãéåžžã«é£ãããªããŸããéåžžãTarantoolãµãŒããŒã®ããã©ãŒãã³ã¹ã¯æ°ã«ããŸããã ãã¹ãŠã®èŠæ±ããã°ã«èšé²ãããªã©ãäœããã®ãã³ãååŸããããšæããŸãã
ãªã¯ãšã¹ãããã°ã«èšé²ãããšããã©ããããããããããäºãã«åé¢ããããšæããŸãã ãã®ããã«ãæ¥ç¶IDïŒbox.session.idïŒãšèŠæ±IDïŒbox.session.syncïŒããããŸãã æ®å¿µãªãããbox.session.syncã¯åãæ¥ç¶å
ã®ãã¹ãŠã®èŠæ±ãšå
±æãããŸãããã®çµæãèŠæ±ãéäŒç¹ïŒ ããŒã¿ããŒã¹ãžã®æžã蟌ã¿ãå¶åŸ¡ã®æå転éãªã©ïŒã«å°éããããã«äžæãããå Žåã倿Žãããå¯èœæ§ããããŸã ã ååãšããŠãããã¯ãããšãã°ã¹ãã¢ãããã·ãŒãžã£ãªã©ãããã€ãã®ãã°ãã€ã³ããããå Žåã«ã®ã¿éèŠã§ãã ãã®ãããªå Žåãbox.session.syncã¯ããŒã«ã«å€æ°ã®æåã®yieldãã€ã³ããŸã§ä¿åãããã¹ãã§ãã
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒ
Tarantoolã®éèŠãªéšåã¯ãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã§ãã ä»ã®ã¢ãžã¥ãŒã«ã®èªåãªããŒãã ã·ã£ãŒãã£ã³ã° ãä»ã®DBMSïŒ 1ã2ãªã©ïŒã®ãã¥ãŒããã³ãã©ã€ããŒã§çµãããªã©ãåçŽãªãã®ããå§ãŸããå€ãã®æ¢è£œã®ã¢ãžã¥ãŒã«ããããŸã ã ç§ãã¡ã詊ãããã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ãããŸãæ©èœããååã«ææžåãããç¶æãããŠããŸãã
ãã®å€æ§æ§ã®ãã¡ããã¥ãŒã«ã¯tarantool / queueã䜿çšããã¡ããªãã¯ã®åéã«ã¯tarantool / prometheusã䜿çšããŸãã ãŸããLuaã®ããžãã¯ãããã€ããããŸãã å°ã-ç§ãã¡ã®ããŒã ã¯.NETã®äžçã®åºèº«ã ããã§ãã éçã³ãŒãåæã段éçãªãããã°ã䟿å©ãªãããã¡ã€ã©ãŒã䜿çšããããšã«æ
£ããŠããŸãã Luaã«ã¯ãããç¹ã«éçã³ãŒãåæã«é¢ããåé¡ããããŸãã
è€è£œ
åæã¬ããªã±ãŒã·ã§ã³ãååŸãããã§ãã ç§ãã¡ã¯ãã§ã«ãããªãã§çããæ¹æ³ãç¥ã£ãŠããŸããããšãŠã楜ãã¿ã«ããŠããŸãã ãããŸã§ã®ãšãããå©çšå¯èœãªãã¹ã¿ãŒãã¹ã¿éåæã¬ããªã±ãŒã·ã§ã³ã䜿çšããŠããŸãã åœç€Ÿã®ãµãŒãã¹ã®1ã€ã¯åçã䜿çšããŸãã ã©ã³ãã ãªããŒãããã«è¡šç€ºãããããŒã«äžèŽãã確çã¯éåžžã«å°ãããããä»»æã®ããŒãã«æžã蟌ãããšãã§ããŸãã åçãšSHA256ã®çæãããGUIDãäžèŽãããå¿
èŠããããŸãã ããã«ã¯ããã«è³ããªãã£ããããã³ãã¯ã¿ã¯ãŸã ããã€ãã®ããŒããžã®æ¥ç¶æ¹æ³ãç¥ããŸããã ä»å¹Žã¯ééããªãä¿®æ£ããŸãã
å€ãããŒãžã§ã³ã®ã¯ã©ã¹ã¿ãŒã¢ã»ã³ããª
éåžžã«å€ããã«ã1.7.3-0ã§ã¯ãã¯ã©ã¹ã¿ãŒãã¢ã»ã³ãã«ãããªãå ŽåããããŸãã 3ã€ã®ãã¹ã¿ãŒããŒãããããšããŸãã ããããåãæ§æã«åããŠå®è¡ããŸãã ãããŠãããŒãã®ãããããããŒã¿ãåéãããœãŒã¹ãèŠããŸã§ãä»ã®ã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ããåãå
¥ããŸããã æ®å¿µãªããããããã®ãœãŒã¹ã¯ãããã®é¡§å®¢ã§ãã ãã®çµæã3ã€ã®ããŒããã¹ãŠãèŠæ±ã«å¿çããã30ç§åŸ
æ©ããŸãã ãã®æç¹ã§ã圌ãã¯ãœãŒã¹ãæ€çŽ¢ããèŠã€ããããããã°ã«æžã蟌ã¿ãŸãïŒããœãŒã¹ããããŸãããç§ã¯ãªãã«ããŸãããã ãããŠãã¯ã©ã¹ã¿ãŒã¯è¡ããŸããã æåã§åéããå¿
èŠããããŸãã äžè¬çãªæ§æãªãã§1ã€ã®ããŒããéå§ããŸãã äžæããæ®ãã®ããŒããããã«æ¥ç¶ããŠãããæ§æãåäžã®ãã®ã«å€æŽããŸãã æ°ããããŒãžã§ã³ã§ã¯ããã®ãã°ã¯ãã§ã«ä¿®æ£ãããŠããŸãã
ã€ã¡ãŒãžã®ããŒãžã§ã³ã1.7.3ã ãšããŸãããã ãããŠãã©ã®ããŒãžã§ã³ã®Tarantoolãå
¥ã£ãŠããŸããïŒ 1.7.3ã¯ããã£ãŠããŸããããã«ãçªå·ã¯äžæã§ãã å¯äžã®ãªãã·ã§ã³ã¯ããœãŒã¹ã衚瀺ããããšã§ãã 114ã«ã¯ãŸã ç§ãã¡ãå·ã€ããåé¡ãããã116ã«ã¯ååšãããã©ããããããªããããTarantoolããŒãžã§ã³1.7.3-115ãå¿
èŠã ãšããŸãããã ã©ã®ããŒãžã§ã³ã®ç»åã䜿çšããŸããïŒ
ãã®åé¡ã¯åçŽã«è§£æ±ºããŸãããèªåã§ã€ã¡ãŒãžãåéããç¹å®ã®ãã«ãçªå·ãæå®ãããšããã¹ãŠãæ£åžžã«æ©èœããŸãã ããããå
šäœçã«ããã¯å°ããªåé¡ã§ãã ããã©ã«ãã®ã€ã¡ãŒãžã¯æ£åžžã«æ©èœããã»ãšãã©ã®èŠæ±ãã«ããŒããŸããããã«ã¯ãTarantoolã䜿çšããããã«å¿
èŠãªãã¹ãŠã®åºæ¬ã¢ãžã¥ãŒã«ïŒç£èŠããã¥ãŒãªã©ïŒãå«ãŸããŠããŸãã
ã€ã³ã¿ã©ã¯ãã£ãã¯ãšãª
Tarantoolã§ã€ã³ã¿ã©ã¯ãã£ãã¯ãšãªãäœæããã«ã¯ãLuaãçè§£ããã³ãã³ãã©ã€ã³ã䜿çšã§ããå¿
èŠããããŸãã ãã¹ã¿ãŒãšç®¡çè
ã¯ã³ãã³ãã©ã€ã³ãåŠçã§ããŸãããLuaã«å¯ŸåŠããããšã«ç±å¿ã§ã¯ãããŸããã 圌ãã¯ããã«SQLã¹ã¯ãªãããæžããã«ãŠã³ã¿ãŒãã¿ã€ã ã¹ã¿ã³ãããã§ãã¯ãããã ãããã£ãŠãçºè¡šãããSQLiteæ¹èšã®ãµããŒããæ¬åœã«æ¥œãã¿ã«ããŠããŸãã
ç£èŠãšãã°
ãããã¯ãã¹ãŠåé¡ãããŸããã ã¿ã©ã³ããŒã«/ããã¡ããŠã¹ã¢ãžã¥ãŒã«ããã ãããã¯ããã¡ããŠã¹ã® Webãµã€ãã§å
¬éãããŠããŸãã æ¬çªããã«ãŒã䜿çšããã®ã§ãFluentdïŒ 1ããã³2 ïŒã䜿çšããŠãã°ãåéãã ElasticSearchã«å
¥ããŸãã
çµè«
.NETã¯åãªãWindowsã«ã¯ã»ã©é ãïŒ.NET Coreã¯ãã¹ãŠã®ãã©ãããã©ãŒã ã§å®è¡ãããŸãã Linuxã§æ£åžžã«åäœããå®çšŒåç°å¢ã®.NETã¢ããªã±ãŒã·ã§ã³ããããŸãã ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã¯ãWindowsãMac OSãLinuxã§åé¡ãªããã«ãããŠå®è¡ã§ããŸãïŒWindows 10ãMax OS XãUbuntu 16.04ã®ã¿ããã¹ããããŠããŸãïŒã åæã«ãéçºããã³ãããã°ã§ã¯ã.NETã®äžçã§å©çšå¯èœãªãã¹ãŠã®è±å¯ãªããŒã«ã䜿çšããããšãã§ããŸããå€ãã®å Žåãåçšéçºã§ãç¡æã§ãã
æ°ãã.NETãœãªã¥ãŒã·ã§ã³ã®ã¯ãã¹ãã©ãããã©ãŒã ã®æ§è³ªã«ããã以åã¯ã¢ã¯ã»ã¹ã§ããªãã£ãããŒã«ãããšãã°Tarantoolã䜿çšããããšãå¯èœã«ãªããŸãã é床ãã»ã«ã³ããªã€ã³ããã¯ã¹ãDBMSãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãŸãã¯ã¿ã¹ã¯ãã¥ãŒãšããŠäœ¿çšããæ©èœãéèŠãªå Žåã仿¥Tarantoolã¯éåžžã«è¯ãéžæã§ãã