Π’ Tarantool ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСр Π±ΡŠΡ€Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с тях. Π•Ρ‚ΠΎ ΠΊΠΎΠ»ΠΊΠΎ лСсно сС ΠΏΡ€Π°Π²ΠΈ

ΠŸΡ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ сС ΠΎΠΏΠΈΡ‚Π°Ρ… Π΄Π° работя с Tarantool, Π½ΠΎ Ρ‚ΠΎΠ³Π°Π²Π° Π½Π΅ ΠΌΠΈ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ. Но наскоро ΠΏΡ€ΠΎΠ²Π΅Π΄ΠΎΡ… ΡƒΠ΅Π±ΠΈΠ½Π°Ρ€, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ… Π·Π° Hadoop ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ MapReduce. Π’Π°ΠΌ ΠΌΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ…Π° Π²ΡŠΠΏΡ€ΠΎΡ: β€žΠ—Π°Ρ‰ΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Tarantool Π·Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π°?β€œ

ΠžΡ‚ Π»ΡŽΠ±ΠΎΠΏΠΈΡ‚ΡΡ‚Π²ΠΎ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° сС Π²ΡŠΡ€Π½Π° към Π½Π΅Π³ΠΎ, Π΄Π° тСствам Π½Π°ΠΉ-Π½ΠΎΠ²Π°Ρ‚Π° вСрсия - ΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ наистина ΠΌΠΈ харСса. Π‘Π΅Π³Π° Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ просто ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Tarantool, Π΄Π° Π³ΠΎ Π·Π°Ρ€Π΅Π΄ΠΈΡ‚Π΅ ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ производитСлността ΠΌΡƒ ΠΈ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΊΠΎ лСсно ΠΈ Π³ΠΎΡ‚ΠΈΠ½ΠΎ Π΅ всичко.

Π’ Tarantool ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСр Π±ΡŠΡ€Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с тях. Π•Ρ‚ΠΎ ΠΊΠΎΠ»ΠΊΠΎ лСсно сС ΠΏΡ€Π°Π²ΠΈ

Какво С Tarantool

Tarantool сС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΊΠ°Ρ‚ΠΎ ΡƒΠ»Ρ‚Ρ€Π°-Π±ΡŠΡ€Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° поставитС ΠΊΠ°ΠΊΠ²ΠΈΡ‚ΠΎ искатС Π΄Π°Π½Π½ΠΈ Ρ‚Π°ΠΌ. Плюс Ρ‚ΠΎΠ²Π°, Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈΡ€Π°ΠΉΡ‚Π΅ Π³ΠΈ, Ρ€Π°Π·Π±ΠΈΠΉΡ‚Π΅ - Ρ‚.Π΅. Ρ€Π°Π·Π΄Π΅Π»Π΅Ρ‚Π΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎ количСство Π΄Π°Π½Π½ΠΈ Π½Π° няколко ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΉΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ тях - Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ‚Π½ΠΈ към Π³Ρ€Π΅ΡˆΠΊΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³Π»Π°Π²Π΅Π½ ΠΈ Π³Π»Π°Π²Π΅Π½.

Π’Ρ‚ΠΎΡ€ΠΎ, Ρ‚ΠΎΠ²Π° Π΅ ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° прилоТСния. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ прилоТСнията си Π²ΡŠΡ€Ρ…Ρƒ Π½Π΅Π³ΠΎ, Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Ρ‚Π΅ стари записи във Ρ„ΠΎΠ½ΠΎΠ² Ρ€Π΅ΠΆΠΈΠΌ спорСд ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Http ΡΡŠΡ€Π²ΡŠΡ€ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² Tarantula, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π΄Π°Π½Π½ΠΈ: ΠΈΠ·Π΄Π°ΠΉΡ‚Π΅ тяхното количСство, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Ρ‚Π°ΠΌ ΠΈ Π³ΠΈ свСдСтС Π΄ΠΎ главния.

Π§Π΅Ρ‚ΠΎΡ… статия Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΌΡ‡Π΅Ρ‚Π°Ρ‚Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° опашка ΠΎΡ‚ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΎΡ‚ 300 Ρ€Π΅Π΄Π°, която просто сС ΠΏΡ€ΡŠΡΠΊΠ° ΠΈ Π±ΡŠΡ€Π·Π° - ΠΈΠΌΠ°Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° производитСлност ΠΎΡ‚ 20 000 ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π² сСкунда. Π’ΡƒΠΊ наистина ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ голямо ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ‚ΠΎ няма Π΄Π° бъдС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ Π² PostgreS.

Π©Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° опиша Π½Π΅Ρ‰ΠΎ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ ΡΡŠΡ€Π²ΡŠΡ€, само Ρ‡Π΅ просто, Π² Ρ‚Π°Π·ΠΈ статия.

Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ

Π—Π° тСста стартирах Ρ‚Ρ€ΠΈ стандартни Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини - 20 GB Ρ‚Π²ΡŠΡ€Π΄ диск, Ubuntu 18.04. 2 Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ процСсора ΠΈ 4 Π³ΠΈΠ³Π° ΠΏΠ°ΠΌΠ΅Ρ‚.

НиС инсталирамС Tarantool - стартирайтС bash скрипта ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ apt get инсталирайтС Tarantool. Π’Ρ€ΡŠΠ·ΠΊΠ° към скрипт - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). ИмамС ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°Ρ‚ΠΎ:

tarantoolctl β€” основната ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° СкзСмпляри Π½Π° Tarantula.
/etc/tarantool - Ρ‚ΡƒΠΊ Π΅ цялата конфигурация.
var/log/tarantool - Π΅Ρ‚ΠΎ Π³ΠΈ Ρ‚Ρ€ΡƒΠΏΠΈΡ‚Π΅.
var/lib/tarantool β€” Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Ρ‚ΡƒΠΊ ΠΈ слСд Ρ‚ΠΎΠ²Π° сС раздСлят Π½Π° инстанции.

Има ΠΏΠ°ΠΏΠΊΠΈ instance-available ΠΈ instance-enable - ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС стартирано - ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ Ρ„Π°ΠΉΠ» Π½Π° СкзСмпляр с lua ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ описва ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ ΡΠ»ΡƒΡˆΠ°, ΠΊΠ°ΠΊΠ²Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° Π·Π° Π½Π΅Π³ΠΎ, настройки Π½Π° Vinyl engine, ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ сС изпълнява ΠΏΡ€ΠΈ стартиранС ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, ΡˆΠ°Ρ€Π΄ΠΈΠ½Π³, опашки, ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° остарСли Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‚.Π½.

Π˜Π½ΡΡ‚Π°Π½ΡΠΈΡ‚Π΅ работят ΠΊΠ°Ρ‚ΠΎ Π² PostgreS. НапримСр искатС Π΄Π° стартиратС няколко копия Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, която виси Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅. Оказва сС, Ρ‡Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΡΡŠΡ€Π²ΡŠΡ€ сС стартират няколко СкзСмпляра Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ висят Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅. Π’Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠΌΠ°Ρ‚ напълно Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ настройки - Π΅Π΄ΠΈΠ½ СкзСмпляр изпълнява Π΅Π΄Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°, вторият - Π΄Ρ€ΡƒΠ³Π°.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° СкзСмпляри

ИмамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° tarantoolctl, която Π²ΠΈ позволява Π΄Π° управляватС СкзСмпляри Π½Π° Tarantula. НапримСр tarantoolctl check example Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ конфигурационния Ρ„Π°ΠΉΠ» ΠΈ Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅ - Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π΅ Π΄ΠΎΠ±Ρ€Π΅, Π°ΠΊΠΎ Ρ‚Π°ΠΌ няма синтактични Π³Ρ€Π΅ΡˆΠΊΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° инстанцията - ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° tarantoolctl. По ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ стартиранС, спиранС, рСстартиранС.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ€ΡŠΡ‚ стартира, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с Π½Π΅Π³ΠΎ ΠΏΠΎ Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π°.

1. Административна ΠΊΠΎΠ½Π·ΠΎΠ»Π°

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Tarantool отваря сокСт, Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ ASCII тСкст сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Ρ‚Π°ΠΌ, Π·Π° Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° Tarantool. Π’Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° към ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π²ΠΈΠ½Π°Π³ΠΈ сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° ΠΏΠΎΠ΄ администраторския ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», няма удостовСряванС, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ няма Π½ΡƒΠΆΠ΄Π° Π΄Π° СкстСрнализиратС конзолния ΠΏΠΎΡ€Ρ‚ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Tarantula.

Π—Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, трябва Π΄Π° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ Tarantoolctl Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ ΠΈΠΌΠ΅ Π½Π° СкзСмпляр. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Ρ‰Π΅ стартира ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΈ Ρ‰Π΅ сС ΡΠ²ΡŠΡ€ΠΆΠ΅ ΠΊΠ°Ρ‚ΠΎ администраторски ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π». Никога Π½Π΅ ΠΈΠ·Π»Π°Π³Π°ΠΉΡ‚Π΅ конзолния ΠΏΠΎΡ€Ρ‚ навън - ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π³ΠΎ оставСтС ΠΊΠ°Ρ‚ΠΎ Π³Π½Π΅Π·Π΄ΠΎ Π·Π° ΠΌΠΎΠ΄ΡƒΠ». Π’ΠΎΠ³Π°Π²Π° само Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄Π° ΠΏΠΈΡˆΠ°Ρ‚ Π² сокСта, Ρ‰Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‚ с Tarantula.

Π’ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π·Π° административни Π½Π΅Ρ‰Π°. Π—Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ втория ΠΌΠ΅Ρ‚ΠΎΠ΄ - двоичния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».

2. ИзползванС Π½Π° Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΏΠΎΡ€Ρ‚

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π·Π° ΡΠ»ΡƒΡˆΠ°Π½Π΅, която отваря ΠΏΠΎΡ€Ρ‚ Π·Π° външни ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π’ΠΎΠ·ΠΈ ΠΏΠΎΡ€Ρ‚ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° с двоичния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ Ρ‚Π°ΠΌ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ удостовСряванСто.

Π—Π° Ρ‚Π°Π·ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° tarantoolctl Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ с Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠΎΡ€Ρ‚. Използвайки Π³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‚Π΅ с ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ удостовСряванС ΠΈ Π΄Π° Π΄Π°Π²Π°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€Π°Π²Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ.

ΠœΠΎΠ΄ΡƒΠ» Π·Π° запис Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ кутия

Въй ΠΊΠ°Ρ‚ΠΎ Tarantool Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° прилоТСния, Ρ‚ΠΎΠΉ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ²Π°ΠΌΠ΅ сС ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π° box - Ρ‚ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½ΠΈ. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π΅Ρ‰ΠΎ Π² кутия, Tarantool записва Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° диска, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π³ΠΈ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ с тях.

Π Π΅ΠΊΠΎΡ€Π΄

НапримСр, Π²Π»ΠΈΠ·Π°ΠΌΠ΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π° box ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ функцията box.once. Π’ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈ Tarantool Π΄Π° изпълни нашия ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ сС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°. НиС създавамС пространство, Π² ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ.

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')
    box.schema.user.grant('guest', 'read,write,execute', 'universe')

    -- Keep things safe by default
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° създавамС ΠΏΡŠΡ€Π²ΠΈΡ‡Π΅Π½ индСкс - ΠΏΡŠΡ€Π²ΠΈΡ‡Π΅Π½ - ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΠΌ Π΄Π°Π½Π½ΠΈ. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π°ΠΊΠΎ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ във всСки запис Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡŠΡ€Π²ΠΈΡ‡Π΅Π½ индСкс.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΏΡ€Π°Π²ΠΈΠΌ Π³Ρ€Π°Π½Ρ‚ Π½Π° потрСбитСля гост, ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Ρ‡Ρ€Π΅Π· двоичния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°ΠΌΠ΅ Ρ‡Π΅Ρ‚Π΅Π½Π΅, писанС ΠΈ изпълнСниС Π² цСлия СкзСмпляр.

Π’ сравнСниС с ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Ρ‚ΡƒΠΊ всичко Π΅ доста просто. ИмамС пространство – област, Π² която Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ просто сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚. ВсСки запис сС Π½Π°Ρ€ΠΈΡ‡Π° ΠΊΠΎΡ€Ρ‚Π΅ΠΆ. Π’ΠΎΠΉ Π΅ ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½ Π² MessagePack. Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΡ‚ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ - Ρ‚ΠΎΠΉ Π΅ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΈ Π·Π°Π΅ΠΌΠ° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ място - 18 Π±Π°ΠΉΡ‚Π° срСщу 27.

Π’ Tarantool ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСр Π±ΡŠΡ€Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с тях. Π•Ρ‚ΠΎ ΠΊΠΎΠ»ΠΊΠΎ лСсно сС ΠΏΡ€Π°Π²ΠΈ

Π‘ Π½Π΅Π³ΠΎ Π΅ доста ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ. ΠŸΠΎΡ‡Ρ‚ΠΈ всСки Ρ€Π΅Π΄, всСки запис Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° напълно Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.

МоТСм Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ всички пространства с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Box.space. Π—Π° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ СкзСмпляр, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ box.space example ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Ρ‚Π΅ пълна информация Π·Π° Π½Π΅Π³ΠΎ.

Tarantool ΠΈΠΌΠ° Π΄Π²Π° Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ двигатСля: Memory ΠΈ Vinyl. ΠŸΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° всички Π΄Π°Π½Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ просто ΠΈ Π±ΡŠΡ€Π·ΠΎ. Π”Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΈΠ·Ρ…Π²ΡŠΡ€Π»ΡΡ‚ Π½Π° диска ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΈΠΌΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° запис Π½Π°ΠΏΡ€Π΅Π΄ Π² ΠΆΡƒΡ€Π½Π°Π»Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ няма Π΄Π° Π·Π°Π³ΡƒΠ±ΠΈΠΌ Π½ΠΈΡ‰ΠΎ, Π°ΠΊΠΎ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ сС сринС.

Vinyl ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π½Π° диска Π² ΠΏΠΎ-ΠΏΠΎΠ·Π½Π°Ρ‚Π° Π·Π° нас Ρ„ΠΎΡ€ΠΌΠ° - тоСст ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠ°ΠΌΠ΅Ρ‚, ΠΈ Tarantula Ρ‰Π΅ Π³ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ ΠΎΡ‚ диска.

ЗасСга Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Memory.

unix/:/var/run/tarantool/example.control> box.space.example
---
- engine: memtx
  before_replace: 'function: 0x41eb02c8'
  on_replace: 'function: 0x41eb0568'
  ck_constraint: []
  field_count: 0
  temporary: false
  index:
    0: &0
      unique: true
      parts:
      - type: unsigned
        is_nullable: false
        fieldno: 1
      id: 0
      space_id: 512
      type: TREE
      name: primary
    primary: *0
  is_local: false
  enabled: true
  name: example
  id: 512
...

unix/:/var/run/tarantool/example.control>

индСкс:

Π—Π° всяко пространство трябва Π΄Π° сС създадС ΠΏΡŠΡ€Π²ΠΈΡ‡Π΅Π½ индСкс, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π±Π΅Π· Π½Π΅Π³ΠΎ Π½ΠΈΡ‰ΠΎ няма Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. ΠšΠ°ΠΊΡ‚ΠΎ във всяка Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, създавамС ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ – ID Π½Π° записа.

Части:

Π’ΡƒΠΊ посочвамС ΠΎΡ‚ ΠΊΠ°ΠΊΠ²ΠΎ сС ΡΡŠΡΡ‚ΠΎΠΈ Π½Π°ΡˆΠΈΡΡ‚ индСкс. Π‘ΡŠΡΡ‚ΠΎΠΈ сС ΠΎΡ‚ Π΅Π΄Π½Π° част - ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΅ ΠΎΡ‚ Ρ‚ΠΈΠΏ unsigned - цяло ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΎ число. Π”ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ си спомням ΠΎΡ‚ докумСнтацията, максималният Π±Ρ€ΠΎΠΉ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС, Π΅ 18 ΠΊΠ²ΠΈΠ½Ρ‚ΠΈΠ»ΠΈΠΎΠ½Π°. Π’ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° вмъкнСм Π΄Π°Π½Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° вмъкванС.

unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...

unix/:/var/run/tarantool/example.control>

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈΡ‡Π΅Π½ ΠΊΠ»ΡŽΡ‡, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ трябва Π΄Π° Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ. НС смС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ ΠΎΡ‚ броя Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° вмъкнСм Ρ‚Π°ΠΌ ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌ Π΄Π°Π½Π½ΠΈ. Π’Π΅ са посочСни във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° MessagePack, ΠΊΠΎΠΉΡ‚ΠΎ описах ΠΏΠΎ-Π³ΠΎΡ€Π΅.

ИзвСТданС на данни

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π°Π½Π½ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° select.

Box.example.select с клавиша {1} Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ТСлания запис. Ако Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π°, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ всички записи, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅. Всички Ρ‚Π΅ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π°Ρ‚ ΠΏΠΎ броя Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅, Π½ΠΎ Ρ‚ΡƒΠΊ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ няма понятиС Π·Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ - ΠΈΠΌΠ° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΠ»Π΅Ρ‚Π°.

МоТС Π΄Π° ΠΈΠΌΠ° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всякакво количСство Π΄Π°Π½Π½ΠΈ. И Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ трябва Π΄Π° Π³ΠΈ Ρ‚ΡŠΡ€ΡΠΈΠΌ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, създавамС Π½ΠΎΠ² Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π΅Π½ индСкс.


box.space.example:create_index( β€˜secondary’, { type = β€˜TREE’, unique = false, parts = {{field = 2, type =’string’} }}) 

ИзползвамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Create_index.
НСка Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π΅Π½.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° посочитС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅. Π’ΠΈΠΏΡŠΡ‚ индСкс Π΅ Π”ΠͺΠ Π’Πž. МоТС Π΄Π° Π½Π΅ Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, Π·Π°Ρ‚ΠΎΠ²Π° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ Unique = false.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° посочвамС ΠΎΡ‚ ΠΊΠ°ΠΊΠ²ΠΈ части сС ΡΡŠΡΡ‚ΠΎΠΈ Π½Π°ΡˆΠΈΡΡ‚ индСкс. Field Π΅ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ, към ΠΊΠΎΠ΅Ρ‚ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ индСкса, ΠΈ опрСдСлямС Ρ‚ΠΈΠΏΠ° Π½Π° Π½ΠΈΠ·Π°. И Ρ‚Π°ΠΊΠ° бСшС създадСно.

unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unique: false
  parts:
  - type: string
    is_nullable: false
    fieldno: 2
  id: 1
  space_id: 512
  type: TREE
  name: secondary
...

unix/:/var/run/tarantool/example.control>

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ:

unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...

Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅

Ако рСстартирамС СкзСмпляра ΠΈ ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Π΅ Π³ΠΈ няма - всичко Π΅ ΠΏΡ€Π°Π·Π½ΠΎ. Π’ΠΎΠ²Π° сС случва, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Tarantool ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ записва Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° диска, Π½ΠΎ Π°ΠΊΠΎ спрСм Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ Π΄ΠΎ слСдващото записванС, Ρ‰Π΅ Π·Π°Π³ΡƒΠ±ΠΈΠΌ всички ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‰Π΅ сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ ΠΎΡ‚ послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, която Π΅ Π±ΠΈΠ»Π° Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄ΠΈ Π΄Π²Π° часа.

Няма Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΄Π° записватС всяка сСкунда, Π·Π°Ρ‰ΠΎΡ‚ΠΎ постоянното ΠΈΠ·Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° 20 GB Π½Π° диска Π½Π΅ Π΅ Π΄ΠΎΠ±Ρ€Π° идСя.

Π—Π° Ρ‚Π°Π·ΠΈ Ρ†Π΅Π» бСшС ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π° ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½Π° концСпцията Π·Π° Π΄Π½Π΅Π²Π½ΠΈΠΊ Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ записванС. Π‘ Π½Π΅Π³ΠΎΠ²Π° ΠΏΠΎΠΌΠΎΡ‰ Π·Π° всяка промяна Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС създава запис Π² малък Π»ΠΎΠ³ Ρ„Π°ΠΉΠ» Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ записванС.

ВсСки запис Π΄ΠΎ КПП-Ρ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² тях. Π—Π° Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 64 MB. ΠšΠΎΠ³Π°Ρ‚ΠΎ сС напълни, Π·Π°ΠΏΠΈΡΡŠΡ‚ Π·Π°ΠΏΠΎΡ‡Π²Π° към втория Ρ„Π°ΠΉΠ». И слСд рСстартиранСто Tarantool сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° ΠΎΡ‚ послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ слСд Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€ΡŠΡ‰Π° всички слСдващи Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ спрС.

Π’ Tarantool ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСр Π±ΡŠΡ€Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с тях. Π•Ρ‚ΠΎ ΠΊΠΎΠ»ΠΊΠΎ лСсно сС ΠΏΡ€Π°Π²ΠΈ

Π—Π° Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ Ρ‚Π°ΠΊΡŠΠ² запис, трябва Π΄Π° посочитС опцията Π² настройкитС Π½Π° box.cfg (във Ρ„Π°ΠΉΠ»Π° example.lua):

wal_mode = β€œwrite”;

ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ

Π‘ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ написахмС сСга, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Tarantula Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ тя Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡŠΡ€Π·ΠΎ ΠΊΠ°Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. И сСга Ρ‡Π΅Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π½Π° Ρ‚ΠΎΡ€Ρ‚Π°Ρ‚Π° Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ с всичко Ρ‚ΠΎΠ²Π°.

ПисанС на молба

НапримСр, Π½Π΅ΠΊΠ° напишСм слСдното ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Tarantula

Π’ΠΈΠΆΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎΠ΄ спойлСра

box.cfg {
    listen = '0.0.0.0:3301';
    io_collect_interval = nil;
    readahead = 16320;
    memtx_memory = 128 * 1024 * 1024; -- 128Mb
    memtx_min_tuple_size = 16;
    memtx_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_memory = 128 * 1024 * 1024; -- 128Mb
    vinyl_cache = 128 * 1024 * 1024; -- 128Mb
    vinyl_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_write_threads = 2;
    wal_mode = "write";
    wal_max_size = 256 * 1024 * 1024;
    checkpoint_interval = 60 * 60; -- one hour
    checkpoint_count = 6;
    force_recovery = true;
    log_level = 5;
    log_nonblock = false;
    too_long_threshold = 0.5;
    read_only   = false
}

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')

    box.schema.user.create('example', { password = 'secret' })
    box.schema.user.grant('example', 'read,write,execute', 'space', 'example')

    box.schema.user.create('repl', { password = 'replication' })
    box.schema.user.grant('repl', 'replication')
end

-- for first run create a space and add set up grants
box.once('replica', bootstrap)

-- enabling console access
console = require('console')
console.listen('127.0.0.1:3302')

-- http config
local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

local router = http_router.new()

local function get_count()
 local cnt = box.space.example:len()
 return cnt
end

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

router:route({method = 'GET', path = '/token'}, function()
    local token = randomString(32)
    local last = box.space.example:len()
    box.space.example:insert{ last + 1, token }
    return {status = 200, body = json.encode({token = token})}
end)

prometheus = require('prometheus')

fiber = require('fiber')
tokens_count = prometheus.gauge("tarantool_tokens_count",
                              "API Tokens Count")

function monitor_tokens_count()
  while true do
    tokens_count:set(get_count())
    fiber.sleep(5)
  end
end
fiber.create(monitor_tokens_count)

router:route( { method = 'GET', path = '/metrics' }, prometheus.collect_http)

httpd:set_router(router)
httpd:start()

НиС Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ някаква Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² lua, която Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° Π·Π½Π°Ρ†ΠΈΡ‚Π΅. Π’Π°Π·ΠΈ ΠΏΠ»ΠΎΡ‡Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° случаСн Π½ΠΈΠ·.

local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ функцията - randomString ΠΈ Π΄Π°Π²Π°ΠΌΠ΅ стойността Π½Π° Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π² скоби.

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ http Ρ€ΡƒΡ‚Π΅Ρ€Π° ΠΈ http ΡΡŠΡ€Π²ΡŠΡ€Π° към нашия Tarantula ΡΡŠΡ€Π²ΡŠΡ€, JSON, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠΌ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ Π½Π° ΠΏΠΎΡ€Ρ‚ 8080 Π½Π° всички http ΡΡŠΡ€Π²ΡŠΡ€Π½ΠΈ интСрфСйси, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ рСгистрират всички заявки ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ.

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ route, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π°ΠΊΠΎ заявка с ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GET пристигнС Π½Π° ΠΏΠΎΡ€Ρ‚ 8080 /count, Ρ‚ΠΎΠ³Π°Π²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ функцията ΠΎΡ‚ Π΅Π΄ΠΈΠ½ Ρ€Π΅Π΄. Π’Ρ€ΡŠΡ‰Π° статус - 200, 404, 403 ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³, ΠΊΠΎΠΉΡ‚ΠΎ посочим.

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

Π’ тялото Π²Ρ€ΡŠΡ‰Π°ΠΌΠ΅ json.encode, Π² Π½Π΅Π³ΠΎ посочвамС count ΠΈ getcount, ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° броя Π½Π° записитС Π² Π½Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.

Вторият ΠΌΠ΅Ρ‚ΠΎΠ΄

router:route({method = 'GET', path = '/token'}, function() 
    local token = randomString(32) 
    local last = box.space.example:len() 
    box.space.example:insert{ last + 1, token } 
    return {status = 200, body = json.encode({token = token})}
end)

КъдС Π² Ρ€Π΅Π΄Π° router:route({method = 'GET', path = '/token'}, function() ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ функцията ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½.

Ρ€Π΅Π΄ Π»ΠΎΠΊΠ°Π»Π΅Π½ Ρ‚ΠΎΠΊΠ΅Π½ = randomString(32) Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π½ΠΈΠ· ΠΎΡ‚ 32 Π·Π½Π°ΠΊΠ°.
Π’ Ρ€Π΅Π΄ΠΈΡ†Π° local last = box.space.example:len() ΠΈΠ·Π²Π°ΠΆΠ΄Π°ΠΌΠ΅ послСдния Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚.
И Π² линията box.space.example:insert{ last + 1, token } записвамС Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² Π½Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, тоСст просто ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°ΠΌΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° с 1. Π’ΠΎΠ²Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° станС Π½Π΅ само ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Ρ‚Ρ€ΠΎΠΌΠ°Π² Π½Π°Ρ‡ΠΈΠ½. Има послСдоватСлности Π·Π° Ρ‚ΠΎΠ²Π° Π² Tarantula.

ПишСм Ρ‚ΠΎΠΊΠ΅Π½Π° Ρ‚Π°ΠΌ.

Π’Π°ΠΊΠ° написахмС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ». ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Ρ‚Π°ΠΌ, Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ Π½Π° кутията Ρ‰Π΅ ΡΠ²ΡŠΡ€ΡˆΠΈ цялата ΠΌΡ€ΡŠΡΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π° вмСсто вас.

Π‘Π»ΡƒΡˆΠ° http ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π΄Π°Π½Π½ΠΈ, всичко Π΅ Π² Π΅Π΄Π½Π° инстанция - ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΈ Π΄Π°Π½Π½ΠΈΡ‚Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ всичко сС случва доста Π±ΡŠΡ€Π·ΠΎ.

Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ инсталирамС http ΠΌΠΎΠ΄ΡƒΠ»Π°:

Как ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, Π²ΠΈΠΆΡ‚Π΅ ΠΏΠΎΠ΄ спойлСра

root@test2:/# tarantoolctl rocks install http
Installing http://rocks.tarantool.org/http-scm-1.src.rock
Missing dependencies for http scm-1:
   checks >= 3.0.1 (not installed)

http scm-1 depends on checks >= 3.0.1 (not installed)
Installing http://rocks.tarantool.org/checks-3.0.1-1.rockspec

Cloning into 'checks'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 28 (delta 1), reused 16 (delta 1), pack-reused 0
Receiving objects: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Note: checking out '580388773ef11085015b5a06fe52d61acf16b201'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

No existing manifest. Attempting to rebuild...
checks 3.0.1-1 is now installed in /.rocks (license: BSD)

-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found TARANTOOL: /usr/include (found version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR is /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR is /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    version


-- Build files have been written to: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Scanning dependencies of target httpd
[ 50%] Building C object http/CMakeFiles/httpd.dir/lib.c.o
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: In function β€˜tpl_term’:
/usr/include/tarantool/lauxlib.h:144:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
    (*(B)->p++ = (char)(c)))
    ~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: note: in expansion of macro β€˜luaL_addchar’
       luaL_addchar(b, '\');
       ^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: note: here
      default:
      ^~~~~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: In function β€˜tpe_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
    type = TPE_TEXT;
    ~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: note: here
   case TPE_LINECODE:
   ^~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: In function β€˜httpfast_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 code = 0;
                 ~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: note: here
             case status:
             ^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 state = message;
                 ~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: note: here
             case message:
             ^~~~
[100%] Linking C shared library lib.so
[100%] Built target httpd
[100%] Built target httpd
Install the project...
-- Install configuration: "Debug"
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

ИмамС Π½ΡƒΠΆΠ΄Π° ΠΈ ΠΎΡ‚ ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Π΅ΠΉ, Π·Π° Π΄Π° бягамС:

root@test2:/# tarantoolctl rocks install prometheus
Installing http://rocks.tarantool.org/prometheus-scm-1.rockspec

Cloning into 'prometheus'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 2), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (19/19), 10.73 KiB | 10.73 MiB/s, done.
Resolving deltas: 100% (2/2), done.
prometheus scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Content-length: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"count":2}root@test2:/#

/count Π½ΠΈ Π΄Π°Π²Π° статус 200.
/token ΠΈΠ·Π΄Π°Π²Π° Ρ‚ΠΎΠΊΠ΅Π½ ΠΈ записва Ρ‚ΠΎΠ·ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

Бкорост Π½Π° тСстванС

НСка Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π·Π° 50 000 заявки. Π©Π΅ ΠΈΠΌΠ° 500 ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€Π°Ρ‰ΠΈ сС заявки.

root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Tarantool
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /token
Document Length:        44 bytes

Concurrency Level:      500
Time taken for tests:   14.578 seconds
Complete requests:      50000
Failed requests:        0
Total transferred:      7950000 bytes
HTML transferred:       2200000 bytes
Requests per second:    3429.87 [#/sec] (mean)
Time per request:       145.778 [ms] (mean)
Time per request:       0.292 [ms] (mean, across all concurrent requests)
Transfer rate:          532.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   10 103.2      0    3048
Processing:    12   69 685.1     15   13538
Waiting:       12   69 685.1     15   13538
Total:         12   78 768.2     15   14573

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     15
  75%     16
  80%     16
  90%     16
  95%     16
  98%     21
  99%     42
 100%  14573 (longest request)
root@test2:/#

Π˜Π·Π΄Π°Π²Π°Ρ‚ сС Ρ‚ΠΎΠΊΠ΅Π½ΠΈ. И Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΎ записвамС Π΄Π°Π½Π½ΠΈ. 99% ΠΎΡ‚ заявкитС са ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ Π·Π° 42 милисСкунди. Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 3500 заявки Π² сСкунда Π½Π° ΠΌΠ°Π»ΠΊΠ° машина с 2 ядра ΠΈ 4 Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ някои 50000 XNUMX Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ стойността ΠΈΠΌ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π½Π΅ само http, Π½ΠΎ ΠΈ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ Ρ„ΠΎΠ½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ Π²Π°ΡˆΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ. ОсвСн Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ задСйствания. НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π½Π΅Ρ‰ΠΎ - Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ скриптови прилоТСния Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² самия ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π½Π΅ стС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ ΠΎΡ‚ Π½ΠΈΡ‰ΠΎ, Π΄Π° ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‚Π΅ всякакви ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅ всякаква Π»ΠΎΠ³ΠΈΠΊΠ°.

Π‘ΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π½Π° прилоТСния ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ външни ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π΄Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ добавя към своята Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Π”Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ‚Π°Π·ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ прилоТСния.

Tarantula Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π° сама ΠΈ няма Π΄Π° сС Π½Π°Π»Π°Π³Π° Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ΠΎΠ²Π° Π΅ само ΠΏΡŠΡ€Π²Π°Ρ‚Π° част ΠΎΡ‚ Π΅Π΄Π½Π° голяма Ρ€Π°Π±ΠΎΡ‚Π°. Вторият Ρ‰Π΅ бъдС ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ съвсСм скоро Π² Π±Π»ΠΎΠ³Π° Π½Π° Mail.ru Group ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²Ρ€ΡŠΠ·ΠΊΠ° към Π½Π΅Π³ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π».

Ако проявяватС интСрСс Π΄Π° ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π°Ρ‚Π΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π΅Π·ΠΈ Π½Π΅Ρ‰Π° ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈ Π΄Π° Π·Π°Π΄Π°Π²Π°Ρ‚Π΅ Π²ΡŠΠΏΡ€ΠΎΡΠΈ Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π΅Ρ‚Π΅ сС ΠΊΠ°Π½Π°Π» DevOps ΠΎΡ‚ REBRAIN.

Ако трябва Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към ΠΎΠ±Π»Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ Π²ΡŠΠΏΡ€ΠΎΡΠΈ относно Π²Π°ΡˆΠ°Ρ‚Π° инфраструктура, Π½Π΅ сС ΠΊΠΎΠ»Π΅Π±Π°ΠΉΡ‚Π΅ Π΄Π° оставитС заявка.

PS ИмамС 2 Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΈ ΠΎΠ΄ΠΈΡ‚Π° Π½Π° мСсСц, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π²Π°ΡˆΠΈΡΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‰Π΅ бъдС Π΅Π΄ΠΈΠ½ ΠΎΡ‚ тях.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€