PesĂ« vjet mĂ« parĂ«, provoja tĂ« punoja me Tarantool, por atĂ«herĂ« nuk mĂ« pĂ«lqeu. Por sĂ« fundmi, mbajta njĂ« webinar ku folja pĂ«r Hadoop, pĂ«r mĂ«nyrĂ«n se si funksionon MapReduce. Aty mĂ« bĂ«nĂ« njĂ« pyetje â "Pse tĂ« mos pĂ«rdorim Tarantool pĂ«r kĂ«tĂ« detyrĂ«?".
Nga kurioziteti, vendosa tĂ« kthehem tek ai, tĂ« testoj versionin mĂ« tĂ« fundit â dhe kĂ«tĂ« herĂ« projekti mĂ« pĂ«lqeu shumĂ«. Tani do t'ju tregoj se si tĂ« shkruani njĂ« aplikacion tĂ« thjeshtĂ« nĂ« Tarantool, ta ngarkoj atĂ« dhe tĂ« kontrolloj performancĂ«n, dhe do tĂ« shihni se sa lehtĂ« dhe bukur Ă«shtĂ« gjithçka aty.

ĂfarĂ« Ă«shtĂ« Tarantool
Tarantool pozicionohet si njĂ« bazĂ« tĂ« dhĂ«nash super tĂ« shpejtĂ«. Atje mund tĂ« futni çdo lloj tĂ« dhĂ«nash qĂ« dĂ«shironi. PĂ«r mĂ« tepĂ«r, mund t'i riplikoni ato, t'i shardoni â çka do tĂ« thotĂ« tĂ« ndahen njĂ« sasi e madhe tĂ« dhĂ«nash nĂ« disa serverĂ« dhe tĂ« bashkohen rezultatet e tyre â tĂ« bĂ«ni lidhje qĂ« rezistojnĂ« ndaj dĂ«shtimeve si "master-master".
Në vend të dytë, është një server aplikacionesh. Mund të shkruani aplikacionet tuaja atje, të punoni me të dhëna, për shembull, të fshini në sfond regjistrimet e vjetra sipas disa rregullave. Mund të shkruani një server Http direkt në Tarantool, i cili do të punojë me të dhënat: të jep numrin e tyre, të regjistrojë të dhëna të reja dhe të reduktojë gjithçka në master.
Kam lexuar njĂ« artikull, si djemtĂ« bĂ«nĂ« njĂ« radhĂ« mesazhesh me 300 rreshta, e cila thjesht djeg dhe shkatĂ«rron â ata kanĂ« njĂ« performancĂ« minimale prej 20,000 mesazhesh nĂ« sekondĂ«. KĂ«tu mund tĂ« zhvilloheni vĂ«rtet dhe tĂ« shkruani njĂ« aplikacion shumĂ« tĂ« madh, dhe nuk do tĂ« ishin ruajtjet si nĂ« PostgreS.
Një server i tillë, vetëm i thjeshtë, do të përpiqem ta përshkruaj në këtë artikull.
Instalimi
PĂ«r testin, krijova tre machine virtuale standarde â njĂ« hard disk prej 20 gigabajt, Ubuntu 18.04. 2 CPU virtuale dhe 4 gigabajt RAM.
Ne instalojmĂ« Tarantool â fillojmĂ« njĂ« skript bash ose shtojmĂ« depozitĂ«n dhe bĂ«jmĂ« apt get install Tarantool. Linku pĂ«r skriptin Ă«shtĂ« (curl -L | VER=2.4 sudo -E bash). Ne kemi komanda tĂ« tilla si:
tarantoolctl â komanda kryesore pĂ«r menaxhimin e instancave tĂ« Tarantool.
/etc/tarantool â kĂ«tu ndodhet e gjithĂ« konfigurimi.
var/log/tarantool â kĂ«tu janĂ« log-et.
var/lib/tarantool â kĂ«tu ndodhen tĂ« dhĂ«nat, dhe mĂ« pas ato ndahen sipas instancave.
Ka e kataloget instance-available dhe instance-enable â aty ndodhet ajo qĂ« do tĂ« niset â skedari i konfigurimit tĂ« instancĂ«s me kodin lua, ku pĂ«rshkruhet se nĂ« cilat porte dĂ«gjon, cila memorie i Ă«shtĂ« e aksesueshme, cilĂ«simet e motorit Vinyl, kodi qĂ« aktivizohet gjatĂ« fillimit tĂ« serverit, sharding, radhĂ«t, fshirja e tĂ« dhĂ«nave tĂ« vjetra dhe kĂ«shtu me radhĂ«.
Instancat punojnĂ« si nĂ« PostgreS. PĂ«r shembull, dĂ«shironi tĂ« nisni disa kopje tĂ« bazĂ«s sĂ« tĂ« dhĂ«nave, e cila ndodhet nĂ« porte tĂ« ndryshme. KĂ«shtu, nĂ« njĂ« server nisen disa instanca tĂ« bazave tĂ« tĂ« dhĂ«nave, tĂ« cilat ndodhen nĂ« porte tĂ« ndryshme. Ato mund tĂ« kenĂ« cilĂ«sime krejtĂ«sisht tĂ« ndryshme â njĂ« instancĂ« implementon njĂ« logjikĂ«, tjetra njĂ« tjetĂ«r.
Menaxhimi i instancave
Ne kemi komandĂ«n tarantoolctl, e cila mundĂ«son menaxhimin e instancave tĂ« Tarantool. PĂ«r shembull, tarantoolctl check example do tĂ« kontrollojĂ« skedarin me konfigurim dhe do tĂ« thotĂ« â skedari Ă«shtĂ« ok, nĂ«se aty nuk ka gabime sintaksore.
Mund tĂ« shikoni statusin e instancĂ«s â tarantoolctl status example. NĂ« tĂ« njĂ«jtĂ«n mĂ«nyrĂ« mund tĂ« bĂ«ni start, stop, restart.
Kur instanca është nisur, mund të lidheni me të në dy mënyra.
1. Konsola administruese
Sipas parazgjedhjes, Tarantool hap një socket, ku transmetohet teksti ASCII normal për menaxhimin e Tarantool. Lidhja me konsolën ndodh gjithmonë nën përdoruesin admin, nuk ka autentifikim, prandaj nuk është e nevojshme të nxirrni portin e konsolës për menaxhimin e Tarantool jashtë.
PĂ«r tĂ« u lidhur nĂ« kĂ«tĂ« mĂ«nyrĂ«, duhet tĂ« shkruani Tarantoolctl enter instance name. Komanda do tĂ« nisĂ« konsolĂ«n dhe do tĂ« lidhet si pĂ«rdoruesi admin. Mos e ekspozoni kurrĂ« portin e konsolĂ«s jashtĂ« â Ă«shtĂ« mĂ« mirĂ« ta mbani atĂ« si unit socket. KĂ«shtu, vetĂ«m ata qĂ« kanĂ« qasje pĂ«r tĂ« shkruar nĂ« socket do tĂ« mund tĂ« lidhen me Tarantool.
Ky mĂ«nyrĂ« Ă«shtĂ« e nevojshme pĂ«r punĂ«t administrative. PĂ«r tĂ« punuar me tĂ« dhĂ«nat, pĂ«rdorni mĂ«nyrĂ«n e dytĂ« â protokolli binar.
2. Përdorimi i protokollit binar për lidhjen me një port të caktuar
Në konfigurim ka një direktivë listen, e cila hap një port për komunikimet e jashtme. Ky port përdoret me protokollin binar, dhe aty është e aktivizuar autentifikimi.
Për këtë lidhje përdoret tarantoolctl connect to port number. Duke e përdorur, mund të lidheni me serverë të largët, të përdorni autentifikimin dhe të jepni të drejta të ndryshme qasje.
Shkrimi i të dhënave dhe moduli Box
Duke tar Tarantool Ă«shtĂ« njĂ« bazĂ« tĂ« dhĂ«nash dhe njĂ« server aplikacioni, ka module tĂ« ndryshme. Ne jemi tĂ« interesuar pĂ«r modulin box â ai realizon punĂ«n me tĂ« dhĂ«nat. Kur shkruani diçka nĂ« box, Tarantool shkruan tĂ« dhĂ«nat nĂ« disq dhe i ruan nĂ« memorje ose bĂ«n diçka tjetĂ«r me to.
Shkruaj
Për shembull, hyjmë në modulin box dhe thërrasim funksionin box.once. Kjo do ta detyrojë Tarantool të ekzekutojë kodin tonë gjatë inicializimit të serverit. Ne krijojmë një hapësirë, në të cilën do të ruhen të dhënat tona.
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.grant('guest', 'read,write,execute', 'universe')
-- Mbani gjithçka të sigurt në mënyrë standarde
-- box.schema.user.create('example', { password = 'secret' })
-- box.schema.user.grant('example', 'replication')
-- box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
endPas kĂ«saj krijojmĂ« indeksi primar â primary â me tĂ« cilin do tĂ« mund tĂ« kĂ«rkojmĂ« tĂ« dhĂ«nat. NĂ« mĂ«nyrĂ« standarde, nĂ«se nuk pĂ«rcaktojmĂ« asnjĂ« parametĂ«r, do tĂ« pĂ«rdoret fusha e parĂ« nĂ« çdo regjistrim pĂ«r indeksi primar.
Më pas bëjmë grant për përdoruesin guest, me të cilin lidhemi përmes protokollit binar. Lejojmë të lexojmë, shkruajmë dhe ekzekutojmë në të gjithë instancën.
NĂ«se e krahasojmĂ« me bazat e zakonshme tĂ« dhĂ«nash, kĂ«tu gjithçka Ă«shtĂ« mjaft e thjeshtĂ«. Ne kemi njĂ« hapĂ«sirĂ« â njĂ« zonĂ« nĂ« tĂ« cilĂ«n thjesht ruhen tĂ« dhĂ«nat tona. Ădo regjistrim quhet tuple. Ajo paketizohet nĂ« MessagePack. Ky Ă«shtĂ« njĂ« format shumĂ« kĂ«ndshĂ«m â Ă«shtĂ« binar dhe zĂ« mĂ« pak hapĂ«sirĂ« â 18 bite nĂ« krahasim me 27.

ĂshtĂ« mjaft e lehtĂ« tĂ« punosh me tĂ«. Pothuajse çdo rresht, çdo regjistrim tĂ« dhĂ«nash mund tĂ« ketĂ« kolona absolutisht tĂ« ndryshme.
TĂ« gjitha hapĂ«sirat mund t'i shohim me anĂ« tĂ« komandĂ«s Box.space. PĂ«r tĂ« nxjerrĂ« informacion nĂ« lidhje me njĂ« instancĂ« tĂ« caktuar â shkruajmĂ« box.space example dhe marrim tĂ« dhĂ«na tĂ« plota pĂ«r tĂ«.
Në Tarantool janë të ndërtuara dy tipe motorësh: Memory dhe Vinyl. Memory e ruan të gjithë të dhënat në memorje. Prandaj gjithçka funksionon thjeshtë dhe shpejt. Të dhënat ruhen në një skedar, si dhe ekziston një mekanizëm write ahead log, kështu që nuk do të humbasim asgjë në rast se serveri bie.
Vinyl ruan tĂ« dhĂ«nat nĂ« disk nĂ« njĂ« format mĂ« tĂ« njohur pĂ«r ne â domethĂ«nĂ«, mund tĂ« ruajmĂ« mĂ« shumĂ« tĂ« dhĂ«na se sa kemi nĂ« memorje, dhe Tarantool do t'i lexojĂ« ato nga disku.
Tani do të përdorim 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>Indeksi:
Duhet tĂ« krijoni njĂ« indeks kryesor pĂ«r çdo hapĂ«sirĂ«, sepse pa tĂ« nuk do tĂ« funksionojĂ« asgjĂ«. Ashtu si nĂ« çdo databazĂ«, krijojmĂ« fushĂ«n e parĂ« â ID e regjistrimit.
Pjesët:
KĂ«tu ne tregojmĂ« nga çfarĂ« pĂ«rbĂ«het indeksi ynĂ«. Ai pĂ«rbĂ«het nga njĂ« pjesĂ« â fusha e parĂ« qĂ« do tĂ« pĂ«rdorim, tipi unsigned â numĂ«r i plotĂ« pozitiv. Sa mbaj mend nga dokumentacioni, numri maksimal qĂ« mund tĂ« jetĂ« â 18 kvintilionĂ«. Mjaft tĂ« shumĂ«.
Më pas mund të insertojmë të dhëna duke përdorur komandën 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>Fusha e parë përdoret si çelësi kryesor, prandaj duhet të jetë unike. Numri i kolonave nuk është i kufizuar, prandaj mund të insertojmë aq të dhëna sa të duam. Ato tregohen në formatin MessagePack, të cilin e përmenda më parë.
Dalja e të dhënave
Më pas mund të nxjerrim të dhënat duke përdorur komandën select.
Box.example.select me specifikimin e çelĂ«sit {1} do tĂ« sjellĂ« regjistrimin e nevojshĂ«m. NĂ«se e lĂ«mĂ« çelĂ«sin tĂ« zbrazĂ«t, do tĂ« shohim tĂ« gjitha regjistrimet qĂ« kemi. TĂ« gjitha janĂ« tĂ« ndryshme nĂ« numrin e kolonave, por kĂ«tu nĂ« parim nuk ka njĂ« nocion kolonash â ka numra fushash.
Mund tĂ« ketĂ« njĂ« sasi tĂ« madhe tĂ« dhĂ«nash. Dhe, pĂ«r shembull, nĂ«se kemi nevojĂ« tâi kĂ«rkojmĂ« ato sipas fushĂ«s sĂ« dytĂ«. PĂ«r kĂ«tĂ«, krijojmĂ« njĂ« indeks tĂ« ri dytĂ«sor.
box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type ='string'} }}) Përdorim komandën Create_index.
E quajmë Secondary.
Pas kĂ«saj, duhet tĂ« tregojmĂ« parametrat. Lloji i indeksit â TREE. Ai mund tĂ« mos jetĂ« unik, prandaj e vendosim Unique = false.
MĂ« pas tregojmĂ« nga çfarĂ« pĂ«rbĂ«het indeksi ynĂ«. Field â Ă«shtĂ« numri i fushĂ«s me tĂ« cilin lidhim indeksin dhe tregojmĂ« llojin string. Dhe ja, ai u krijua.
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>Tani tani mund ta thërrasim:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
Ruajtja
NĂ«se ne rrestartojmĂ« instancĂ«n dhe gjithashtu pĂ«rpiqemi tĂ« thĂ«rrasim tĂ« dhĂ«nat, do tĂ« shohim se ato nuk ekzistojnĂ« â gjithçka Ă«shtĂ« bosh. Kjo ndodh sepse Tarantool bĂ«n pika kontrolli dhe ruan tĂ« dhĂ«nat nĂ« disku, por nĂ«se ne ndalim punĂ«n para ruajtjes sĂ« fundit, do tĂ« humbasim tĂ« gjitha operacionet â sepse do tĂ« rikthehemi nga pika e fundit tĂ« kontrollit qĂ« ishte, pĂ«r shembull, dy orĂ« mĂ« parĂ«.
TĂ« ruash çdo sekondĂ« gjithashtu nuk do tĂ« funksionojĂ« â sepse tĂ« bĂ«sh vazhdimisht dump nĂ« disk pĂ«r 20 Gb â nuk Ă«shtĂ« njĂ« ide e mirĂ«.
Për këtë u shpik dhe u realizua koncepti i regjistrimit të parashikimit të shkruajtur. Me ndihmën e tij, për çdo ndryshim në të dhëna krijohet një regjistrim në një skedë të vogël të regjistrimit të parashikimit.
Secili regjistrim para pikĂ«s sĂ« kontrollit ruhet nĂ« to. PĂ«r kĂ«to skeda ne caktuam njĂ« madhĂ«si â pĂ«r shembull, 64 mb. Kur ajo mbushet, regjistrimi fillon tĂ« shkojĂ« nĂ« skedĂ«n e dytĂ«. Dhe pas rrestartit, Tarantool rikthehet nga pika e fundit e kontrollit dhe mĂ« pas aplikon tĂ« gjitha transaksionet mĂ« tĂ« fundit deri nĂ« momentin e ndalimit.

Për të realizuar një regjistrim të tillë, duhet të tregoni një opsion në konfigurimin e box.cfg (në skedën example.lua):
wal_mode = "write";Përdorimi i të dhënave
Me atĂ« qĂ« kemi shkruar tani, mund ta pĂ«rdorni Tarantool pĂ«r tĂ« ruajtur tĂ« dhĂ«na, dhe ai do tĂ« punojĂ« shumĂ« shpejt si njĂ« DB. Dhe tani pika kulminante â çfarĂ« mund tĂ« bĂ«jmĂ« me gjitha kĂ«to.
Po shkruajmë aplikacionin
Për shembull, do të shkruajmë një aplikacion për Tarantool
Aplikacionin shihni nën spoilerin
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; -- një orë
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
-- për herën e parë krijoni një hapësirë dhe tregoni të drejtat
box.once('replica', bootstrap)
-- aktivizimi i qasjes në konsolë
console = require('console')
console.listen('127.0.0.1:3302')
-- konfigurimi http
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",
"Numri i Token-eve API")
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()Ne shpallim një tabelë në lua, e cila përcakton simbolet. Kjo tabelë është e nevojshme për gjenerimin e një stringu të rastësishëm.
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
endPas kĂ«saj ne shpallim funksionin â randomString dhe i japim nĂ« parantezĂ« vlerĂ«n e gjatĂ«si.
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)]
endPastaj ne lidhemi me http-router dhe http-server në serverin tonë Tarantool, JSON, të cilin do e kthejmë për klientin.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')Pas kësaj, nisemi në portin 8080 në të gjitha ndërfaqet e serverit http, i cili do të regjistrojë të gjitha kërkesat dhe gabimet.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})MĂ« pas shpallim rrugĂ«n, qĂ« nĂ« portin 8080 /count tĂ« vijnĂ« kĂ«rkesa me metodĂ«n GET, atĂ«herĂ« ne thĂ«rrasim njĂ« funksion me njĂ« linjĂ«. Ai kthen statusin â 200, 404, 403 ose çdo tjetĂ«r qĂ« do tĂ« specifikojmĂ«.
router:route({method = 'GET', path = ' /count '}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)Në trupin e përgjigjes kthejmë json.encode, në të cilin specifikojmë count dhe getcount, e cila thirret dhe tregon numrin e regjistrimeve në bazën tonë.
Metoda e dytë
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)Ku në këtë rresht router:route({method = 'GET', path = ' /token '}, function() thërrasim funksionin dhe gjenerojmë një token.
String local token = randomString(32) â kjo Ă«shtĂ« njĂ« varg i rastĂ«sishĂ«m me 32 karaktere.
NĂ« rreshtin local last = box.space.example:len() ne nxjerrim elementin e fundit.
Dhe në këtë rresht box.space.example:insert{ last + 1, token } shkruajmë në bazën tonë të dhënash, pra thjesht rrisim ID-në me 1. Këtë mund ta bëjmë, për shembull, jo vetëm në këtë mënyrë të ngathët. Në Tarantula ka sekuenca për këtë punë.
Shkruajmë atje tokenin.
Kështu, ne kemi shkruar një aplikacion në një skedë. Në të mund të aksesojmë menjëherë të dhënat, dhe moduli box do ta bëjë për ju të gjithë punën e papastër.
Ai dĂ«gjon http dhe punon me tĂ« dhĂ«nat, gjithçka ndodhet nĂ« njĂ« instancĂ« tĂ« vetme â si aplikacioni ashtu edhe tĂ« dhĂ«nat. Prandaj, gjithçka ndodh mjaft shpejt.
Për instalimin e tij, ne instalojmë modul http:
Si e bëjmë këtë, shihni nën spojler.
root@test2: /# tarantoolctl rocks instalo http
Duke http://rocks.tarantool.org/http-scm-1.src.rock
Mungesat të gjitha varësitë për http scm-1:
checks >= 3.0.1 (nuk është instaluar)
http scm-1 varet nga checks >= 3.0.1 (nuk është instaluar)
Duke instaluar http://rocks.tarantool.org/checks-3.0.1-1.rockspec
Klonimi në '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
Marrja e objekteve: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Zgjidhja e deltas: 100% (1/1), done.
Shënim: duke kontrolluar '580388773ef11085015b5a06fe52d61acf16b201'.
Je në gjendjen 'detached HEAD'. Mund të shikosh rreth, të bësh ndryshime eksperimantale
dhe ta angazhosh, dhe mund të heqësh çdo angazhim që bën në këtë
gjendje pa ndikuar në asnje degë duke kryer një checkout tjetër.
Nëse dëshiron të krijosh një degë të re për të ruajtur angazhimet që krijon, mund
ta bësh këtë (tani ose më vonë) duke përdorur -b me komandën checkout përsëri. Shembull:
git checkout -b
Nuk ka manifest të ekzistueshëm. Po përpiqem të rindërtoj...
checks 3.0.1-1 tani është instaluar në /.rocks (licenca: BSD)
-- Identifikimi i kompajlerit C është GNU 7.5.0
-- Kontrolli për kompajlerin C funksional: /usr/bin/cc
-- Kontrolli për kompajlerin C funksional: /usr/bin/cc -- funksionon
-- Zbulimi i ABI të kompajlerit C
-- Zbulimi i ABI të kompajlerit C - përfunduar
-- Zbulimi i karakteristikave të kompajlimit C
-- Zbulimi i karakteristikave të kompajlimit C - përfunduar
-- Gjetur TARANTOOL: /usr/include (gjetur versionin "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR është /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR është /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Konfigurimi i bërë
-- Gjenerimi i bërë
Kujdes CMake:
Variablat e specifikuara manualisht nuk ishin përdorur nga projekti:
version
-- Skedaret e ndërtimit janë shkruar në: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Duke skanuar varësitë e objektit httpd
[ 50%] Ngritja e objektit C http/CMakeFiles/httpd.dir/lib.c.o
Në skedarin e përfshirë nga /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: NĂ« funksionin 'tpl_term':
/usr/include/tarantool/lauxlib.h:144:15: kuptimin: ky deklarim mund të kalojë [-Wimplicit-fallthrough=]
(*(B)->p++ = (char)(c)))
~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: shënim: në zgjerimin e makros 'luaL_addchar'
luaL_addchar(b, '\');
^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: shënim: këtu
default:
^~~~~~~
Në skedarin e përfshirë nga/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: NĂ« funksionin 'tpe_parse':
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: kuptimi: ky deklarim mund të kalojë [-Wimplicit-fallthrough=]
type = TPE_TEXT;
~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: shënim: këtu
rast TPE_LINECODE:
^~~~
Në skedarin e përfshirë nga/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: NĂ« funksionin 'httpfast_parse':
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: kuptimi: ky deklarim mund të kalojë [-Wimplicit-fallthrough=]
code = 0;
~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: shënim: këtu
rast status:
^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: kuptimi: ky deklarim mund të kalojë [-Wimplicit-fallthrough=]
state = message;
~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: shënim: këtu
rast message:
^~~~
[100%] Duke lidhur bibliotekën e ndarë C lib.so
[100%] Ndërtimi i objektit httpd
[100%] Ndërtimi i objektit httpd
Instalo projektin...
-- Konfigurimi i instalimit: "Debug"
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Duke instaluar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 tani është instaluar në /.rocks (licenca: BSD)
root@test2: /#Për ta nisur, na duhet gjithashtu prometheus:
root@test2:~# tarantoolctl rocks install prometheus
Instalimi http://rocks.tarantool.org/prometheus-scm-1.rockspec
Klonimi në 'prometheus'...
remote: Rrallë objektesh: 19, përfunduar.
remote: Numërimi i objekteve: 100% (19/19), përfunduar.
remote: Kompresimi i objekteve: 100% (19/19), përfunduar.
remote: Totali 19 (delta 2), ri përdorur 5 (delta 0), pak-ri përdorur 0
Marrja e objekteve: 100% (19/19), 10.73 KiB | 10.73 MiB/s, përfunduar.
Zgjidhja e deltas: 100% (2/2), përfunduar.
prometheus scm-1 tani është instaluar në /.rocks (licenca: BSD)
root@test2:~#
Po fillojmë dhe mund të qasemi te modulet
root@test2:~# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Pesha e përmbajtjes: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Lidhja: mbaj-e-jetë
{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}
root@test2:~# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Pesha e përmbajtjes: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Lidhja: mbaj-e-jetë
{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}
root@test2:~# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Pesha e përmbajtjes: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Lidhja: mbaj-e-jetë
{"count":2}root@test2:~# /count ĐŸŃĐŽĐ°Đ”Ń ĐœĐ°ĐŒ ŃŃаŃŃŃ 200.
/token ĐČŃĐŽĐ°Đ”Ń ŃĐŸĐșĐ”Đœ Đž ĐŽĐ”Đ»Đ°Đ”Ń Đ·Đ°ĐżĐžŃŃ ŃŃĐŸĐłĐŸ ŃĐŸĐșĐ”ĐœĐ° ĐČ Đ±Đ°Đ·Ń.
Po testojmë shpejtësinë
Le të fillojmë një benchmark me 50,000 kërkesa. Numri i kërkesave konkurruese do të jetë 500.
root@test2:~# ab -c 500 -n 50000 http://127.0.0.1:8080/token
Kjo është ApacheBench, Version 2.3
TĂ« drejtat e autorit 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licencuar për The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (pritni pak)
Kërkesa 5000 përfundoi
Kërkesa 10000 përfundoi
Kërkesa 15000 përfundoi
Kërkesa 20000 përfundoi
Kërkesa 25000 përfundoi
Kërkesa 30000 përfundoi
Kërkesa 35000 përfundoi
Kërkesa 40000 përfundoi
Kërkesa 45000 përfundoi
Kërkesa 50000 përfundoi
Kërkesa 50000 përfundoi
Software-i i Serverit: Tarantool
Hostname-i i Serverit: 127.0.0.1
Porti i Serverit: 8080
Rruga e Dokumentit: /token
Gjatësia e Dokumentit: 44 byte
Niveli i Konkurrentës: 500
Koha e marrë për testet: 14.578 sekonda
Kërkesat e plota: 50000
Kërkesat e dështuara: 0
Totali i transferuar: 7950000 byte
HTML i transferuar: 2200000 byte
Kërkesat për sekondë: 3429.87 [#/sec] (mesatare)
Koha për kërkesë: 145.778 [ms] (mesatare)
Koha për kërkesë: 0.292 [ms] (mesatare, për të gjitha kërkesat konkurente)
Shpejtësia e transferimit: 532.57 [Kbytes/sec] e marrë
Koha e Lidhjes (ms)
min mesatare[+/-sd] median maksimale
Lidhja: 0 10 103.2 0 3048
Procesi: 12 69 685.1 15 13538
Pritja: 12 69 685.1 15 13538
Totali: 12 78 768.2 15 14573
Përqindja e kërkesave të shërbyera brenda një kohe të caktuar (ms)
50% 15
66% 15
75% 16
80% 16
90% 16
95% 16
98% 21
99% 42
100% 14573 (kërkesa më e gjatë)
root@test2:~#Tokenet janë duke u lëshuar. Dhe ne po regjistrojmë vazhdimisht të dhënat. 99% e kërkesave u përmbushën brenda 42 milisekondash. Prandaj, kemi rreth 3500 kërkesa në sekondë në një makinë të vogël, me 2 bërthama dhe 4 gigabajt memorie.
Gjithashtu, është e mundur të selektohet ndonjë 50000-token dhe të shikohet vlera e tij.
Mund tĂ« pĂ«rdoren jo vetĂ«m http, mund tĂ« lirohen funksione nĂ« sfond qĂ« pĂ«rpunojnĂ« tĂ« dhĂ«nat tuaja. Plus ka razliÄita triggere. PĂ«r shembull, mund tĂ« thirni funksione nĂ« pĂ«rditĂ«sime, tĂ« kontrolloni diçka - tĂ« zgjidhni konflikte.
Mund të shkruani aplikacione-skripta direkt në serverin e bazës së të dhënave, pa asnjë kufizim, duke lidhur ndonjë modul dhe duke realizuar çdo logjikë.
Serveri i aplikacioneve mund tĂ« lidhet me serverĂ« tĂ« jashtĂ«m, tĂ« marrĂ« tĂ« dhĂ«na dhe tâi ruajĂ« ato nĂ« bazĂ«n e tij. TĂ« dhĂ«nat nga kjo bazĂ« do tĂ« pĂ«rdoren nga aplikacione tĂ« tjera.
Këtë do ta bëjë vetë Tarantool, dhe nuk do të ketë nevojë të shkruani një aplikacion të veçantë.
Në përfundim
Kjo është vetëm pjesa e parë e një pune të madhe. Pjesa e dytë do të publikohet shumë shpejt në blogun e Mail.ru Group, dhe ne sigurisht do të shtojmë një lidhje për të në këtë material.
NĂ«se jeni tĂ« interesuar tĂ« merrni pjesĂ« nĂ« ngjarje ku ne krijojmĂ« kĂ«to gjĂ«ra online dhe tâi bĂ«ni pyetje nĂ« kohĂ« reale, lidhen me.
Nëse keni nevojë për një kalim në cloud ose keni pyetje në lidhje me infrastrukturën tuaj, .
P.S. Ne kemi 2 audita të lira në muaj, ndoshta projekti juaj do të jetë në mesin e tyre.
Burimi: habr.com
