För fem Ă„r sedan försökte jag arbeta med Tarantool, men dĂ„ passade det mig inte. Men nyligen deltog jag i ett webbseminarium dĂ€r jag pratade om Hadoop, om hur MapReduce fungerar. DĂ€r fick jag frĂ„gan â "Varför anvĂ€nda Tarantool för den hĂ€r uppgiften?".
Av nyfikenhet bestĂ€mde jag mig för att Ă„terkomma till det, testa den senaste versionen â och den hĂ€r gĂ„ngen tyckte jag mycket om projektet. Nu ska jag visa hur man skriver en enkel applikation i Tarantool, belastar den och kontrollerar prestandan, och ni kommer att se hur enkelt och bra allt Ă€r dĂ€r.

Vad Àr Tarantool?
Tarantool positionerar sig som en super snabb databas. Du kan stoppa in vilka data som helst som du vill. Dessutom kan du replikera dem, sharda â det vill sĂ€ga fördela en enorm mĂ€ngd data över flera servrar och kombinera resultaten frĂ„n dem â göra failover-lösningar som "master-master".
För det andra Àr det en applikationsserver. Du kan skriva dina egna applikationer, arbeta med data, till exempel ta bort gamla poster i bakgrunden enligt vissa regler. Du kan skriva en HTTP-server direkt i Tarantool som kommer att arbeta med data: ge ut mÀngden, registrera nya data och reducera allt detta till en master.
Jag lĂ€ste en artikel om hur killarna gjorde en meddelandekö pĂ„ 300 rader, som helt enkelt sliter och river â de har en minimitakt pĂ„ 20 000 meddelanden per sekund. HĂ€r kan man verkligen utvecklas och skriva en mycket stor applikation, och dessa kommer inte att vara lagrades, som i PostgreS.
En ungefÀr sÄdan server, bara enklare, kommer jag att försöka beskriva i den hÀr artikeln.
Installation
För testet skapade jag tre vanliga virtuella maskiner â en hĂ„rddisk pĂ„ 20 gigabyte, Ubuntu 18.04, 2 virtuella CPU:er och 4 gigabyte minne.
Vi installerar Tarantool â kör ett skript i bash eller lĂ€gger till ett repository och gör apt get install Tarantool. LĂ€nk till skriptet â (curl -L | VER=2.4 sudo -E bash). Vi fĂ„r kommandon som:
tarantoolctl â huvudkommandot för att hantera Tarantool-instanser.
/etc/tarantool â hĂ€r ligger all konfiguration.
var/log/tarantool â hĂ€r ligger loggarna.
var/lib/tarantool â hĂ€r ligger data, och vidare Ă€r de uppdelade efter instanser.
Det finns mapparna instance-available och instance-enable â i den finns det som kommer att köras â konfigurationsfilen för instansen med lua-kod, dĂ€r det beskrivs vilka portar den lyssnar pĂ„, vilket minne som Ă€r tillgĂ€ngligt, instĂ€llningarna för motorn Vinyl, koden som körs nĂ€r servern startar, sharding, köer, borttagning av förĂ„ldrad data och sĂ„ vidare.
Instanser fungerar som i PostgreS. Till exempel, om du vill starta flera kopior av en databas som körs pĂ„ olika portar. Det innebĂ€r att flera instanser av databaser startar pĂ„ en och samma server, som körs pĂ„ olika portar. De kan ha helt olika instĂ€llningar â en instans implementerar en logik, den andra en annan.
Hantera instanser
Vi har kommandot tarantoolctl, som gör det möjligt att hantera Tarantool-instanser. Till exempel, tarantoolctl check example kontrollerar konfigurationsfilen och sĂ€ger â filen Ă€r okej, om det inte finns nĂ„gra syntaktiska fel.
Du kan se statusen för instansen â tarantoolctl status example. PĂ„ samma sĂ€tt kan du göra start, stopp, omstart.
NÀr instansen Àr igÄng kan du ansluta pÄ tvÄ sÀtt.
1. Administrationskonsol
Som standard öppnar Tarantool en socket, dÀr vanlig ASCII-text överförs för att hantera Tarantool. Anslutningen till konsolen sker alltid som anvÀndaren admin, det finns ingen autentisering, sÄ att öppna konsolporten för Ätkomst till Tarantool utanför behövs inte.
För att ansluta pĂ„ detta sĂ€tt mĂ„ste du skriva Tarantoolctl enter instance name. Kommandot startar konsolen och ansluter som anvĂ€ndaren admin. Exponera aldrig konsolporten utĂ„t â det Ă€r bĂ€ttre att lĂ€mna den som en enhetssocket. DĂ„ kan endast de som har skrivrĂ€ttighet i socketen ansluta till Tarantool.
Denna metod behövs för administrativa saker. För att arbeta med data, anvĂ€nd den andra metoden â det binĂ€ra protokollet.
2. AnvÀndning av det binÀra protokollet för att ansluta till en specifik port
I konfigurationen finns direktivet listen, som öppnar en port för externa kommunikationer. Denna port anvÀnds med det binÀra protokollet, och autentisering Àr aktiverad.
För denna anslutning anvÀnds tarantoolctl connect to port number. Med den kan du ansluta till externa servrar, anvÀnda autentisering och tilldela olika behörigheter.
Skrivning av data och modul Box
Eftersom Tarantool bĂ„de Ă€r en databas och en applikationsserver finns det olika moduler i den. Vi Ă€r intresserade av box-modulen â den hanterar data. NĂ€r du skriver nĂ„got i box, skriver Tarantool data till disk, sparar dem i minnet eller gör nĂ„got annat med dem.
Skriv
Till exempel gÄr vi in i box-modulen och anropar funktionen box.once. Den fÄr Tarantool att köra vÄr kod vid serverinitiering. Vi skapar en space dÀr vÄra data kommer att lagras.
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.grant('guest', 'read,write,execute', 'universe')
-- HÄll allt sÀkert som standard
-- box.schema.user.create('example', { password = 'secret' })
-- box.schema.user.grant('example', 'replication')
-- box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
endDĂ€refter skapar vi ett primĂ€rt index â primary â som kan anvĂ€ndas för att söka data. Som standard, om inga parametrar anges, kommer det första fĂ€ltet i varje post att anvĂ€ndas för primĂ€rindexet.
Sedan ger vi grant till anvÀndaren guest, som vi ansluter med via det binÀra protokollet. Vi tillÄter att lÀsa, skriva och köra i hela instansen.
JĂ€mfört med vanliga databaser Ă€r det hĂ€r ganska enkelt. Vi har en space â ett omrĂ„de dĂ€r vĂ„ra data lagras. Varje post kallas ett tuple. Den paketeras i MessagePack. Det Ă€r ett riktigt cool format â det Ă€r binĂ€rt och tar mindre plats â 18 byte mot 27.

Det Àr ganska bekvÀmt att arbeta med. NÀstan varje rad, varje datapost kan ha helt olika kolumner.
Vi kan se alla spaces med kommandot Box.space. För att specifikt markera en instans â skriver vi box.space example och fĂ„r fullstĂ€ndig information om den.
I Tarantool finns det tvÄ typer av motorer: Memory och Vinyl. Memory lagrar all data i minnet. SÄ allt fungerar enkelt och snabbt. Data dumpas till disk, och det finns ocksÄ en mekanism för write ahead log, sÄ vi förlorar inget vid serverkrascher.
Vinyl lagrar data pĂ„ disk pĂ„ ett mer bekant sĂ€tt â det innebĂ€r att vi kan lagra mer data Ă€n vi har minne, och Tarantool kommer att lĂ€sa dem frĂ„n disken.
Nu kommer vi att anvÀnda 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>Index:
Ett primĂ€rt index mĂ„ste skapas för varje space, eftersom ingenting kommer att fungera utan det. Precis som i varje databas skapar vi det första fĂ€ltet â ID för posten.
Parts:
HĂ€r anger vi vad vĂ„rt index bestĂ„r av. Det bestĂ„r av en del â det första fĂ€ltet som vi ska anvĂ€nda, typ unsigned â ett positivt heltal. SĂ„vitt jag minns frĂ„n dokumentationen Ă€r det maximala talet 18 kvintiljoner. En otrolig mĂ€ngd.
DÀrefter kan vi infoga data med hjÀlp av kommandot 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>Det första fÀltet anvÀnds som primÀrnyckel, sÄ det mÄste vara unikt. Antalet kolumner Àr oÀndligt, sÄ vi kan infoga hur mycket data som helst. De anges i MessagePack-format, vilket jag beskrev ovan.
Utskrift av data
DĂ€refter kan vi skriva ut data med kommandot select.
Box.example.select med nyckeln {1} kommer att skriva ut den specifika posten. Om vi hoppar över nyckeln kommer vi att se alla poster, vilka alla har olika antal kolumner, men det finns i princip inget som kallas kolumner â det handlar om fĂ€ltens nummer.
Det kan finnas hur mycket data som helst. Och till exempel, vi behöver söka dem efter det andra fÀltet. För det gör vi ett nytt sekundÀrt index.
box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type ='string'}}}) Vi anvÀnder kommandot Create_index.
Vi kallar det Secondary.
Efter det mÄste vi ange parametrarna. Typ av index Àr TREE. Det kan vara icke unikt, sÄ vi anger Unique = false.
DĂ€refter anger vi av vilka delar vĂ„rt index bestĂ„r. Field â detta Ă€r fĂ€ltets nummer som vi kopplar indexet till, och vi anger typen string. Och nu har det skapats.
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>Nu kan vi kalla det sÄ hÀr:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
Sparande
Om vi startar om instansen och försöker kalla pĂ„ datan igen â sĂ„ ser vi att den inte finns â allt Ă€r tomt. Detta hĂ€nder eftersom Tarantool gör checkpoints och sparar data pĂ„ disk, men om vi stoppar arbetet innan nĂ€rmaste lagring, förlorar vi alla operationer â eftersom vi kommer att Ă„terhĂ€mta oss frĂ„n den senaste checkpointen, som var för exempel tvĂ„ timmar sedan.
Att spara varje sekund fungerar inte heller â eftersom det att stĂ€ndigt dumpa 20 GB pĂ„ disk Ă€r en dĂ„lig idĂ©.
För detta infördes och implementerades konceptet med write-ahead log. Med hjÀlp av detta skapas en post i en liten write-ahead log-fil för varje Àndring i datan.
Varje post fram till checkpointen sparas i dessa. För dessa filer stĂ€ller vi in en storlek â till exempel 64 MB. NĂ€r den fylls, börjar posten gĂ„ till den andra filen. Och efter en omstart Ă„terhĂ€mtar sig Tarantool frĂ„n den senaste checkpointen och sedan applicerar alla senare transaktioner fram till stoppet.

För att genomföra sÄdana skrivningar mÄste du ange en instÀllning i box.cfg (i filen example.lua):
wal_mode = "write";AnvÀndning av data
Med det vi precis har skrivit kan du anvĂ€nda Tarantool för datalagring, och det kommer att fungera mycket snabbt som en databas. Och nu, den riktiga godbiten â vad du kan göra med allt detta.
Vi skriver en applikation
Till exempel skriver vi en sÄdan applikation för Tarantool
Se applikationen under spoiler
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; -- en timme
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
-- för första körningen, skapa ett utrymme och sÀtta upp behörigheter
box.once('replica', bootstrap)
-- aktivera konsolÄtkomst
console = require('console')
console.listen('127.0.0.1:3302')
-- http konfiguration
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()Vi deklarerar en tabell i lua som definierar tecken. Denna tabell behövs för att generera en slumpmÀssig strÀng.
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
endEfter detta deklarerar vi funktionen â randomString och ger vĂ€rdet av lĂ€ngden inom parentes.
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)]
endVi kopplar sedan http-router och http-server till vÄr Tarantool-server, JSON, som vi kommer att ge till klienten.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')DÀrefter startar vi en HTTP-server pÄ port 8080 pÄ alla grÀnssnitt, som kommer att logga alla förfrÄgningar och fel.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})DĂ€refter deklarerar vi en rutt som, om en GET-förfrĂ„gning kommer till port 8080 /count, anropar en funktion med en rad. Den returnerar en status â 200, 404, 403 eller vilket annat som helst vi anger.
router:route({method = 'GET', path = '\/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)I kroppen returnerar vi json.encode dÀr vi anger count och get_count, som anropas och visar antalet poster i vÄr databas.
Den andra metoden
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)DĂ€r i raden router:route({method = âGETâ, path = â\/tokenâ}, function() anropar vi en funktion och genererar en token.
StrĂ€ng local token = randomString(32) â det Ă€r en slumpmĂ€ssig strĂ€ng av 32 tecken.
I raden local last = box.space.example:len() vi hÀmtar den senaste posten.
Och i raden box.space.example:insert{ last + 1, token } skriver vi data i vÄr databas, det vill sÀga vi ökar bara ID med 1. Detta kan faktiskt göras inte bara pÄ det hÀr klumpiga sÀttet. I Tarantool finns det sekvenser för det.
Vi skriver dit token.
SÄledes har vi skrivit en applikation i en fil. Du kan omedelbart arbeta med data, och modulboxen gör det smutsiga jobbet Ät dig.
Den lyssnar pĂ„ http och arbetar med data; allt finns i en enda instans â bĂ„de applikationen och data. DĂ€rför gĂ„r allt ganska snabbt.
För att starta installerar vi http-modulen:
Hur gör vi det? Se under spoilern.
root@test2:/# tarantoolctl rocks install http
Installerar http://rocks.tarantool.org/http-scm-1.src.rock
Saknade beroenden för http scm-1:
checks >= 3.0.1 (inte installerat)
http scm-1 beror pÄ checks >= 3.0.1 (inte installerat)
Installerar http://rocks.tarantool.org/checks-3.0.1-1.rockspec
Klonar in i 'checks'...
remote: UpprÀkning av objekt: 28, klart.
remote: RĂ€kning av objekt: 100% (28/28), klart.
remote: Komprimering av objekt: 100% (19/19), klart.
remote: Totalt 28 (delta 1), ÄteranvÀnda 16 (delta 1), pack-reused 0
Mottar objekt: 100% (28/28), 12.69 KiB | 12.69 MiB/s, klart.
Löser deltan: 100% (1/1), klart.
Observera: kontrollerar ut '580388773ef11085015b5a06fe52d61acf16b201'.
Du Àr i 'detached HEAD'-lÀge. Du kan titta runt, göra experimentella
Àndringar och commita dem, och du kan kassera alla commits du gör i detta
lÀge utan att pÄverka nÄgra grenar genom att utföra en annan checkout.
Om du vill skapa en ny gren för att behÄlla commits du skapar kan du
göra det (nu eller senare) genom att anvÀnda -b med checkout-kommandot igen. Exempel:
git checkout -b
Ingen befintlig manifest. Försöker Äterbygga...
checks 3.0.1-1 Àr nu installerat i /.rocks (licens: BSD)
-- C-kompilatorns identifiering Àr GNU 7.5.0
-- Kontrollera om C-kompilatorn fungerar: /usr/bin/cc
-- Kontrollera om C-kompilatorn fungerar: /usr/bin/cc -- fungerar
-- UpptÀckande av C-kompilator ABI-info
-- UpptÀckande av C-kompilator ABI-info - klart
-- UpptÀckande av C-kompileringsfunktioner
-- UpptÀckande av C-kompileringsfunktioner - klart
-- Hittade TARANTOOL: /usr/include (hittad version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR Àr /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR Àr /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Konfigureringen Àr klar
-- Genereringen Àr klar
CMake Varning:
Manuell specificerade variabler anvÀndes inte av projektet:
version
-- Byggfiler har skrivits till: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Skannar beroenden för mÄlet httpd
[ 50%] Bygger C-objekt http/CMakeFiles/httpd.dir/lib.c.o
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: I funktionen âtpl_termâ:
/usr/include/tarantool/lauxlib.h:144:15: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
(*(B)->p++ = (char)(c)))
~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: notera: i expansion av makrot âluaL_addcharâ
luaL_addchar(b, '\');
^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: notera: hÀr
standard:
^~~~~~~
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: I funktionen âtpe_parseâ:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
type = TPE_TEXT;
~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: notera: hÀr
case TPE_LINECODE:
^~~~
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: I funktionen âhttpfast_parseâ:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
code = 0;
~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: notera: hÀr
case status:
^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
state = message;
~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: notera: hÀr
case message:
^~~~
[100%] LĂ€nkar C delbibliotek lib.so
[100%] Byggt mÄl httpd
[100%] Byggt mÄl httpd
Installera projektet...
-- Installationskonfiguration: "Debug"
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 Àr nu installerat i /.rocks (licens: BSD)
root@test2:/#För att starta behöver vi ocksÄ prometheus:
root@test2:~# tarantoolctl rocks install prometheus
Installerar http://rocks.tarantool.org/prometheus-scm-1.rockspec
Klona 'prometheus'...
remote: UpprÀkning av objekt: 19, klart.
remote: RĂ€knar objekt: 100% (19/19), klart.
remote: Komprimerar objekt: 100% (19/19), klart.
remote: Totalt 19 (delta 2), ÄteranvÀnt 5 (delta 0), pack-reanvÀnt 0
Mottar objekt: 100% (19/19), 10.73 KiB | 10.73 MiB/s, klart.
Löser deltan: 100% (2/2), klart.
prometheus scm-1 Àr nu installerat i /.rocks (licens: BSD)
root@test2:~#
Vi startar och kan fÄ tillgÄng till modulerna
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 ĐČŃĐŽĐ°Đ”Ń ŃĐŸĐșĐ”Đœ Đž ĐŽĐ”Đ»Đ°Đ”Ń Đ·Đ°ĐżĐžŃŃ ŃŃĐŸĐłĐŸ ŃĐŸĐșĐ”ĐœĐ° ĐČ Đ±Đ°Đ·Ń.
Vi testar hastigheten
LÄt oss köra ett benchmark pÄ 50 000 förfrÄgningar. Antalet samtidiga förfrÄgningar kommer att vara 500.
root@test2:~# ab -c 500 -n 50000 http://127.0.0.1:8080/token
Detta Àr ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensierad till The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (var tÄlmodig)
Fullföljde 5000 förfrÄgningar
Fullföljde 10000 förfrÄgningar
Fullföljde 15000 förfrÄgningar
Fullföljde 20000 förfrÄgningar
Fullföljde 25000 förfrÄgningar
Fullföljde 30000 förfrÄgningar
Fullföljde 35000 förfrÄgningar
Fullföljde 40000 förfrÄgningar
Fullföljde 45000 förfrÄgningar
Fullföljde 50000 förfrÄgningar
Klarade 50000 förfrÄgningar
Serverprogramvara: Tarantool
Servernamn: 127.0.0.1
Serverport: 8080
DokumentvÀg: /token
DokumentlÀngd: 44 bytes
SamtidighetsnivÄ: 500
Tid som tagits för tester: 14.578 sekunder
FullstÀndiga begÀrningar: 50000
Misslyckade begÀrningar: 0
Totalt överfört: 7950000 bytes
HTML överfört: 2200000 bytes
BegÀrningar per sekund: 3429.87 [#/sec] (medel)
Tid per begÀran: 145.778 [ms] (medel)
Tid per begÀran: 0.292 [ms] (medel, över alla samtidiga begÀrningar)
Ăverföringshastighet: 532.57 [Kbytes/sec] mottagna
Anslutningstider (ms)
min medel[+/-sd] median max
Anslut: 0 10 103.2 0 3048
Bearbetning: 12 69 685.1 15 13538
VĂ€ntade: 12 69 685.1 15 13538
Total: 12 78 768.2 15 14573
Procent av begÀrningarna som servades inom viss tid (ms)
50% 15
66% 15
75% 16
80% 16
90% 16
95% 16
98% 21
99% 42
100% 14573 (lÀngsta begÀran)
root@test2:~#Token skrivs ut. Och vi skriver hela tiden data. 99% av förfrÄgningarna hanterades pÄ 42 millisekunder. DÀrför har vi runt 3500 förfrÄgningar per sekund pÄ en liten maskin med 2 kÀrnor och 4 gigabyte minne.
Du kan ocksÄ vÀlja en 50000-token och se dess vÀrde.
Det Ă€r möjligt att anvĂ€nda inte bara http, utan ocksĂ„ köra bakgrundsfunktioner som bearbetar dina data. Dessutom finns det olika triggers. Till exempel kan du anropa funktioner vid uppdateringar, kontrollera nĂ„got â Ă„tgĂ€rda konflikter.
Det gÄr att skriva skript-applikationer direkt pÄ databasservern, utan begrÀnsningar, ansluta valfria moduler och implementera vilken logik som helst.
Applikationsservern kan kommunicera med externa servrar, hÀmta data och lagra dem i sin databas. Data frÄn denna databas kommer att anvÀndas av andra applikationer.
Detta kommer att göras av Tarantool sjÀlv, sÄ det behövs inget separat program.
Avslutningsvis
Detta Àr bara den första delen av ett stort arbete. Den andra delen kommer snart att publiceras i Mail.ru Groups blogg, och vi kommer definitivt att lÀgga till en lÀnk till den i detta material.
Om du Àr intresserad av att delta i evenemang dÀr vi skapar sÄdana saker online och stÀlla frÄgor i realtid, anslut dig till.
Om du behöver migrera till molnet eller har frÄgor om din infrastruktur, .
P.S. Vi har tvÄ gratis granskningar per mÄnad, kanske Àr just ditt projekt en av dem.
KĂ€lla: habr.com
