ΠΡΠ΅Π΄ΠΈ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΡ Ρ Tarantool, Π½ΠΎ ΡΠΎΠ³Π°Π²Π° Π½Π΅ ΠΌΠΈ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ. ΠΠΎ Π½Π°ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΠ²Π΅Π΄ΠΎΡ ΡΠ΅Π±ΠΈΠ½Π°Ρ, Π½Π° ΠΊΠΎΠΉΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ Π·Π° Hadoop ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ MapReduce. Π’Π°ΠΌ ΠΌΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ Π° Π²ΡΠΏΡΠΎΡ: βΠΠ°ΡΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Tarantool Π·Π° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ°?β
ΠΡ Π»ΡΠ±ΠΎΠΏΠΈΡΡΡΠ²ΠΎ ΡΠ΅ΡΠΈΡ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π° ΠΊΡΠΌ Π½Π΅Π³ΠΎ, Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ - ΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π½Π°ΠΈΡΡΠΈΠ½Π° ΠΌΠΈ Ρ Π°ΡΠ΅ΡΠ°. Π‘Π΅Π³Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Tarantool, Π΄Π° Π³ΠΎ Π·Π°ΡΠ΅Π΄ΠΈΡΠ΅ ΠΈ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΌΡ ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΊΠΎ Π»Π΅ΡΠ½ΠΎ ΠΈ Π³ΠΎΡΠΈΠ½ΠΎ Π΅ Π²ΡΠΈΡΠΊΠΎ.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Tarantool
Tarantool ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠ° ΠΊΠ°ΡΠΎ ΡΠ»ΡΡΠ°-Π±ΡΡΠ·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ°ΠΌ. ΠΠ»ΡΡ ΡΠΎΠ²Π°, ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°ΠΉΡΠ΅ Π³ΠΈ, ΡΠ°Π·Π±ΠΈΠΉΡΠ΅ - Ρ.Π΅. ΡΠ°Π·Π΄Π΅Π»Π΅ΡΠ΅ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ²ΡΡΠ° ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΡΡ - Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΈ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π³Π»Π°Π²Π΅Π½ ΠΈ Π³Π»Π°Π²Π΅Π½.
ΠΡΠΎΡΠΎ, ΡΠΎΠ²Π° Π΅ ΡΡΡΠ²ΡΡ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΡΠΈ Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ, Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° ΠΈΠ·ΡΡΠΈΠ²Π°ΡΠ΅ ΡΡΠ°ΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π²ΡΠ² ΡΠΎΠ½ΠΎΠ² ΡΠ΅ΠΆΠΈΠΌ ΡΠΏΠΎΡΠ΅Π΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Http ΡΡΡΠ²ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Tarantula, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ Π΄Π°Π½Π½ΠΈ: ΠΈΠ·Π΄Π°ΠΉΡΠ΅ ΡΡΡ Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ°ΠΌ ΠΈ Π³ΠΈ ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π΄ΠΎ Π³Π»Π°Π²Π½ΠΈΡ.
Π§Π΅ΡΠΎΡ ΡΡΠ°ΡΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΌΡΠ΅ΡΠ°ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΡ Π° ΠΎΠΏΠ°ΡΠΊΠ° ΠΎΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ 300 ΡΠ΅Π΄Π°, ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΡΡΠΊΠ° ΠΈ Π±ΡΡΠ·Π° - ΠΈΠΌΠ°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ 20 000 ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. Π’ΡΠΊ Π½Π°ΠΈΡΡΠΈΠ½Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ Π² PostgreS.
Π©Π΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° ΠΎΠΏΠΈΡΠ° Π½Π΅ΡΠΎ ΠΊΠ°ΡΠΎ ΡΠΎΠ·ΠΈ ΡΡΡΠ²ΡΡ, ΡΠ°ΠΌΠΎ ΡΠ΅ ΠΏΡΠΎΡΡΠΎ, Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ.
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡ
ΠΠ° ΡΠ΅ΡΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ - 20 GB ΡΠ²ΡΡΠ΄ Π΄ΠΈΡΠΊ, Ubuntu 18.04. 2 Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° ΠΈ 4 Π³ΠΈΠ³Π° ΠΏΠ°ΠΌΠ΅Ρ.
ΠΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Tarantool - ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ bash ΡΠΊΡΠΈΠΏΡΠ° ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ apt get ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ Tarantool. ΠΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΡΠΊΡΠΈΠΏΡ - (curl -L
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.
Π‘ Π½Π΅Π³ΠΎ Π΅ Π΄ΠΎΡΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ. ΠΠΎΡΡΠΈ Π²ΡΠ΅ΠΊΠΈ ΡΠ΅Π΄, Π²ΡΠ΅ΠΊΠΈ Π·Π°ΠΏΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° 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 ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π° ΡΠΎΡΠΊΠ° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ΅ΠΎΠ±ΡΡΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠΏΡΠ΅.
ΠΠ° Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΡΠ°ΠΊΡΠ² Π·Π°ΠΏΠΈΡ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΎΠΏΡΠΈΡΡΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° 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 ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ Π½Π΅Π³ΠΎ Π² ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π».
ΠΠΊΠΎ ΠΏΡΠΎΡΠ²ΡΠ²Π°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Π΄Π° ΠΏΡΠΈΡΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ΅Π·ΠΈ Π½Π΅ΡΠ° ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈ Π΄Π° Π·Π°Π΄Π°Π²Π°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π²ΠΊΠ»ΡΡΠ΅ΡΠ΅ ΡΠ΅
ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΎΠ±Π»Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°,
PS ΠΠΌΠ°ΠΌΠ΅ 2 Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ ΠΎΠ΄ΠΈΡΠ° Π½Π° ΠΌΠ΅ΡΠ΅Ρ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ
.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com