PHP ãšã³ã·ã¹ãã ã«ã¯çŸåšãTarantool ãµãŒããŒãšé£æºããããã® XNUMX ã€ã®ã³ãã¯ã¿ããããŸããããã¯å
¬åŒã® PECL æ¡åŒµæ©èœã§ãã
ãã®èšäºã§ã¯ãäž¡æ¹ã®ã©ã€ãã©ãªã®ããã©ãŒãã³ã¹ ãã¹ãã®çµæãå
±æããã³ãŒããžã®æå°éã®å€æŽã§ 3 ïœ 5 ã®ããã©ãŒãã³ã¹åäžãéæã§ããæ¹æ³ã瀺ããããšæããŸã (ç·åãã¹ãã§ïŒ).
äœããã¹ãããŸããïŒ
äžèšã®ãã®ããã¹ãããŸã åæ ã³ãã¯ã¿ã¯éåæã䞊åãéåæ䞊åã§å®è¡ãããŸãã ð ãŸããã³ãã¯ã¿èªäœã®ã³ãŒãã«ã觊ããããããŸããã çŸåšãç®çãéæããããã«å©çšã§ããæ¡åŒµæ©èœãããã€ããããŸãã
ã¹ãŠãŒã« â PHP çšã®é«æ§èœéåæãã¬ãŒã ã¯ãŒã¯ã Alibaba ã Baidu ãªã©ã®ã€ã³ã¿ãŒããã倧æã«ãã£ãŠäœ¿çšãããŠããŸãã ããŒãžã§ã³ 4.1.0 以éãéæ³ã®ã¡ãœãããç»å ŽããŸããã SwooleRuntime::enableCoroutine()ããã«ããããXNUMX è¡ã®ã³ãŒãã§åæ PHP ãããã¯ãŒã¯ ã©ã€ãã©ãªãéåæã©ã€ãã©ãªã«å€æãã§ããããã«ãªããŸãã- Async ã¯æè¿ãŸã§ãPHP ã®éåæäœæ¥ã®ããã®éåžžã«ææãªæ¡åŒµæ©èœã§ããã ãªãæè¿ãŸã§ïŒ æ®å¿µãªãããçç±ã¯äžæã§ãããäœæè
ããªããžããªãåé€ããããããããžã§ã¯ãã®å°æ¥ã®éåœã¯äžæã§ãã 䜿ããªããã°ãªããŸãã
1 ãã©ãŒã¯ããã Swoole ãšåæ§ã«ããã®æ¡åŒµæ©èœã䜿çšãããšãæéŠã軜ãåããã ãã§ãºãã³ã®é»æºãç°¡åã«ãªã³ã«ã§ããTCP ããã³ TLS ã¹ããªãŒã ã®æšæºå®è£ ãéåæããŒãžã§ã³ã«çœ®ãæããããšã§éåæãæå¹ã«ããããšãã§ããŸãã ããã¯ãªãã·ã§ã³ãéåæ.tcp = 1" 䞊åã·ãã¥ã¬ãŒã·ã§ã³ã®èšå® â phpdbgãapcuãpthreadsãpcovãuopz ãªã©ã®ã©ã€ãã©ãªã®äœè ã§ãããæå㪠Joe Watkins ã«ããããªãæ°ããæ¡åŒµæ©èœã§ãã ãã®æ¡åŒµæ©èœã¯ãPHP ã§ã®ãã«ãã¹ã¬ããçšã® API ãæäŸããpthread ã®ä»£æ¿ãšããŠäœçœ®ä»ããããŸãã ãã®ã©ã€ãã©ãªã®é倧ãªå¶éã¯ãPHP ã® ZTS (Zend Thread Safe) ããŒãžã§ã³ã§ã®ã¿åäœããããšã§ãã
ã©ã®ããã«ãã¹ãããã®ã§ãããã?
å è¡æžã蟌ã¿ãã°ãç¡å¹ã«ã㊠Tarantool ã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸããã (wal_mode = ãªã) ããã³ãããã¯ãŒã¯ ãããã¡ãŒã®å¢å (å èªã¿ = 1 * 1024 * 1024ïŒã æåã®ãªãã·ã§ã³ã§ã¯ãã£ã¹ã¯ã§ã®äœæ¥ãäžèŠã«ãªããXNUMX çªç®ã®ãªãã·ã§ã³ã§ã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ãããã¡ããããå€ãã®ãªã¯ãšã¹ããèªã¿åãããšãã§ãããããã·ã¹ãã ã³ãŒã«ã®æ°ãæå°éã«æããããŸãã
ããŒã¿ãæäœãããã³ãããŒã¯ (æ¿å
¥ãåé€ãèªã¿åããªã©) ã®å Žåããã³ãããŒã¯ãéå§ããåã«ãmemtx ã¹ããŒã¹ã (å) äœæããããã©ã€ã㪠ã€ã³ããã¯ã¹å€ãé åºä»ãæŽæ°å€ã®ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠäœæãããŸãã (ã·ãŒã±ã³ã¹)ã
ã¹ããŒã¹ DDL ã¯æ¬¡ã®ããã«ãªããŸãã
space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})
å¿ èŠã«å¿ããŠããã³ãããŒã¯ãå®è¡ããåã«ãã¹ããŒã¹ã次ã®åœ¢åŒã® 10,000 ã¿ãã«ã§åããããŸãã
{id, "tuplе_<id>"}
ã¿ãã«ã«ã¯ã©ã³ãã ãªããŒå€ã䜿çšããŠã¢ã¯ã»ã¹ããŸãã
ãã³ãããŒã¯èªäœã¯ãµãŒããŒã«å¯Ÿãã 10,000 ã€ã®ãªã¯ãšã¹ãã§ããã5 å (å転) å®è¡ãããããã«å埩ããŠå®è¡ãããŸãã 3 åã®å埩éã®ãã¹ãŠã®æéåå·®ã蚱容誀差 1%* 以å ã«ãªããŸã§ãå埩ãç¹°ãè¿ãããŸãã ãã®åŸãå¹³åçµæãååŸãããŸãã ããã»ããµãŒã®ã¹ãããã«ãé²ãããã«ãå埩ã®éã«ã¯ XNUMX ç§ã®äžæåæ¢ããããŸãã Lua ã®ã¬ããŒãž ã³ã¬ã¯ã¿ãŒã¯åå埩ã®åã«ç¡å¹ã«ãªããå®äºåŸã«åŒ·å¶çã«éå§ãããŸãã PHP ããã»ã¹ã¯ãåºåãããã¡ãªã³ã°ãæå¹ã«ãªããã¬ããŒãž ã³ã¬ã¯ã¿ãŒãç¡å¹ã«ãªã£ãç¶æ ã§ããã³ãããŒã¯ã«å¿ èŠãªæ¡åŒµæ©èœã®ã¿ã䜿çšããŠèµ·åãããŸãã
â»å転æ°ãå埩åæ°ã誀差éŸå€ã¯ãã³ãããŒã¯èšå®ã§å€æŽå¯èœã§ãã
ãã¹ãç°å¢
以äžã«å
¬éãããŠããçµæã¯ãMacBookPro (2015)ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã - Fedora 30 (ã«ãŒãã« ããŒãžã§ã³ 5.3.8-200.fc30.x86_64) ã§è¡ãããŸããã Tarantool ããã©ã¡ãŒã¿ããã䜿çšã㊠docker ã§èµ·åãããŸããã--network host"
.
ããã±ãŒãžã®ããŒãžã§ã³:
Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3ããã«ã a872fc2f86
PHP: 7.3.11 (cli) (ãã«ã: 22 幎 2019 æ 08 æ¥ 11:04:XNUMX)
ã¿ã©ã³ããŒã«/ã¯ã©ã€ã¢ã³ã: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ 7.3 çšããã)*
ext-msgpack: 2.0.3
å€éšéåæ: 0.3.0-8c1da46
å€éšã¹ãŠãŒã«: 4.4.12
å€éšäžŠå: 1.1.3
* æ®å¿µãªãããå
¬åŒã³ãã¯ã¿ã¯ PHP ããŒãžã§ã³ 7.2 以éã§ã¯åäœããŸããã PHP 7.3 ã§æ¡åŒµæ©èœãã³ã³ãã€ã«ããŠå®è¡ããã«ã¯ã次ã䜿çšããå¿
èŠããããŸããã
çµæ
åæã¢ãŒã
Tarantool ãããã³ã«ã¯ãã€ããªåœ¢åŒã䜿çšããŸã
ã³ãã¯ã¿ãæ¯èŒããåã«ãPHP ã³ãã¯ã¿ã® MessagePack ãšã³ã³ãŒãã®ããã©ãŒãã³ã¹ã枬å®ãããã®åŸã®ãã¹ãã§ã¯æè¯ã®çµæã瀺ãããšã³ã³ãŒãã䜿çšããŸãã
PHP ããŒãžã§ã³ (Pure) ã¯é床ã®ç¹ã§ PECL æ¡åŒµæ©èœã«å£ããŸãããå®éã®ãããžã§ã¯ãã§ã¯ãã¯ã PHP ããŒãžã§ã³ã䜿çšããããšããå§ãããŸãã
ããã§ãåæã¢ãŒãã§ã³ãã¯ã¿ã®ããã©ãŒãã³ã¹ã枬å®ããŠã¿ãŸãããã
ã°ã©ããããããããã«ãPECL ã³ãã¯ã¿ (Tarantool) ã¯ãPHP ã³ãã¯ã¿ (ã¯ã©ã€ã¢ã³ã) ãšæ¯èŒããŠåªããããã©ãŒãã³ã¹ã瀺ããŠããŸãã ããããåŸè
ã¯é
ãèšèªã§å®è£
ãããŠããããšã«å ããŠãå®éã«ã¯ããå€ãã®äœæ¥ãå®è¡ããããšãèãããšãããã¯é©ãã¹ãããšã§ã¯ãããŸãããåŒã³åºãã®ãã³ã«æ°ãããªããžã§ã¯ããäœæãããŸãã ãªã¯ãšã¹ã О ã¬ã¹ãã³ã¹ (éžæã®å Žå - ã åºæºãUpdate/Upsert ã®å Žå â æ¥åå·è¡çµ±æ¬)ãå¥åã®ãšã³ãã£ã㣠æ¥ç¶, ããã«ãŒ О ãã³ãã© ãªãŒããŒããããè¿œå ãããŸãã æããã«ãæè»æ§ã«ã¯ä»£åã䌎ããŸãã ãã ããäžè¬ã«ãPHP ã€ã³ã¿ãŒããªã¿ãŒã¯åªããããã©ãŒãã³ã¹ã瀺ããŸããéãã¯ãããã®ã®ãããã¯ãããã§ãããPHP 7.4 ã® JIT ã¯ãã¡ããã®ããšãPHP 8 ã§ããªããŒãã䜿çšããå Žåã¯ããã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
次ãžç§»ããŸãããã Tarantool 2.0 ã§ã¯ SQL ã®ãµããŒããè¿œå ãããŸããã SQL ãããã³ã«ã䜿çšããŠéžæãæ¿å ¥ãæŽæ°ãããã³åé€ã®æäœãå®è¡ããŠãçµæãåçã® noSQL (ãã€ããª) ãšæ¯èŒããŠã¿ãŸãããã
SQL ã®çµæã¯ããŸãå°è±¡çã§ã¯ãããŸãã (åæã¢ãŒãã¯ãŸã ãã¹ãäžã§ããããšãæãåºããŠãã ãã)ã ãã ããäºåã«ããã«ã€ããŠåæºããã€ããã¯ãããŸãããSQL ãµããŒãã¯ãŸã ç©æ¥µçã«éçºäžã§ã (ããšãã°ãæ¯èŒçæè¿ãµããŒããè¿œå ãããŸãã)
éåæ
ããŠãããã§ãAsync æ¡åŒµæ©èœãäžèšã®çµæãæ¹åããã®ã«ã©ã®ããã«åœ¹ç«ã€ããèŠãŠã¿ãŸãããã éåæããã°ã©ã ãäœæããããã«ãæ¡åŒµæ©èœã¯ã³ã«ãŒãã³ã«åºã¥ã API ãæäŸããŸããããã䜿çšããŸãã ç§ãã¡ã®ç°å¢ã«æé©ãªã³ã«ãŒãã³ã®æ°ã¯ 25 ã§ããããšãçµéšçã«ããããŸãã
10,000 ã®æäœã 25 ã®ã³ã«ãŒãã³ã«ãåæ£ãããŠãäœãèµ·ãããã確èªããŸãã
3 ç§ãããã®æäœæ°ã XNUMX å以äžã«å¢å ããŸããã
æ®å¿µãªãããPECL ã³ãã¯ã¿ã¯ ext-async ã§ã¯éå§ãããŸããã§ããã
SQL ã«ã€ããŠã¯ã©ãã§ãããã?
ã芧ã®ãšãããéåæã¢ãŒãã§ã¯ãã€ã㪠ãããã³ã«ãš SQL ã®å·®ã¯èª€å·®ã®ç¯å²å
ã«ãªããŸããã
ã¹ãŠãŒã«
ããäžåºŠãä»å㯠Swoole ã®æé©ãªã³ã«ãŒãã³æ°ãèŠã€ããŸãã
25 ã§åæ¢ããŸããããAsync æ¡åŒµæ©èœãšåãããªãã¯ãç¹°ãè¿ããŠã¿ãŸããã - 10,000 åã®ã³ã«ãŒãã³é㧠25 ã®æäœãåæ£ããŸãã ããã«ããã¹ãŠã®äœæ¥ã 2 ã€ã®ããã»ã¹ã«åå²ããå¥ã®ãã¹ããè¿œå ããŸã (ã€ãŸããåããã»ã¹ã¯ 5,000 åã®ã³ã«ãŒãã³ã§ 25 ã®æäœãå®è¡ããŸã)ã ããã»ã¹ã¯æ¬¡ã䜿çšããŠäœæãããŸã ã¹ãŠãŒã«ããã»ã¹.
çµæïŒ
Swole ã¯ã2 ã€ã®ããã»ã¹ã§å®è¡ãããš Async ãšæ¯èŒããŠãããã«äœãçµæã瀺ããŸããã2 ã€ã®ããã»ã¹ã§ã¯ç¶æ³ãåçã«å€åããŸã (2 ãšããæ°åã¯å¶ç¶ã«éžæãããããã§ã¯ãããŸãããç§ã®ãã·ã³ã§ã¯ãæè¯ã®çµæã瀺ããã®ã¯ XNUMX ã€ã®ããã»ã¹ã§ãã)ã
ã¡ãªã¿ã«ãAsync æ¡åŒµæ©èœã«ã¯ããã»ã¹ãæäœããããã® API ããããŸãããXNUMX ã€ãŸãã¯è€æ°ã®ããã»ã¹ã§ãã³ãããŒã¯ãå®è¡ããå Žåãšã®éãã«æ°ã¥ããŸããã§ãã (ã©ããã§å€±æããå¯èœæ§ããããŸã)ã
SQL ãšãã€ã㪠ãããã³ã«:
éåæãšåæ§ãéåæã¢ãŒãã§ã¯ãã€ããªæäœãš SQL æäœã®éãã¯ãªããªããŸãã
䞊åã·ãã¥ã¬ãŒã·ã§ã³ã®èšå®
Parallel æ¡åŒµæ©èœã¯ã³ã«ãŒãã³ã«é¢ãããã®ã§ã¯ãªããã¹ã¬ããã«é¢ãããã®ã§ãããããæé©ãªäžŠåã¹ã¬ããã®æ°ã枬å®ããŠã¿ãŸãããã
ç§ã®ãã·ã³ã§ã¯ 16 ã«çžåœããŸãã 16 åã®äžŠåã¹ã¬ããã§ã³ãã¯ã¿ã®ãã³ãããŒã¯ãå®è¡ããŠã¿ãŸãããã
ã芧ã®ãšãããçµæã¯éåææ¡åŒµæ©èœã䜿çšããå Žåãããããã«åªããŠããŸã (2 ã€ã®ããã»ã¹ã§å®è¡ãããŠãã Swoole ã¯èæ
®ããŠããŸãã)ã PECL ã³ãã¯ã¿ã®å ŽåãUpdate ããã³ Upsert æäœã¯ç©ºã§ããããšã«æ³šæããŠãã ããã ããã¯ããããã®æäœããšã©ãŒã§å€±æããããã§ããããã ext-Parallel ã®ãããªã®ããext-tarantool ã®ãããªã®ãããããã¯ãã®äž¡æ¹ã®ãããªã®ãã¯ããããŸããã
次ã«ãSQL ã®ããã©ãŒãã³ã¹ãæ¯èŒããŠã¿ãŸãããã
åæããŠå®è¡ãããŠããã³ãã¯ã¿ã®ã°ã©ããšã®é¡äŒŒæ§ã«æ°ã¥ããŸããã?
äžç·ã«
æåŸã«ããã¹ãŠã®çµæã XNUMX ã€ã®ã°ã©ãã«ãŸãšããŠããã¹ããããæ¡åŒµæ©èœã®å
šäœåã確èªããŸãããã ãŸã è¡ã£ãŠããªãæ°ãããã¹ãã XNUMX ã€ã ããã£ãŒãã«è¿œå ããŸããããParallel* ã䜿çšããŠéåæã³ã«ãŒãã³ã䞊åå®è¡ããŠã¿ãŸãããã äžèšã®æ¡åŒµæ©èœãçµ±åãããšããã¢ã€ãã¢ã¯ãã§ã«
* Parallel ã§ã¯ Swoole ã³ã«ãŒãã³ãèµ·åã§ããŸããã§ããããããã®æ¡åŒµæ©èœã«ã¯äºææ§ããªãããã§ãã
æçµçãªçµæã¯æ¬¡ã®ãšããã§ãã
代ããã«ãçµè«ã®
ç§ã®æèŠã§ã¯ãçµæã¯éåžžã«äŸ¡å€ã®ãããã®ã§ããããšãå€æããŸãããäœããã®çç±ã§ããããéçã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã å®éã®ãããžã§ã¯ãã§ãããèªåèªèº«ã ãã§æ±ºå®ããå¿
èŠããããã©ããã¯å¥ãšããŠãç§ã«ãšã£ãŠããã¯ãæå°éã®åŽåã§åæ TCP ã³ãã¯ã¿ããã©ãã ããçµãåºããããšãã§ããããè©äŸ¡ã§ããèå³æ·±ãå®éšã§ãã£ããšããããšã ããè¿°ã¹ãŠãããŸãã ãã³ãããŒã¯ãæ¹åããããã®ã¢ã€ãã¢ãããå Žåã¯ããã« ãªã¯ãšã¹ããåãã§æ€èšãããŠããã ããŸãã èµ·åæé ãšçµæãå«ããã¹ãŠã®ã³ãŒãã¯å¥ã®ããã¥ã¡ã³ãã§å
¬éãããŸãã
åºæïŒ habr.com