Viis aastat tagasi proovisin ma Tarantooliga töötada, kuid siis ei olnud see mulle sobiv. Hiljuti aga viisin lĂ€bi veebiseminari, kus rÀÀkisin Hadoopist ja selle MapReduce'i toimimisest. Seal kĂŒsiti minult kĂŒsimus â "Miks mitte kasutada selle ĂŒlesande jaoks Tarantooli?".
Huvi pĂ€rast otsustasin selle juurde tagasi pöörduda, testisin viimast versiooni â ja seekord meeldis projekt mulle vĂ€ga. Praegu nĂ€itan, kuidas kirjutada Tarantoolis lihtne rakendus, koormata seda ja kontrollida jĂ”udlust ning nĂ€ete, kui lihtne ja Ă€ge see kĂ”ik on.

Mis on Tarantool
Tarantool positsioneerib end ĂŒlikiire andmebaasina. Sinna saab sisestada igasuguseid andmeid, mida soovite. Lisaks saab neid replikeerida, sharding'ida â st jagada tohutut hulka andmeid mitmele serverile ja ĂŒhendada nende tulemused â teha talitlushĂ€irete kindlaid seoseid tĂŒĂŒpi "master-master".
Teiseks on see rakendusserver. Te saate kirjutada seal oma rakendusi, töötada andmetega, nÀiteks kustutada taustal vanu kirjeid vastavalt teatud reeglitele. VÔite kirjutada otse Tarantoolis HTTP-serveri, mis töötab andmetega: edastab nende arvu, salvestab sinna uusi andmeid ja redutseerib seda kÔike masterile.
Lugesin artiklit, kuidas pojad tegid 300 rea pikkuse sĂ”numijĂ€rje, mis lihtsalt tormab ja rebib â nende minimaalne jĂ”udlus on 20 000 sĂ”numit sekundis. Siin saab tĂ”eliselt avarduda ja kirjutada vĂ€ga suure rakenduse, ja need ei ole Postgresi sarnased salvestused.
Umbes sellist serverit, ainult lihtsat, pĂŒĂŒan ma selles artiklis kirjeldada.
Paigaldamine
Testimiseks lĂ”in kolm standardset virtuaalmasinat â kĂ”vaketas 20 gigabaiti, Ubuntu 18.04. 2 virtuaalset CPU-d ja 4 gigabaiti mĂ€lu.
Me paigaldame Tarantooli â kĂ€ivitame shelli skripti vĂ”i lisame hoidla ja teeme apt get install Tarantool. Link skripti jaoks â (curl -L | VER=2.4 sudo -E bash). Meil on nĂŒĂŒd sellised kĂ€sklused nagu:
tarantoolctl â peamine kĂ€sk Tarantooli instantside haldamiseks.
/etc/tarantool â siin on kogu konfiguratsioon.
var/log/tarantool â siin on logid.
var/lib/tarantool â siin on andmed, ja need on edaspidi jagatud instantside vahel.
On leiad kaustad instance-available ja instance-enabled â neis asub see, mis kĂ€ivitub â instantsi konfiguratsioonifail, kus on kirjas, millistel portidel ta kuulab, kui palju mĂ€lu tal on, Vinyli mootori seadistused, kood, mis kĂ€ivitub serveri kĂ€ivitamisel, sharding, jĂ€rjekorrad, aegunud andmete eemaldamine ja nii edasi.
Instantsid töötavad nagu PostgreS. NĂ€iteks soovite kĂ€ivitada mitu koopiat andmebaasist, mis on erinevatel portidel. Nii saab ĂŒhel serveril töötada mitu andmebaasi instantsi, mis on erinevatel portidel. Neil vĂ”ivad olla tĂ€iesti erinevad seadistused â ĂŒks instants rakendab ĂŒhte loogikat, teine â teist.
Instantside haldamine
Meil on kĂ€sk tarantoolctl, mis vĂ”imaldab hallata Tarantuule instantsid. NĂ€iteks, tarantoolctl check example kontrollib konfiguratsioonifaili ja ĂŒtleb â fail on ok, kui seal ei ole sĂŒntaktilisi vigu.
Saate vaadata instantsi staatust â tarantoolctl status example. Samamoodi saab teha start, stop, restart.
Kui instants on kĂ€ivitunud, saab sellele ĂŒhenduda kahel viisil.
1. Halduse konsool
Vaikimisi avab Tarantool sokli, kuhu edastatakse tavaline ASCII-tekst Tarantuuli haldamiseks. Ăhendus konsooliga toimub alati kasutaja admin all, seal ei ole autentimist, seetĂ”ttu ei pea konsooli porti Tarantuuli haldamiseks vĂ€lja viima.
Selle viisi jaoks tuleb sisestada Tarantoolctl enter instance name. KĂ€sk kĂ€ivitab konsooli ja ĂŒhendub kasutaja admin all. Ărge kunagi avage konsooli porti vĂ€lismaailmale â parem jĂ€tke see unit-soketiks. Siis saab Tarantuulile ĂŒhenduda ainult neil, kellel on sukeldus soketisse.
See viis on vajalik haldusĂŒlesannete jaoks. Andmete töötlemiseks kasutage teist viisi â binaarprotokolli.
2. Binaarprotokolli kasutamine kindla portaali jaoks ĂŒhendumiseks
Konfiguratsioonis on direktiiv listen, mis avab portaali vĂ€listeks suheldamiseks. Seda portaali kasutatakse binaarprotokolliga ja seal on sisse lĂŒlitatud autentimine.
Selle ĂŒhenduse jaoks kasutatakse tarantoolctl connect to port number. Selle abil saab ĂŒhenduda kaugserveritega, kasutada autentimist ja anda erinevaid juurdepÀÀsuĂ”igusi.
Andmete salvestamine ja Box moodul
Kuna Tarantool on nii andmebaas kui ka rakenduste server, on seal erinevad moodulid. Meid huvitab moodul box â see teostab andmetega töötamise. Kui kirjutate midagi box'i, salvestab Tarantool andmed kettale, hoiab neid mĂ€lus vĂ”i teeb nendega midagi muud.
Kirjutamine
NÀiteks siseneme moodulisse box ja kutsume esile funktsiooni box.once. See paneb Tarantooli kÀivitama meie koodi serveri initsialiseerimisel. Loome space'i, kus meie andmed salvestatakse.
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.grant('guest', 'read,write,execute', 'universe')
-- Hoidke asju vaikimisi turvaliselt
-- box.schema.user.create('example', { password = 'secret' })
-- box.schema.user.grant('example', 'replication')
-- box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
endPĂ€rast seda loome esmase indeksi â primary â mille abil saame andmeid otsida. Vaikimisi, kui mingeid parameetreid ei mÀÀra, kasutatakse iga kirje esimest vĂ€li primaarindeksi jaoks.
SeejĂ€rel teeme kĂŒlalisele guest Ă”iguste andmise, millega me ĂŒhenduse loome binaarprotokolli kaudu. Lubame lugeda, kirjutada ja tĂ€ita kĂ”ikjal instantsis.
Kui vĂ”rrelda tavapĂ€raste andmebaasidega, siis siin on kĂ”ik ĂŒsna lihtne. Meil on space â ala, kus meie andmed lihtsalt asuvad. Iga kirje nimetatakse tupikuks. See pakitakse MessagePack formaati. See on vĂ€ga lahe formaat â see on binaarne ja vĂ”tab vĂ€hem ruumi â 18 baiti versus 27.

Seda on ĂŒsna mugav kasutada. Peaaegu iga rida, iga andmekirje vĂ”ib omada tĂ€iesti erinevaid veerge.
Saame vaadata kÔiki space'e kÀsu Box.space abil. Konkreetse instantsi eristamiseks kirjutame box.space example ja saame selle kohta tÀieliku teabe.
Tarantoolis on sisse ehitatud kaks tĂŒĂŒpi jĂ”u- ja andmebaasi mootoreid: Memory ja Vinyl. Memory salvestab kĂ”ik andmed mĂ€llu. SeetĂ”ttu töötab kĂ”ik lihtsalt ja kiiresti. Andmed kirjutatakse kettale, samuti on olemas write ahead log mehhanism, mistĂ”ttu me ei kaota midagi serveri krahhi korral.
Vinyl salvestab andmed kettale tuttavamal kujul â see tĂ€hendab, et saame salvestada rohkem andmeid, kui meil on mĂ€lu, ja Tarantool loeb neid kettalt.
Praegu hakkame kasutama 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>Indeks:
Esimene indeks tuleb luua igas ruumis, sest ilma selleta ei tööta miski. Nagu igas andmebaasis, loome me esimese vÀlja - kirje ID.
Osad:
Siin nĂ€itame, millest meie indeks koosneb. See koosneb ĂŒhest osast - esimesest vĂ€ljast, mida me kasutame, tĂŒĂŒp unsigned - positiivne tĂ€isarv. Kui ma Ă”igesti mĂ€letan dokumentatsioonist, siis on maksimaalne arv 18 kvadrillionit. Ăksjagu palju.
Edasi saame andmeid sisestada kÀsuga insert.
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>Esimene vÀli kasutatakse primaarse vÔtmena, seega peab see olema ainulaadne. Me ei ole piiratud veergude arvuga, seega saame sinna sisestada nii palju andmeid kui soovime. Need on esitatud MessagePack formaadis, millest ma eespool rÀÀkisin.
Andmete vÀljastamine
Edasi saame andmeid vÀljastada kÀsuga select.
Box.example.select, kus on vÔti {1}, vÀljastab vajaliku kirje. Kui jÀtame vÔtme vahele, siis nÀeme kÔiki meie olemasolevaid kirjeid. Need erinevad veergude arvu poolest, kuid siin pole pÔhimÔtteliselt veergude mÔistet - on vÀlja numbrid.
Andmeid vÔib olla absoluutselt kuidas palju. Ja nÀiteks, kui peame neid otsima teise vÀlja jÀrgi. Selleks loome uue teise indeksi.
box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type ='string'}}}) Kasutame kÀsku Create_index.
Anname sellele nimeks Secondary.
PĂ€rast seda tuleb nĂ€idata parameetreid. Indeksi tĂŒĂŒp on TREE. See ei pruugi olla ainulaadne, seega sisestame Unique = false.
SeejĂ€rel nĂ€itame, millest meie indeks koosneb. Field - see on vĂ€lja number, millega me indeksi seome, ja nĂ€itame tĂŒĂŒbi string. Ja siin see on loodud.
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>NĂŒĂŒd saame seda kutsuda jĂ€rgmiselt:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
Salvestamine
Kui me instantsi taaskĂ€ivitame ja proovime andmeid uuesti kutsuda â siis nĂ€eme, et neid pole â kĂ”ik on tĂŒhi. Nii juhtub, kuna Tarantool teeb kontrollpunktid ja salvestab andmed kettale, kuid kui me peatame töö enne jĂ€rgmise salvestamise toimumist, siis kaotame kĂ”ik toimingud â sest taastume viimases kontrollpunktis, mis oli, nĂ€iteks, kaks tundi tagasi.
Iga sekundi jÀÀdvustamine ei tule ka kĂ”ne alla â sest pidev 20 GB andmete kettale kirjutamine ei ole just parim idee.
Selleks mÔeldi ja rakendati ette kirjutamise logi (write-ahead log) kontseptsioon. Selle abil luuakse iga andmete muutuse jaoks sissekanne vÀikeses ette kirjutamise logi failis.
Iga sissekanne enne kontrollpunkti salvestatakse neisse. Nende failide jaoks seadistame suuruse â nĂ€iteks 64 MB. Kui see tĂ€itub, algab kirjutamine teise faili. Ja pĂ€rast taaskĂ€ivitamist taastab Tarantool end viimastest kontrollpunktidest ja hakkab siis ĂŒles laadima kĂ”iki hilisemaid tehinguid kuni peatamiseni.

Selle kirjutamise teostamiseks tuleb box.cfg seadetes (failis example.lua) nÀidata jÀrgmist valikut:
wal_mode = âwriteâ;Andmete kasutamine
Sellega, mis me just kirjutasime, vĂ”ite kasutada Tarantooli andmete salvestamiseks, ja see töötab vĂ€ga kiiresti nagu andmebaas. Ja nĂŒĂŒd kĂ”ige tĂ€htsam - mis kĂ”ik selle kĂ”igega teha saab.
Kirjutame rakenduse
NĂ€iteks kirjutame Tarantooli jaoks sellise rakenduse
Rakendust vaadake spoileris
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()Me deklareerime Luuas teatud tabeli, mis mÀÀratleb sĂŒmbolid. Seda tabelit on vaja juhusliku stringi genereerimiseks.
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
endPĂ€rast seda deklareerime funktsiooni â randomString ja anname selle parameetriks pikkuse vÀÀrtuse.
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)]
endSeejĂ€rel ĂŒhendame http-routeri ja http-serveri meie Tarantooliserveriga, samuti JSON-i, mida edastame kliendile.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')PÀrast seda kÀivitame http serveri sadamal 8080 kÔigis liideses, mis logib kÔik pÀringud ja vead.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})SeejĂ€rel kuulutame vĂ€lja marsruudi, et kui sadamasse 8080 /count tuleb GET-pĂ€ring, siis kutsume vĂ€lja ĂŒhe rea funktsiooni. See tagastab staatuse â 200, 404, 403 vĂ”i mis tahes muu, mida me mÀÀrame.
router:route({method = 'GET', path = '\/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)Kehas tagastame json.encode, kus me mÀÀrame count ja getcount, mis kutsutakse vÀlja ja nÀitab meie andmebaasis kirjeid.
Teine meetod
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)Kus reas router:route({method = âGETâ, path = â\/tokenâ}, function() kutsume vĂ€lja funktsiooni ja genereerime tokeni.
Rida local token = randomString(32) â see on 32 tĂ€hemĂ€rgist koosnev juhuslik string.
Reas local last = box.space.example:len() saame viimase elemendi.
Ja reas box.space.example:insert{ last + 1, token } salvestame oma andmebaasi andmed, see tÀhendab lihtsalt ID suurendamist 1 vÔrra. Seda saab tegelikult teha ka mitte ainult sellise toore meetodiga. Tarantulos on selleks jÀrjestused.
Salvestame sinna tokeni.
Nii oleme ĂŒhes failis kirjutanud rakenduse. Sellega saab kohe andmetega suhelda ning moodul box teeb kogu musta töö teie eest.
See kuulab http ja töötab andmetega, kĂ”ik on ĂŒhes instantsis â nii rakendus kui andmed. SeetĂ”ttu toimub kĂ”ik piisavalt kiiresti.
KĂ€ivitusel installime http mooduli:
Kuidas me seda teeme, vaadake spoilerist
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
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:~/#Samuti vajame prometheuse kÀivitamiseks:
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 on nĂŒĂŒd installitud .rocks (license: BSD)
root@test2:/$
KÀivitame ja saame moodulitele juurde pÀÀseda
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 ĐČŃĐŽĐ°Đ”Ń ŃĐŸĐșĐ”Đœ Đž ĐŽĐ”Đ»Đ°Đ”Ń Đ·Đ°ĐżĐžŃŃ ŃŃĐŸĐłĐŸ ŃĐŸĐșĐ”ĐœĐ° ĐČ Đ±Đ°Đ·Ń.
Testime kiirus
KÀivitame 50 000 pÀringu bÀnkmargi. Konkurentsi pÀringute arv on 500.
root@test2:/$ ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3
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:/$Tokenid vÀljastatakse. Ja me salvestame pidevalt andmeid. 99% pÀringutest töötas 42 millisekundi jooksul. Seega, meil on umbes 3500 pÀringut sekundis vÀiksemas masinas, kus on 2 tuuma ja 4 gigabaiti mÀlu.
Saame ka valida mÔne 50000-tokeni ja vaadata selle vÀÀrtust.
Saame kasutada mitte ainult http-d, vaid ka kÀivitada taustfunktsioone, mis töötlevad teie andmeid. Lisaks on erinevaid kÀivitajaid. NÀiteks saate kutsuda funktsioone uuendustel, et midagi kontrollida - lahendada konflikte.
Otse serveri andmebaasis saab kirjutada rakendusskripte, ilma piiranguteta, ĂŒhendades mis tahes mooduleid ja teostades mis tahes loogikat.
Rakendusse server saab pöörduda vÀliste serverite poole, tooma andmeid ja salvestama need enda andmebaasi. Need andmed tulevad teistes rakendustes kasutusele.
Seda teeb ise Tarantool, nii et eraldi rakendust kirjutama ei pea.
KokkuvÔtteks
See on vaid esimene osa suurest tööst. Teine osa avaldatakse varsti Mail.ru Groupi blogis, ja me lisame kindlasti sellele materjalile lingi.
Kui teil on huvi osaleda ĂŒritustel, kus me internetis selliseid asju loome ja reaalajas kĂŒsimusi esitada, liituge.
Kui vajate ĂŒleminekut pilve vĂ”i teil on kĂŒsimusi oma infrastruktuuri kohta, .
P.S. Meil on iga kuu 2 tasuta auditi vÔimalust, vÔib-olla on just teie projekt nende seas.
Allikas: habr.com
