Pirms pieciem gadiem es mÄÄ£inÄju strÄdÄt ar Tarantool, bet tad tas man nedarbojÄs. Bet nesen es rÄ«koju vebinÄru, kurÄ runÄju par Hadoop, par to, kÄ darbojas MapReduce. Tur man uzdeva jautÄjumu - "KÄpÄc Å”im uzdevumam neizmantot Tarantool?".
ZinÄtkÄres labad nolÄmu pie tÄ atgriezties, notestÄt jaunÄko versiju ā un Å”oreiz projekts man ļoti patika. Tagad es jums parÄdÄ«Å”u, kÄ uzrakstÄ«t vienkÄrÅ”u lietojumprogrammu Tarantool, ielÄdÄt to un pÄrbaudÄ«t tÄ veiktspÄju, un jÅ«s redzÄsiet, cik viss ir viegli un forÅ”i.
Kas ir Tarantool
Tarantool pozicionÄ sevi kÄ Ä«paÅ”i Ätru datubÄzi. JÅ«s varat ievietot visus vajadzÄ«gos datus. TurklÄt atkÄrtojiet tos, sadaliet tos ā tas ir, sadaliet milzÄ«gu datu apjomu vairÄkos serveros un apvienojiet to rezultÄtus ā izveidojiet kļūmju izturÄ«gas galvenÄs un galvenÄs saites.
OtrkÄrt, tas ir lietojumprogrammu serveris. TajÄ varat rakstÄ«t savas lietojumprogrammas, strÄdÄt ar datiem, piemÄram, dzÄst vecos ierakstus fonÄ saskaÅÄ ar noteiktiem noteikumiem. JÅ«s varat tieÅ”i TarantulÄ uzrakstÄ«t HTTP serveri, kas strÄdÄs ar datiem: norÄdiet to numuru, ierakstiet tur jaunus datus un samaziniet to visu uz galveno.
IzlasÄ«ju rakstu par to, kÄ puiÅ”i sastÄdÄ«ja 300 rindu ziÅojumu rindu, kas vienkÄrÅ”i plosÄs un dauzÄs - viÅiem minimÄlais sniegums ir 20 000 ziÅojumu sekundÄ. Å eit jÅ«s patieÅ”Äm varat apgriezties un uzrakstÄ«t ļoti lielu pieteikumu, un tie netiks saglabÄti, kÄ PostgreS.
ApmÄram Å”Ädu serveri, tikai vienkÄrÅ”u, es mÄÄ£inÄÅ”u aprakstÄ«t Å”ajÄ rakstÄ.
UzstÄdÄ«Å”ana
PÄrbaudei es iedarbinÄju trÄ«s standarta virtuÄlÄs maŔīnas - 20 gigabaitu cieto disku, Ubuntu 18.04. 2 virtuÄlais procesors un 4 gigabaiti atmiÅa.
MÄs instalÄjam Tarantool ā palaižam bash skriptu vai pievienojam repozitoriju un apt get instalÄjam Tarantool. Saite uz skriptu - (curl -L
tarantoolctl ir galvenÄ komanda Tarantula gadÄ«jumu pÄrvaldÄ«bai.
/etc/tarantool - Å”eit ir visa konfigurÄcija.
var/log/tarantool - lūk, baļķi.
var/lib/tarantool - Å”eit atrodas dati, un pÄc tam tie tiek sadalÄ«ti instancÄs.
Ir instancÄ pieejamÄs un instanÄu iespÄjotas mapes - tajÄ ir ietverts tas, kas tiks palaists - instances konfigurÄcijas fails ar lua kodu, kurÄ aprakstÄ«ts, kuros portos tas klausÄs, kÄda atmiÅa tai ir pieejama, vinila dzinÄja iestatÄ«jumi, kods, kas darbojas startÄÅ”anas laikÄ. serveri, sadalÄ«Å”ana, rindas, novecojuÅ”u datu dzÄÅ”ana un tÄ tÄlÄk.
GadÄ«jumi darbojas tÄpat kÄ PostgreS. PiemÄram, vÄlaties palaist vairÄkas datu bÄzes kopijas, kas karÄjas dažÄdos portos. IzrÄdÄs, ka vienÄ serverÄ« tiek palaisti vairÄki datu bÄzes gadÄ«jumi, kas karÄjas dažÄdos portos. Tiem var bÅ«t pilnÄ«gi dažÄdi iestatÄ«jumi ā viena instance Ä«steno vienu loÄ£iku, otrÄ ā citu.
InstanÄu vadÄ«ba
Mums ir komanda tarantoolctl, kas ļauj mums pÄrvaldÄ«t Tarantula gadÄ«jumus. PiemÄram, tarantoolctl pÄrbaudes piemÄrs pÄrbaudÄ«s konfigurÄcijas failu un paziÅos, ka fails ir kÄrtÄ«bÄ, ja nav sintakses kļūdu.
JÅ«s varat redzÄt instances statusu - tarantoolctl statusa piemÄru. TÄdÄ paÅ”Ä veidÄ jÅ«s varat sÄkt, apturÄt, restartÄt.
Kad instance darbojas, ir divi veidi, kÄ ar to izveidot savienojumu.
1. AdministratÄ«vÄ konsole
PÄc noklusÄjuma Tarantool atver ligzdu un nosÅ«ta vienkÄrÅ”u ASCII tekstu, lai kontrolÄtu Tarantula. Savienojums ar konsoli vienmÄr notiek administratora lietotÄja vadÄ«bÄ, nav autentifikÄcijas, tÄpÄc jums nav jÄizÅem konsoles ports, lai kontrolÄtu Tarantula ÄrpusÄ.
Lai izveidotu savienojumu Å”ÄdÄ veidÄ, jums jÄievada Tarantoolctl enter instance name. Komanda palaidÄ«s konsoli un izveidos savienojumu kÄ administratora lietotÄjs. Nekad nepakļaujiet konsoles pieslÄgvietu Ärpusei - labÄk atstÄt to kÄ ierÄ«ces ligzdu. Tad tikai tie, kuriem ir rakstÄ«Å”anas piekļuve ligzdai, varÄs pieslÄgties Tarantulam.
Å Ä« metode ir nepiecieÅ”ama administratÄ«vÄm lietÄm. Lai strÄdÄtu ar datiem, izmantojiet otro metodi - binÄro protokolu.
2. BinÄrÄ protokola izmantoÅ”ana, lai izveidotu savienojumu ar noteiktu portu
KonfigurÄcijÄ ir klausÄ«Å”anÄs direktÄ«va, kas atver portu ÄrÄjiem sakariem. Å is ports tiek izmantots ar binÄro protokolu, un tajÄ ir iespÄjota autentifikÄcija.
Å im savienojumam tiek izmantots tarantoolctl savienojums ar porta numuru. Izmantojot to, jÅ«s varat izveidot savienojumu ar attÄliem serveriem, izmantot autentifikÄciju un pieŔķirt dažÄdas piekļuves tiesÄ«bas.
Datu ierakstīŔanas un kastes modulis
TÄ kÄ Tarantool ir gan datubÄze, gan lietojumprogrammu serveris, tam ir dažÄdi moduļi. MÅ«s interesÄ kastes modulis - tas realizÄ darbu ar datiem. Kad kaut ko ierakstÄt kastÄ, Tarantool ieraksta datus diskÄ, saglabÄ tos atmiÅÄ vai dara ar tiem kaut ko citu.
Ieraksts
PiemÄram, mÄs ieejam kastes modulÄ« un izsaucam funkciju box.once. Tas piespiedÄ«s Tarantool palaist mÅ«su kodu, kad serveris tiks inicializÄts. MÄs izveidojam vietu, kur tiks glabÄti mÅ«su dati.
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
PÄc tam mÄs izveidojam primÄro indeksu - primÄro -, pÄc kura mÄs varam meklÄt datus. Ja parametri nav norÄdÄ«ti, pÄc noklusÄjuma tiks izmantots pirmais lauks katrÄ primer indeksa ierakstÄ.
PÄc tam mÄs pieŔķiram vieslietotÄjam grantu, saskaÅÄ ar kuru mÄs izveidojam savienojumu, izmantojot binÄro protokolu. MÄs atļaujam lasÄ«t, rakstÄ«t un izpildÄ«t visÄ instancÄ.
SalÄ«dzinot ar parastajÄm datu bÄzÄm, Å”eit viss ir pavisam vienkÄrÅ”i. Mums ir telpa ā zona, kurÄ vienkÄrÅ”i tiek glabÄti mÅ«su dati. Katrs ieraksts tiek saukts par korteļļu. Tas ir iesaiÅots MessagePack. Å is ir ļoti forÅ”s formÄts ā tas ir binÄrs un aizÅem mazÄk vietas ā 18 baiti pret 27.
Ar viÅu ir diezgan Ärti strÄdÄt. GandrÄ«z katrÄ rindÄ, katrÄ datu ierakstÄ var bÅ«t pilnÄ«gi atŔķirÄ«gas kolonnas.
MÄs varam apskatÄ«t visas atstarpes, izmantojot komandu Box.space. Lai atlasÄ«tu konkrÄtu gadÄ«jumu, mÄs rakstÄm box.space piemÄru un iegÅ«stam pilnu informÄciju par to.
Tarantool ir iebÅ«vÄti divu veidu dzinÄji: Memory un Vinyl. AtmiÅa saglabÄ visus datus atmiÅÄ. TÄpÄc viss darbojas vienkÄrÅ”i un Ätri. Dati tiek izmesti diskÄ, un ir arÄ« ierakstÄ«Å”anas žurnÄla mehÄnisms, tÄpÄc mÄs neko nezaudÄsim, ja serveris avarÄ.
Vinils uzglabÄ datus diskÄ pazÄ«stamÄkÄ formÄ - tas ir, jÅ«s varat uzglabÄt vairÄk datu, nekÄ mums ir atmiÅa, un Tarantula tos nolasÄ«s no diska.
Tagad mÄs izmantosim atmiÅu.
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>
Indekss:
Jebkurai telpai ir jÄizveido primÄrais indekss, jo bez tÄ nekas nedarbosies. TÄpat kÄ jebkurÄ datu bÄzÄ, mÄs izveidojam pirmo lauku - ieraksta ID.
Daļas:
Å eit mÄs norÄdÄm, no kÄ sastÄv mÅ«su indekss. Tas sastÄv no vienas daļas - pirmÄ lauka, ko izmantosim, ierakstiet unsigned - pozitÄ«vs vesels skaitlis. Cik atceros no dokumentÄcijas, maksimÄlais skaits, kas var bÅ«t, ir 18 kvintiljoni. Daudz satriecoÅ”a.
PÄc tam mÄs varam ievietot datus, izmantojot ievietoÅ”anas komandu.
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>
Pirmais lauks tiek izmantots kÄ primÄrÄ atslÄga, tÄpÄc tam ir jÄbÅ«t unikÄlam. MÅ«s neierobežo kolonnu skaits, tÄpÄc mÄs varam ievietot tik daudz datu, cik mums patÄ«k. Tie ir norÄdÄ«ti MessagePack formÄtÄ, kuru es aprakstÄ«ju iepriekÅ”.
Datu izvade
PÄc tam mÄs varam parÄdÄ«t datus ar atlases komandu.
Box.example.select ar taustiÅu {1} parÄdÄ«s vajadzÄ«go ierakstu. Ja izlaidÄ«sim atslÄgu, mÄs redzÄsim visus mÅ«su rÄ«cÄ«bÄ esoÅ”os ierakstus. Tie visi atŔķiras kolonnu skaitÄ, bet Å”eit principÄ nav kolonnu jÄdziena - ir lauku numuri.
Datu var bÅ«t absolÅ«ti tik daudz, cik vÄlaties. Un, piemÄram, mums tie jÄmeklÄ otrajÄ laukÄ. Lai to izdarÄ«tu, mÄs izveidojam jaunu sekundÄro indeksu.
box.space.example:create_index( āsecondaryā, { type = āTREEā, unique = false, parts = {{field = 2, type =āstringā} }})
MÄs izmantojam komandu Create_index.
MÄs to saucam par sekundÄro.
PÄc tam jums jÄnorÄda parametri. Indeksa veids ir KOKS. Tas var nebÅ«t unikÄls, tÄpÄc ievadÄm Unique = false.
PÄc tam mÄs norÄdÄm, no kurÄm daļÄm sastÄv mÅ«su indekss. Lauks ir tÄ lauka numurs, ar kuru mÄs saistÄm indeksu, un norÄda virknes veidu. Un tÄ tas tika izveidots.
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>
Tagad mÄs to varam saukt Å”Ädi:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
KonservÄÅ”ana
Ja mÄs restartÄsim instanci un mÄÄ£inÄsim vÄlreiz izsaukt datus, mÄs redzÄsim, ka to nav - viss ir tukÅ”s. Tas notiek tÄpÄc, ka Tarantool veido kontrolpunktus un saglabÄ datus diskÄ, bet, ja mÄs pÄrtrauksim darbu pirms nÄkamÄs saglabÄÅ”anas, mÄs zaudÄsim visas darbÄ«bas - jo mÄs atgÅ«sim no pÄdÄjÄ kontrolpunkta, kas bija, piemÄram, pirms divÄm stundÄm.
ArÄ« katras sekundes saglabÄÅ”ana nedarbosies - jo pastÄvÄ«ga 20 GB izmeÅ”ana diskÄ ir tik ļoti ideja.
Å im nolÅ«kam tika izgudrots un ieviests priekÅ”raksta žurnÄla jÄdziens. Ar tÄs palÄ«dzÄ«bu par katru datu izmaiÅu tiek izveidots ieraksts nelielÄ priekÅ”raksta žurnÄlfailÄ.
Tajos tiek saglabÄts katrs ieraksts lÄ«dz kontrolpunktam. Å iem failiem mÄs iestatÄm izmÄru - piemÄram, 64 mb. Kad tas aizpildÄs, ieraksts sÄk pÄriet uz otro failu. Un pÄc restartÄÅ”anas Tarantool atkopjas no pÄdÄjÄ kontrolpunkta un pÄc tam apceļ visus vÄlÄkos darÄ«jumus, lÄ«dz tas apstÄjas.
Lai veiktu Å”Ädu ierakstu, box.cfg iestatÄ«jumos (failÄ example.lua) jÄnorÄda opcija:
wal_mode = āwriteā;
datu lietojums
Ar to, ko esam uzrakstÄ«juÅ”i tagad, jÅ«s varat izmantot Tarantula datu glabÄÅ”anai, un tas darbosies ļoti Ätri kÄ datu bÄze. Un tagad Ä·irsis uz kÅ«kas - ko ar to visu darÄ«t.
Pieteikuma rakstīŔana
PiemÄram, uzrakstÄ«sim Å”Ädu pieteikumu Tarantulam
AplikÄciju skatiet zem spoilera
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()
MÄs deklarÄjam kÄdu tabulu lua valodÄ, kas definÄ simbolus. Å Ä« tabula ir nepiecieÅ”ama, lai Ä£enerÄtu nejauÅ”u virkni.
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
PÄc tam mÄs deklarÄjam funkciju - randomString un iekavÄs dodam garuma vÄrtÄ«bu.
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
PÄc tam mÄs savienojam http marÅ”rutÄtÄju un http serveri ar mÅ«su Tarantula serveri JSON, ko mÄs nodosim klientam.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
PÄc tam mÄs sÄkam ar portu 8080 visÄs http servera saskarnÄs, kas reÄ£istrÄs visus pieprasÄ«jumus un kļūdas.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
TÄlÄk mÄs deklarÄjam marÅ”rutu, kurÄ, ja pieprasÄ«jums ar GET metodi ierodas portÄ 8080 /count, mÄs izsaucam funkciju no vienas rindas. Tas atgriež statusu - 200, 404, 403 vai jebkuru citu, ko mÄs norÄdÄm.
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
PamattekstÄ mÄs atgriežam json.encode, tajÄ norÄdÄm count un getcount, kas tiek izsaukts un parÄda ierakstu skaitu mÅ«su datubÄzÄ.
Otra metode
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)
Kur rindÄ router:route({method = 'GET', path = '/token'}, function() mÄs izsaucam funkciju un Ä£enerÄjam marÄ·ieri.
String lokÄlais marÄ·ieris = randomString(32) ir nejauÅ”a 32 rakstzÄ«mju virkne.
RindÄ lokÄlais pÄdÄjais = box.space.example:len() mÄs izvelkam pÄdÄjo elementu.
Un rindÄ box.space.example:insert{ pÄdÄjais + 1, marÄ·ieris } mÄs ierakstÄm datus savÄ datu bÄzÄ, tas ir, mÄs vienkÄrÅ”i palielinÄm ID par 1. To var izdarÄ«t, starp citu, ne tikai tik neveikli. Tarantulam ir secÄ«bas Å”im gadÄ«jumam.
MÄs tur rakstÄm žetonu.
TÄdÄjÄdi mÄs uzrakstÄ«jÄm pieteikumu vienÄ failÄ. JÅ«s varat piekļūt datiem uzreiz, un kastes modulis paveiks visu netÄ«ro darbu jÅ«su vietÄ.
Tas klausÄs http un strÄdÄ ar datiem, viss ir vienÄ instancÄ - gan lietojumprogramma, gan dati. TÄpÄc viss notiek diezgan Ätri.
Lai palaistu, mÄs instalÄjam http moduli:
KÄ mÄs to darÄm, skatiet zem spoilera
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:/#
Mums ir nepiecieŔams arī Prometejs, lai palaistu:
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:/#
MÄs sÄkam un varam piekļūt moduļiem
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 dod mums statusu 200.
/token izdod marÄ·ieri un ieraksta to datu bÄzÄ.
PÄrbaudes Ätrums
Izpildīsim etalonu 50 000 pieprasījumu. Konkursa pieprasījumu skaits būs 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:/#
Tiek izsniegti žetoni. Un mÄs pastÄvÄ«gi ierakstÄm datus. 99% pieprasÄ«jumu tika izpildÄ«ti 42 milisekundÄs. AttiecÄ«gi mums ir aptuveni 3500 pieprasÄ«jumu sekundÄ uz mazas maŔīnas, kur ir 2 kodoli un 4 gigabaiti atmiÅa.
Varat arÄ« izvÄlÄties kÄdu 50000 XNUMX marÄ·ieri un redzÄt tÄ vÄrtÄ«bu.
Varat izmantot ne tikai http, bet arÄ« palaist fona funkcijas, kas apstrÄdÄ jÅ«su datus. TurklÄt ir dažÄdi trigeri. PiemÄram, varat izsaukt atjauninÄjumu funkcijas, kaut ko pÄrbaudÄ«t - novÄrst konfliktus.
JÅ«s varat rakstÄ«t skriptu lietojumprogrammas tieÅ”i paÅ”Ä datu bÄzes serverÄ« un neko neierobežot, savienot moduļus un ieviest jebkuru loÄ£iku.
Lietojumprogrammu serveris var piekļūt ÄrÄjiem serveriem, apkopot datus un pievienot tos savai datubÄzei. Datus no Ŕīs datu bÄzes izmantos citas lietojumprogrammas.
To darīs pats Tarantula, un nav nepiecieŔams rakstīt atseviŔķu pieteikumu.
NoslÄgumÄ
Å Ä« ir tikai pirmÄ liela darba daļa. Otrais pavisam drÄ«z tiks publicÄts Mail.ru grupas emuÄrÄ, un Å”ajÄ rakstÄ noteikti pievienosim saiti uz to.
Ja vÄlaties apmeklÄt pasÄkumus, kuros mÄs veidojam Ŕīs lietas tieÅ”saistÄ, un uzdot jautÄjumus reÄllaikÄ, izveidojiet savienojumu ar
Ja jums ir jÄpÄriet uz mÄkoni vai jums ir jautÄjumi par savu infrastruktÅ«ru,
PS Mums ir 2 bezmaksas auditi mÄnesÄ«, iespÄjams, ka jÅ«su projekts bÅ«s viens no tiem.
Avots: www.habr.com