Në Tarantool, mund të kombinoni një bazë të dhënash super të shpejtë dhe një aplikacion për punën me to. Kështu është bërë thjesht.

Para pesĂ« vjetĂ«sh, kam provuar tĂ« punoj me Tarantool, por atĂ«herĂ« nuk mĂ« pĂ«lqeu. SĂ« fundmi, mbajta njĂ« webinar, ku flisja pĂ«r Hadoop dhe si funksionon MapReduce. Atje mĂ« bĂ«nĂ« njĂ« pyetje — "Pse tĂ« mos pĂ«rdorim Tarantool pĂ«r kĂ«tĂ« detyrĂ«?".

PĂ«r shkak tĂ« kuriozitetit, vendosa tĂ« kthehem tek ai, tĂ« testeja 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 dhe tĂ« kontrolloj performancĂ«n, dhe do tĂ« shihni se sa e lehtĂ« dhe e shkĂ«lqyer Ă«shtĂ« atje.

Në Tarantool, mund të kombinoni një bazë të dhënash super të shpejtë dhe një aplikacion për punën me to. Kështu është bërë thjesht.

ÇfarĂ« Ă«shtĂ« Tarantool

Tarantool e pozicionon veten si njĂ« DB super tĂ« shpejtĂ«. Mund tĂ« futni çdo lloj tĂ« dhĂ«nĂ« qĂ« dĂ«shironi. PĂ«r mĂ« tepĂ«r, mund t'i replikoni, tĂ« shardoni — qĂ« do tĂ« thotĂ« tĂ« ndani njĂ« sasi tĂ« madhe tĂ« dhĂ«nash nĂ« disa servera dhe tĂ« bashkoni rezultatet nga ato — tĂ« krijoni lidhje tĂ« qĂ«ndrueshme si "master-master."

Në radhën e dytë, ky është një server aplikacionesh. Mund të shkruani aplikacionet tuaja mbi të, të punoni me të dhënat, për shembull, të fshini në sfond regjistrimet e vjetra sipas rregullave të caktuara. Mund të shkruani direkt në Tarantool një server Http, i cili do të punojë me të dhënat: të japë numrin e tyre, të regjistrojë të dhëna të reja dhe të reduktojë gjithçka në master.

Kam lexuar një artikull se si djemtë bënë një radhë mesazhesh me 300 rreshta, që thjesht çan dhe shemb. Ata kanë një produktivitet minimal prej 20,000 mesazhesh për sekondë. Këtu mund të zhvilloheni vërtet dhe të shkruani një aplikacion shumë të madh, dhe këto nuk do të jenë ruajtje 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 kam krijuar tre makina virtuale standarde – njĂ« hard disku 20 gigabajt, Ubuntu 18.04. 2 CPU virtuale dhe 4 gigabajt memorie.

Ne instalojmĂ« Tarantool – ekzekutojmĂ« skriptin nga shell-i ose shtojmĂ« depozitĂ«n dhe bĂ«jmĂ« apt get install Tarantool. Linku pĂ«r skriptin Ă«shtĂ« – (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Kemi komandat e 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 ndodhen logjet.
var/lib/tarantool — kĂ«tu ruhen tĂ« dhĂ«nat, dhe mĂ« tej ato ndahen sipas instancave.

Ka dosje instance-available dhe instance-enable — nĂ« tĂ« ndodhet ajo qĂ« do tĂ« niste — skedari i konfigurimit tĂ« instancĂ«s me kodin lua, i cili pĂ«rshkruan nĂ« cilat porte dĂ«gjon, çfarĂ« memorie ka tĂ« disponueshme, cilĂ«simet e motorit Vinyl, kodi qĂ« ekzekutohet gjatĂ« nisjes sĂ« serverit, sharding, radhĂ«t, fshirja e tĂ« dhĂ«nave tĂ« vjetra dhe kĂ«shtu me radhĂ«.

Instancat funksionojnĂ« si nĂ« PostgreS. PĂ«r shembull, dĂ«shironi tĂ« nisni disa kopje tĂ« njĂ« baze tĂ« dhĂ«nash, e cila ndodhet nĂ« porta tĂ« ndryshme. KĂ«shtu, nĂ« njĂ« server nisen disa instanca tĂ« bazĂ«s sĂ« tĂ« dhĂ«nave, tĂ« cilat ndodhen nĂ« porte tĂ« ndryshme. Ato mund tĂ« kenĂ« cilĂ«sime plotĂ«sisht tĂ« ndryshme — njĂ« instancĂ« realizon njĂ« logjikĂ«, tjetra — njĂ« tjetĂ«r.

Menaxhimi i instancave

Kemi komandĂ«n tarantoolctl, e cila lejon menaxhimin e instancave tĂ« Taranulit. PĂ«r shembull, tarantoolctl check example do tĂ« kontrollojĂ« skedarin me konfigurimin dhe do tĂ« thotĂ« — skedari Ă«shtĂ« nĂ« rregull, nĂ«se nuk ka ndonjĂ« gabim sintaksor.

Mund tĂ« shihni 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 administrative

Për default, Tarantool hap një socket, ku kalon teksti ASCII i zakonshëm për menaxhimin e Tarantulit. Lidheni me konsolën gjithmonë nën përdoruesin admin, nuk ka autentifikim, ndaj nuk është e nevojshme ta ekspozoni portin e konsolës për menaxhimin e Tarantulit jashtë.

PĂ«r t'u lidhur nĂ« kĂ«tĂ« mĂ«nyrĂ«, duhet tĂ« shkruani Tarantoolctl enter emri i instancĂ«s. Kjo komandĂ« do tĂ« fillojĂ« konsolĂ«n dhe do tĂ« lidhet nĂ«n pĂ«rdoruesin admin. KurrĂ« mos e ekspozoni portin e konsolĂ«s jashtĂ« — Ă«shtĂ« mĂ« mirĂ« ta lini atĂ« si njĂ« socket unit. KĂ«shtu, mundĂ«sia pĂ«r t'u lidhur me Tarantulin do tĂ« ketĂ« vetĂ«m ata qĂ« kanĂ« akses pĂ«r tĂ« shkruar nĂ« socket.

Kjo metodĂ« Ă«shtĂ« pĂ«r çështje administrative. PĂ«r punĂ«n me tĂ« dhĂ«nat, pĂ«rdorni metodĂ«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 përfshihet autentifikimi.

Për këtë lidhje përdoret tarantoolctl connect to numri i portit. Duke e përdorur atë, mund të lidheni me serverët e largët, të përdorni autentifikimin dhe të jepni të drejta të ndryshme akses.

Regjistrimi i të dhënave dhe moduli Box

Duke qenĂ« se Tarantool Ă«shtĂ« si njĂ« bazĂ« tĂ« dhĂ«nash ashtu edhe njĂ« server aplikacionesh, ai ka module tĂ« ndryshme. Na intereson moduli box — ai e realizon punĂ«n me tĂ« dhĂ«nat. Kur regjistroni diçka nĂ« box, Tarantool shkruan tĂ« dhĂ«nat nĂ« mĂ«nyrĂ« ndihmĂ«se, i ruan nĂ« memorje, ose bĂ«n ndonjĂ« gjĂ« tjetĂ«r me to.

Regjistrimi

Për shembull, hyjmë në moduln box dhe thërrasim funksionin box.once. Kjo do ta detyrojë Tarantool ta ekzekutojë kodin tonë gjatë inicializimit të serverit. Krijojmë një space ku 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')

    -- Ruajmë gjërat të sigurta me parazgjedhje
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

Pas kĂ«saj krijojmĂ« indeksin primar – primary — mbi tĂ« cilin do tĂ« jetĂ« e mundur tĂ« kĂ«rkohen tĂ« dhĂ«nat. NĂ«se nuk specifikohen asnjĂ« parametrat, automatikisht do tĂ« pĂ«rdoret fushĂ« e parĂ« nĂ« çdo regjistrim pĂ«r indeksin primar.

Pastaj bëjmë dhënien e të drejtave për përdoruesin guest, i cili lidhet përmes protokollit binar. Lejojmë të lexojë, shkruajë dhe ekzekutojë në të gjithë instancën.

NĂ« krahasim me bazat e tĂ« dhĂ«nave tradicionale, kĂ«tu gjithçka Ă«shtĂ« mjaft e thjeshtĂ«. Ne kemi njĂ« hapĂ«sirĂ« – njĂ« zonĂ« ku ruajmĂ« tĂ« dhĂ«nat tona. Çdo regjistrim quhet tuple. Ai paketizohet nĂ« formatin MessagePack. Ky format Ă«shtĂ« shumĂ« interesant — Ă«shtĂ« binar dhe zĂ« mĂ« pak hapĂ«sirĂ« – 18 byte pĂ«rballĂ« 27.

Në Tarantool, mund të kombinoni një bazë të dhënash super të shpejtë dhe një aplikacion për punën me to. Kështu është bërë thjesht.

ËshtĂ« shumĂ« e lehtĂ« tĂ« punohet me tĂ«. Pothuajse çdo rresht, çdo regjistrim tĂ« dhĂ«nash mund tĂ« ketĂ« kolona tĂ« ndryshme krejtĂ«sisht.

TĂ« gjitha hapĂ«sirat mund t'i shohim duke pĂ«rdorur komandĂ«n Box.space. PĂ«r tĂ« ndarĂ« njĂ« instancĂ« tĂ« veçantĂ« – shkruajmĂ« box.space example dhe marrim informacionin e plotĂ« pĂ«r tĂ«.

Në Tarantool janë të ndërtuara dy lloje motorësh: Memory dhe Vinyl. Memory ruan të gjitha të dhënat në memorie. Pra, gjithçka funksionon thjesht dhe shpejt. Të dhënat shkarkohen në disk, si dhe ekziston një mekanizëm write ahead log, kështu që ne nuk humbasim asgjë në rast të dështimit të serverit.

Vinyl ruan tĂ« dhĂ«nat nĂ« disk nĂ« njĂ« format mĂ« tĂ« njohur pĂ«r ne — qĂ« do tĂ« thotĂ« se mund tĂ« ruajmĂ« mĂ« shumĂ« tĂ« dhĂ«na sesa kemi memorie, 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 fillestar pĂ«r çdo hapĂ«sirĂ«, sepse pa tĂ«, asgjĂ« nuk do tĂ« funksionojĂ«. Si nĂ« çdo bazĂ«, ne krijojmĂ« fushĂ«n e parĂ« – ID e regjistrimit.

Pjesët:

KĂ«tu specifikojmĂ« 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 tĂ«rĂ« pozitiv. Sa mbaj mend nga dokumentacioni, numri maksimal qĂ« mund tĂ« jetĂ« – 18 kvintilionĂ«. Kjo Ă«shtĂ« njĂ« shumĂ« e madhe.

Pastaj mund të fusim 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 primar, prandaj ajo duhet të jetë unike. Nuk kemi kufizime mbi numrin e kolonave, kështu që mund të fusim sa më shumë të dhëna që të duam. Ato specifikohen në formatin MessagePack, të cilin e përshkrova më sipër.

Shfaqja e të dhënave

Më pas, ne mund të shfaqim të dhënat me komandën select.

Box.example.select me specifikimin e çelĂ«sit {1} do tĂ« shfaqĂ« regjistrimin e nevojshĂ«m. NĂ«se e lĂ«mĂ« çelĂ«sin mĂ«njanĂ«, do tĂ« shohim tĂ« gjitha regjistrimet qĂ« kemi. Ato janĂ« tĂ« ndryshme nĂ« numrin e kolonave, por kĂ«tu nĂ« parim nuk ka kuptim kolonash — ka numrat e fushave.

Mund të ketë një numër të pakufizuar të të dhënave. Dhe për shembull, na nevojitet të kërkojmë ato sipas fushës së dytë. Për këtë, krijojmë një indeks të ri ndihmës.


box.space.example:create_index(‘secondary’, { type = ‘TREE’, unique = false, parts = {{field = 2, type =’string’}}}) 

Përdorim komandën Create_index.
E quajmë Ndihmës.

Pas kĂ«saj, duhet tĂ« specifikojmĂ« parametrat. Lloji i indeksit — TREE. Ai mund tĂ« mos jetĂ« unik, prandaj vendosim Unique = false.

Pastaj specifikojmĂ« nga cila pjesĂ« pĂ«rbĂ«het indeksi ynĂ«. Field — Ă«shtĂ« numri i fushĂ«s, tĂ« cilit i lidhemi indeksit, dhe e specifikojmĂ« tipin string. Dhe ky Ă«shtĂ« krijuar.

unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unik: false
  pjesët:
  - tipi: string
    është_nullable: false
    numri_i_fushës: 2
  id: 1
  id_hapsirës: 512
  tipi: TREE
  emri: secondary
...

unix/:/var/run/tarantool/example.control>

Tani mund ta thërrasim këtë në këtë mënyrë:

unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...

Ruajtja

NĂ«se e rihapim instancĂ«n dhe pĂ«rpiqemi tĂ« thĂ«rrasim tĂ« dhĂ«nat pĂ«rsĂ«ri — do tĂ« shohim se ato s'kanĂ« — gjithçka Ă«shtĂ« bosh. Kjo ndodh sepse Tarantool bĂ«n pikup dhe ruan tĂ« dhĂ«nat nĂ« disk, por nĂ«se e ndalojmĂ« punĂ«n pĂ«rpara ruajtjes sĂ« fundit, do tĂ« humbim tĂ« gjitha operacionet — sepse do tĂ« rikthehemi nga pikuperi i fundit, qĂ« ishte, pĂ«r shembull, dy orĂ« mĂ« parĂ«.

TĂ« ruajmĂ« çdo sekondĂ« gjithashtu nuk do tĂ« funksionojĂ« — sepse tĂ« dumposh vazhdimisht nĂ« disk 20 Gb — Ă«shtĂ« njĂ« ide e dobĂ«t.

Për këtë u konceptua dhe u zbatua koncepti i write-ahead log. Me ndihmën e saj, për çdo ndryshim në të dhëna krijohet një regjistrim në një skedar të vogël write-ahead log.

Çdo regjistrim deri nĂ« pikĂ«n e kontrollit ruhet nĂ« to. PĂ«r kĂ«to skedarĂ« ne vendosim njĂ« madhĂ«si - pĂ«r shembull, 64 mb. Kur mbushet, regjistrimi fillon tĂ« kalojĂ« nĂ« skedarin e dytĂ«. Dhe pas rinisjes, Tarantool rikthehet nga pika e fundit e kontrollit dhe pastaj aplikon tĂ« gjitha transaksionet mĂ« tĂ« vonshme deri nĂ« momentin e ndalimit.

Në Tarantool, mund të kombinoni një bazë të dhënash super të shpejtë dhe një aplikacion për punën me to. Kështu është bërë thjesht.

Për të bërë një regjistrim të tillë, duhet të përcaktoni një opsion në cilësimet e box.cfg (në skedarin example.lua):

wal_mode = “write”;

Përdorimi i të dhënave

Me atë që shkruam tani, mund të përdorni Tarantul për ruajtjen e të dhënave, dhe ai do të punojë shumë shpejt si një DB. Dhe tani, siç thonë, veshja më e mirë është se çfarë mund të bëjmë me të gjitha këto.

Shkruajmë aplikacionin

Për shembull, do të shkruajmë një aplikacion të tillë për Tarantul

Aplikacionin shihni nën spojlerin

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 vendosni grantet
box.once('replica', bootstrap)

-- aktivizimi i aksesit 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ëve 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 pohojme një tabelë në lua, e cila përcakton simbolet. Kjo tabelë është e nevojshme për të gjeneruar një varg 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
end

Pas kĂ«saj ne shpallim funksionin – randomString dhe i japim si parametĂ«r 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)]
end

MĂ« pas lidhim http-router dhe http-server nĂ« serverin tonĂ« Tarantula, JSON qĂ« do t’i dĂ«rgojmĂ« klientit.

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

Pas kësaj nisim serverin http në portin 8080 në të gjithë ndërfaqet, i cili do të regjistrojë të gjithë kërkesat dhe gabimet.

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

MĂ« pas shpallim route, qĂ« nĂ«se nĂ« portin 8080 /count vjen njĂ« kĂ«rkesĂ« me metodĂ«n GET, ne thĂ«rrasim njĂ« funksion me njĂ« rresht. Ai kthen statusin — 200, 404, 403 ose ndonjĂ« tjetĂ«r qĂ« do tĂ« specifikojmĂ«.

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

Në trup ne kthejmë json.encode, ku tregojmë count dhe getcount, që 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ë vargun router:route({method = 'GET', path = '/token'}, function() ne thërrasim funksionin dhe gjenerojmë token-in.

Vargu local token = randomString(32) – Ă«shtĂ« njĂ« varg rastĂ«sor me 32 simbole.
NĂ« rreshtin local last = box.space.example:len() ne nxjerrim elementin e fundit.
Dhe në vargun box.space.example:insert{ last + 1, token } ne regjistrojmë të dhënat në bazën tonë, që do të thotë se vetëm rrisim ID-në me 1. Kjo mund të bëhet, përveç kësaj, jo vetëm në këtë mënyrë të çuditshme. Në Tarantula ka sekonda për këtë punë.

Ne regjistrojmë token-in atje.

Kështu, ne në një skedë shkruam aplikacionin. Në të mund të lidhemi menjëherë me të dhënat, dhe moduli box do ta bëjë gjithë punën e ndyrë për ju.

Ajo dĂ«gjon http dhe punon me tĂ« dhĂ«nat, gjithçka gjendet nĂ« njĂ« instancĂ« tĂ« vetme — si aplikacioni, ashtu edhe tĂ« dhĂ«nat. Prandaj, gjithçka ndodh mjaft shpejt.

Për të nisur, ne instalojmë modulin http:

Si e bëjmë këtë, shihni nën spoilerin.

root@test2:/# tarantoolctl rocks instalo http
Duke instalimi http://rocks.tarantool.org/http-scm-1.src.rock
Mungesat e varësive 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

Duke klonuar në 'checks'...
remote: Duke enumeruar objektet: 28, përfunduar.
remote: Duke numëruar objektet: 100% (28/28), përfunduar.
remote: Duke kompresuar objektet: 100% (19/19), përfunduar.
remote: Totali 28 (delta 1), ri-përdorur 16 (delta 1), pak-riu në 0
Duke marrë objektet: 100% (28/28), 12.69 KiB | 12.69 MiB/s, përfunduar.
Duke zgjidhur deltat: 100% (1/1), përfunduar.
Shënim: duke kontrolluar '580388773ef11085015b5a06fe52d61acf16b201'.

Jeni në gjendje 'detached HEAD'. Mund të shikoni rreth, të bëni ndryshime eksperimentale
dhe t'i angazhoni ato, dhe mund të hidhni poshtë çdo angazhim që bëni në këtë
gjendje pa ndikuar në asnjë degë duke bërë një checkout tjetër.

Nëse dëshironi të krijoni një degë të re për të mbajtur angazhimet që krijoni, mund të
bëni kështu (tani ose më vonë) duke përdorur -b me komandën e checkout-it përsëri. Shembull:

  git checkout -b <emri-i-degës-së-re>

Nuk ka manifest ekzistues. 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
-- Kontrolloni për kompajlerin C që punon: /usr/bin/cc
-- Kontrolloni për kompajlerin C që punon: /usr/bin/cc -- funksionon
-- Duke identifikuar informacionin ABI të kompajlerit C
-- Duke identifikuar informacionin ABI të kompajlerit C - përfunduar
-- Duke identifikuar karakteristikat e kompajluesit C
-- Duke identifikuar karakteristikat e kompajluesit C - përfunduar
-- Gjetur TARANTOOL: /usr/include (gjeti 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 është përfunduar
-- Generimi është përfunduar
CMake Paralajmërim:
  Variablat e specifikuara manualisht nuk u përdorën nga projekti:

    version


-- Skedarët e ndërtimit janë shkruar në: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Skanojmë varësitë e objektit httpd
[ 50%] Duke ndërtuar objektin 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: paralajmërim: kjo deklaratë 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 tĂ« makros ‘luaL_addchar’
       luaL_addchar(b, '\');
       ^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: shënim: këtu
      përjashtim:
      ^~~~~~~
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: paralajmërim: kjo deklaratë 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: paralajmërim: kjo deklaratë 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: paralajmërim: kjo deklaratë 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 përfundoi
[100%] Ndërtimi i objektit httpd përfundoi
Instaloni 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:/#

Po gjithashtu për të filluar na nevojitet prometheus:

root@test2:/# tarantoolctl rocks install prometheus
Instalimi http://rocks.tarantool.org/prometheus-scm-1.rockspec

Duke klonuar 'prometheus'...
remote: Numërimi i objekteve: 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), rishtet 5 (delta 0), paketë e rishtet 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ë qasjejme te modulët

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 ĐČыЎаДт Ń‚ĐŸĐșĐ”Đœ Đž ЎДлаДт Đ·Đ°ĐżĐžŃŃŒ ŃŃ‚ĐŸĐłĐŸ Ń‚ĐŸĐșĐ”ĐœĐ° ĐČ Đ±Đ°Đ·Ńƒ.

Po testojmë shpejtësinë

Le të fillojmë një benchmark me 50,000 kërkesa. Kërkesa konkurrente do të jenë 500.

root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
Ky është ApacheBench, Version 2.3 <$Revision: 1807734 $>
Kopje 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licencuar për The Apache Software Foundation, http://www.apache.org/

Po testojmë 127.0.0.1 (bëni durim)
Këto janë përfunduar 5000 kërkesa
Këto janë përfunduar 10000 kërkesa
Këto janë përfunduar 15000 kërkesa
Këto janë përfunduar 20000 kërkesa
Këto janë përfunduar 25000 kërkesa
Këto janë përfunduar 30000 kërkesa
Këto janë përfunduar 35000 kërkesa
Këto janë përfunduar 40000 kërkesa
Këto janë përfunduar 45000 kërkesa
Këto janë përfunduar 50000 kërkesa
Përfundoi 50000 kërkesa


Programi i Serverit:        Tarantool
Emri i Serverit:        127.0.0.1
Porti i Serverit:            8080

Rruga e Dokumentit:          /token
Gjatësia e Dokumentit:        44 byte

Niveli i Pjesëmarrjes:      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 e 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, në të gjithë kërkesat e njëkohshme)
Shpejtësia e transfertës:          532.57 [Kbytes/sec] e pranuar

Koha e Lidhjeve (ms)
              min  mesatare[+/-sd] mesatare   max
Lidhja:        0   10 103.2      0    3048
Përpunimi:    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 po shkruhen. Dhe ne vazhdojmë të regjistrojmë të dhënat. 99% e kërkesave u realizuan në 42 milisekonda. Përkatësisht, kemi rreth 3500 kërkesa në sekondë në një makinë të vogël, ku ka 2 bërthama dhe 4 gigabajt memorje.

Gjithashtu mund të zgjidhni ndonjë token 50000 dhe të shihni vlerën e tij.

Mund tĂ« pĂ«rdorni jo vetĂ«m http, tĂ« aktivizoni funksione sfondore qĂ« pĂ«rpunojnĂ« tĂ« dhĂ«nat tuaja. Plus ka triggers tĂ« ndryshĂ«m. PĂ«r shembull, mund tĂ« thĂ«rrisni funksione nĂ« pĂ«rditĂ«sime, tĂ« kontrolloni diçka – tĂ« rregulloni konflikte.

Mund të shkruani aplikacione-skripte direkt në serverin e bazës së të dhënave, pa asnjë limit, duke lidhur çdo modul dhe duke realizuar çdo logjikë.

Serveri i aplikacionit mund të komunikojë me servera 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ë Tarantula, dhe nuk do të duhet të shkruani një aplikacion të veçantë.

Në përfundim

Ky është vetëm një pjesë e parë e një pune të madhe. Pjesa e dytë do të publikohet shumë shpejt në blogun e Mail.ru Group, dhe ne do të shtojmë patjetër një lidhje në këtë material.

Nëse jeni të interesuar për të vizituar ngjarje ku ne krijojmë këto gjëra online dhe të bëni pyetje në kohë reale, lidheni me kanalin DevOps by REBRAIN.

Nëse ju nevojitet ndihmë për migrimin në cloud ose keni pyetje për infrastrukturën tuaj, mos hezitoni të lëni një kërkesë.

P.S. Ne kemi 2 audita falas në muaj, ndoshta projekti juaj do të jetë në mesin e tyre.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster