Në Tarantool mund të bashkosh një bazë të dhënash super të shpejtë me një aplikacion për punë me to. Ja se si realizohet kaq lehtë.

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.

Në Tarantool mund të bashkosh një bazë të dhënash super të shpejtë me një aplikacion për punë me to. Ja se si realizohet kaq lehtë.

Ç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 https://tarantool.io/installer.sh | 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')
end

Pas 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.

Në Tarantool mund të bashkosh një bazë të dhënash super të shpejtë me një aplikacion për punë me to. Ja se si realizohet kaq lehtë.

Ë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.

Në Tarantool mund të bashkosh një bazë të dhënash super të shpejtë me një aplikacion për punë me to. Ja se si realizohet kaq lehtë.

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
end

Pas 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)]
end

Pastaj 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 kanalin DevOps by REBRAIN.

Nëse keni nevojë për një kalim në cloud ose keni pyetje në lidhje me infrastrukturën tuaj, mos hezitoni të lini një kërkesë.

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

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster