Tarantoolis saab ĂŒhildada ĂŒlikiire andmebaasi ja rakenduse nende jaoks. Nii on see lihtsalt tehtud

Viis aastat tagasi proovisin ma Tarantooliga töötada, kuid siis ei olnud see mulle sobiv. Hiljuti aga viisin lĂ€bi veebiseminari, kus rÀÀkisin Hadoopist ja selle MapReduce'i toimimisest. Seal kĂŒsiti minult kĂŒsimus – "Miks mitte kasutada selle ĂŒlesande jaoks Tarantooli?".

Huvi pĂ€rast otsustasin selle juurde tagasi pöörduda, testisin viimast versiooni – ja seekord meeldis projekt mulle vĂ€ga. Praegu nĂ€itan, kuidas kirjutada Tarantoolis lihtne rakendus, koormata seda ja kontrollida jĂ”udlust ning nĂ€ete, kui lihtne ja Ă€ge see kĂ”ik on.

Tarantoolis saab ĂŒhildada ĂŒlikiire andmebaasi ja rakenduse nende jaoks. Nii on see lihtsalt tehtud

Mis on Tarantool

Tarantool positsioneerib end ĂŒlikiire andmebaasina. Sinna saab sisestada igasuguseid andmeid, mida soovite. Lisaks saab neid replikeerida, sharding'ida – st jagada tohutut hulka andmeid mitmele serverile ja ĂŒhendada nende tulemused – teha talitlushĂ€irete kindlaid seoseid tĂŒĂŒpi "master-master".

Teiseks on see rakendusserver. Te saate kirjutada seal oma rakendusi, töötada andmetega, nÀiteks kustutada taustal vanu kirjeid vastavalt teatud reeglitele. VÔite kirjutada otse Tarantoolis HTTP-serveri, mis töötab andmetega: edastab nende arvu, salvestab sinna uusi andmeid ja redutseerib seda kÔike masterile.

Lugesin artiklit, kuidas pojad tegid 300 rea pikkuse sĂ”numijĂ€rje, mis lihtsalt tormab ja rebib – nende minimaalne jĂ”udlus on 20 000 sĂ”numit sekundis. Siin saab tĂ”eliselt avarduda ja kirjutada vĂ€ga suure rakenduse, ja need ei ole Postgresi sarnased salvestused.

Umbes sellist serverit, ainult lihtsat, pĂŒĂŒan ma selles artiklis kirjeldada.

Paigaldamine

Testimiseks lĂ”in kolm standardset virtuaalmasinat – kĂ”vaketas 20 gigabaiti, Ubuntu 18.04. 2 virtuaalset CPU-d ja 4 gigabaiti mĂ€lu.

Me paigaldame Tarantooli – kĂ€ivitame shelli skripti vĂ”i lisame hoidla ja teeme apt get install Tarantool. Link skripti jaoks – (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Meil on nĂŒĂŒd sellised kĂ€sklused nagu:

tarantoolctl – peamine kĂ€sk Tarantooli instantside haldamiseks.
/etc/tarantool – siin on kogu konfiguratsioon.
var/log/tarantool – siin on logid.
var/lib/tarantool – siin on andmed, ja need on edaspidi jagatud instantside vahel.

On leiad kaustad instance-available ja instance-enabled — neis asub see, mis kĂ€ivitub — instantsi konfiguratsioonifail, kus on kirjas, millistel portidel ta kuulab, kui palju mĂ€lu tal on, Vinyli mootori seadistused, kood, mis kĂ€ivitub serveri kĂ€ivitamisel, sharding, jĂ€rjekorrad, aegunud andmete eemaldamine ja nii edasi.

Instantsid töötavad nagu PostgreS. NĂ€iteks soovite kĂ€ivitada mitu koopiat andmebaasist, mis on erinevatel portidel. Nii saab ĂŒhel serveril töötada mitu andmebaasi instantsi, mis on erinevatel portidel. Neil vĂ”ivad olla tĂ€iesti erinevad seadistused — ĂŒks instants rakendab ĂŒhte loogikat, teine — teist.

Instantside haldamine

Meil on kĂ€sk tarantoolctl, mis vĂ”imaldab hallata Tarantuule instantsid. NĂ€iteks, tarantoolctl check example kontrollib konfiguratsioonifaili ja ĂŒtleb — fail on ok, kui seal ei ole sĂŒntaktilisi vigu.

Saate vaadata instantsi staatust — tarantoolctl status example. Samamoodi saab teha start, stop, restart.

Kui instants on kĂ€ivitunud, saab sellele ĂŒhenduda kahel viisil.

1. Halduse konsool

Vaikimisi avab Tarantool sokli, kuhu edastatakse tavaline ASCII-tekst Tarantuuli haldamiseks. Ühendus konsooliga toimub alati kasutaja admin all, seal ei ole autentimist, seetĂ”ttu ei pea konsooli porti Tarantuuli haldamiseks vĂ€lja viima.

Selle viisi jaoks tuleb sisestada Tarantoolctl enter instance name. KĂ€sk kĂ€ivitab konsooli ja ĂŒhendub kasutaja admin all. Ärge kunagi avage konsooli porti vĂ€lismaailmale — parem jĂ€tke see unit-soketiks. Siis saab Tarantuulile ĂŒhenduda ainult neil, kellel on sukeldus soketisse.

See viis on vajalik haldusĂŒlesannete jaoks. Andmete töötlemiseks kasutage teist viisi — binaarprotokolli.

2. Binaarprotokolli kasutamine kindla portaali jaoks ĂŒhendumiseks

Konfiguratsioonis on direktiiv listen, mis avab portaali vĂ€listeks suheldamiseks. Seda portaali kasutatakse binaarprotokolliga ja seal on sisse lĂŒlitatud autentimine.

Selle ĂŒhenduse jaoks kasutatakse tarantoolctl connect to port number. Selle abil saab ĂŒhenduda kaugserveritega, kasutada autentimist ja anda erinevaid juurdepÀÀsuĂ”igusi.

Andmete salvestamine ja Box moodul

Kuna Tarantool on nii andmebaas kui ka rakenduste server, on seal erinevad moodulid. Meid huvitab moodul box — see teostab andmetega töötamise. Kui kirjutate midagi box'i, salvestab Tarantool andmed kettale, hoiab neid mĂ€lus vĂ”i teeb nendega midagi muud.

Kirjutamine

NÀiteks siseneme moodulisse box ja kutsume esile funktsiooni box.once. See paneb Tarantooli kÀivitama meie koodi serveri initsialiseerimisel. Loome space'i, kus meie andmed salvestatakse.

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')
    box.schema.user.grant('guest', 'read,write,execute', 'universe')

    -- Hoidke asju vaikimisi turvaliselt
    --  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Ă€rast seda loome esmase indeksi – primary – mille abil saame andmeid otsida. Vaikimisi, kui mingeid parameetreid ei mÀÀra, kasutatakse iga kirje esimest vĂ€li primaarindeksi jaoks.

SeejĂ€rel teeme kĂŒlalisele guest Ă”iguste andmise, millega me ĂŒhenduse loome binaarprotokolli kaudu. Lubame lugeda, kirjutada ja tĂ€ita kĂ”ikjal instantsis.

Kui vĂ”rrelda tavapĂ€raste andmebaasidega, siis siin on kĂ”ik ĂŒsna lihtne. Meil on space – ala, kus meie andmed lihtsalt asuvad. Iga kirje nimetatakse tupikuks. See pakitakse MessagePack formaati. See on vĂ€ga lahe formaat — see on binaarne ja vĂ”tab vĂ€hem ruumi – 18 baiti versus 27.

Tarantoolis saab ĂŒhildada ĂŒlikiire andmebaasi ja rakenduse nende jaoks. Nii on see lihtsalt tehtud

Seda on ĂŒsna mugav kasutada. Peaaegu iga rida, iga andmekirje vĂ”ib omada tĂ€iesti erinevaid veerge.

Saame vaadata kÔiki space'e kÀsu Box.space abil. Konkreetse instantsi eristamiseks kirjutame box.space example ja saame selle kohta tÀieliku teabe.

Tarantoolis on sisse ehitatud kaks tĂŒĂŒpi jĂ”u- ja andmebaasi mootoreid: Memory ja Vinyl. Memory salvestab kĂ”ik andmed mĂ€llu. SeetĂ”ttu töötab kĂ”ik lihtsalt ja kiiresti. Andmed kirjutatakse kettale, samuti on olemas write ahead log mehhanism, mistĂ”ttu me ei kaota midagi serveri krahhi korral.

Vinyl salvestab andmed kettale tuttavamal kujul — see tĂ€hendab, et saame salvestada rohkem andmeid, kui meil on mĂ€lu, ja Tarantool loeb neid kettalt.

Praegu hakkame kasutama 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>

Indeks:

Esimene indeks tuleb luua igas ruumis, sest ilma selleta ei tööta miski. Nagu igas andmebaasis, loome me esimese vÀlja - kirje ID.

Osad:

Siin nĂ€itame, millest meie indeks koosneb. See koosneb ĂŒhest osast - esimesest vĂ€ljast, mida me kasutame, tĂŒĂŒp unsigned - positiivne tĂ€isarv. Kui ma Ă”igesti mĂ€letan dokumentatsioonist, siis on maksimaalne arv 18 kvadrillionit. Üksjagu palju.

Edasi saame andmeid sisestada kÀsuga 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>

Esimene vÀli kasutatakse primaarse vÔtmena, seega peab see olema ainulaadne. Me ei ole piiratud veergude arvuga, seega saame sinna sisestada nii palju andmeid kui soovime. Need on esitatud MessagePack formaadis, millest ma eespool rÀÀkisin.

Andmete vÀljastamine

Edasi saame andmeid vÀljastada kÀsuga select.

Box.example.select, kus on vÔti {1}, vÀljastab vajaliku kirje. Kui jÀtame vÔtme vahele, siis nÀeme kÔiki meie olemasolevaid kirjeid. Need erinevad veergude arvu poolest, kuid siin pole pÔhimÔtteliselt veergude mÔistet - on vÀlja numbrid.

Andmeid vÔib olla absoluutselt kuidas palju. Ja nÀiteks, kui peame neid otsima teise vÀlja jÀrgi. Selleks loome uue teise indeksi.


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

Kasutame kÀsku Create_index.
Anname sellele nimeks Secondary.

PĂ€rast seda tuleb nĂ€idata parameetreid. Indeksi tĂŒĂŒp on TREE. See ei pruugi olla ainulaadne, seega sisestame Unique = false.

SeejĂ€rel nĂ€itame, millest meie indeks koosneb. Field - see on vĂ€lja number, millega me indeksi seome, ja nĂ€itame tĂŒĂŒbi string. Ja siin see on loodud.

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>

NĂŒĂŒd saame seda kutsuda jĂ€rgmiselt:

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

Salvestamine

Kui me instantsi taaskĂ€ivitame ja proovime andmeid uuesti kutsuda — siis nĂ€eme, et neid pole — kĂ”ik on tĂŒhi. Nii juhtub, kuna Tarantool teeb kontrollpunktid ja salvestab andmed kettale, kuid kui me peatame töö enne jĂ€rgmise salvestamise toimumist, siis kaotame kĂ”ik toimingud — sest taastume viimases kontrollpunktis, mis oli, nĂ€iteks, kaks tundi tagasi.

Iga sekundi jÀÀdvustamine ei tule ka kĂ”ne alla — sest pidev 20 GB andmete kettale kirjutamine ei ole just parim idee.

Selleks mÔeldi ja rakendati ette kirjutamise logi (write-ahead log) kontseptsioon. Selle abil luuakse iga andmete muutuse jaoks sissekanne vÀikeses ette kirjutamise logi failis.

Iga sissekanne enne kontrollpunkti salvestatakse neisse. Nende failide jaoks seadistame suuruse — nĂ€iteks 64 MB. Kui see tĂ€itub, algab kirjutamine teise faili. Ja pĂ€rast taaskĂ€ivitamist taastab Tarantool end viimastest kontrollpunktidest ja hakkab siis ĂŒles laadima kĂ”iki hilisemaid tehinguid kuni peatamiseni.

Tarantoolis saab ĂŒhildada ĂŒlikiire andmebaasi ja rakenduse nende jaoks. Nii on see lihtsalt tehtud

Selle kirjutamise teostamiseks tuleb box.cfg seadetes (failis example.lua) nÀidata jÀrgmist valikut:

wal_mode = “write”;

Andmete kasutamine

Sellega, mis me just kirjutasime, vĂ”ite kasutada Tarantooli andmete salvestamiseks, ja see töötab vĂ€ga kiiresti nagu andmebaas. Ja nĂŒĂŒd kĂ”ige tĂ€htsam - mis kĂ”ik selle kĂ”igega teha saab.

Kirjutame rakenduse

NĂ€iteks kirjutame Tarantooli jaoks sellise rakenduse

Rakendust vaadake spoileris

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()

Me deklareerime Luuas teatud tabeli, mis mÀÀratleb sĂŒmbolid. Seda tabelit on vaja juhusliku stringi genereerimiseks.

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Ă€rast seda deklareerime funktsiooni – randomString ja anname selle parameetriks pikkuse vÀÀrtuse.

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

SeejĂ€rel ĂŒhendame http-routeri ja http-serveri meie Tarantooliserveriga, samuti JSON-i, mida edastame kliendile.

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

PÀrast seda kÀivitame http serveri sadamal 8080 kÔigis liideses, mis logib kÔik pÀringud ja vead.

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

SeejĂ€rel kuulutame vĂ€lja marsruudi, et kui sadamasse 8080 /count tuleb GET-pĂ€ring, siis kutsume vĂ€lja ĂŒhe rea funktsiooni. See tagastab staatuse — 200, 404, 403 vĂ”i mis tahes muu, mida me mÀÀrame.

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

Kehas tagastame json.encode, kus me mÀÀrame count ja getcount, mis kutsutakse vÀlja ja nÀitab meie andmebaasis kirjeid.

Teine meetod

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)

Kus reas router:route({method = ‘GET’, path = ‘\/token’}, function() kutsume vĂ€lja funktsiooni ja genereerime tokeni.

Rida local token = randomString(32) – see on 32 tĂ€hemĂ€rgist koosnev juhuslik string.
Reas local last = box.space.example:len() saame viimase elemendi.
Ja reas box.space.example:insert{ last + 1, token } salvestame oma andmebaasi andmed, see tÀhendab lihtsalt ID suurendamist 1 vÔrra. Seda saab tegelikult teha ka mitte ainult sellise toore meetodiga. Tarantulos on selleks jÀrjestused.

Salvestame sinna tokeni.

Nii oleme ĂŒhes failis kirjutanud rakenduse. Sellega saab kohe andmetega suhelda ning moodul box teeb kogu musta töö teie eest.

See kuulab http ja töötab andmetega, kĂ”ik on ĂŒhes instantsis — nii rakendus kui andmed. SeetĂ”ttu toimub kĂ”ik piisavalt kiiresti.

KĂ€ivitusel installime http mooduli:

Kuidas me seda teeme, vaadake spoilerist

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 

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:~/#

Samuti vajame prometheuse kÀivitamiseks:

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 on nĂŒĂŒd installitud .rocks (license: BSD)

root@test2:/$

KÀivitame ja saame moodulitele juurde pÀÀseda

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

Testime kiirus

KÀivitame 50 000 pÀringu bÀnkmargi. Konkurentsi pÀringute arv on 500.

root@test2:/$ ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 
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:/$

Tokenid vÀljastatakse. Ja me salvestame pidevalt andmeid. 99% pÀringutest töötas 42 millisekundi jooksul. Seega, meil on umbes 3500 pÀringut sekundis vÀiksemas masinas, kus on 2 tuuma ja 4 gigabaiti mÀlu.

Saame ka valida mÔne 50000-tokeni ja vaadata selle vÀÀrtust.

Saame kasutada mitte ainult http-d, vaid ka kÀivitada taustfunktsioone, mis töötlevad teie andmeid. Lisaks on erinevaid kÀivitajaid. NÀiteks saate kutsuda funktsioone uuendustel, et midagi kontrollida - lahendada konflikte.

Otse serveri andmebaasis saab kirjutada rakendusskripte, ilma piiranguteta, ĂŒhendades mis tahes mooduleid ja teostades mis tahes loogikat.

Rakendusse server saab pöörduda vÀliste serverite poole, tooma andmeid ja salvestama need enda andmebaasi. Need andmed tulevad teistes rakendustes kasutusele.

Seda teeb ise Tarantool, nii et eraldi rakendust kirjutama ei pea.

KokkuvÔtteks

See on vaid esimene osa suurest tööst. Teine osa avaldatakse varsti Mail.ru Groupi blogis, ja me lisame kindlasti sellele materjalile lingi.

Kui teil on huvi osaleda ĂŒritustel, kus me internetis selliseid asju loome ja reaalajas kĂŒsimusi esitada, liituge kanaliga DevOps by REBRAIN.

Kui vajate ĂŒleminekut pilve vĂ”i teil on kĂŒsimusi oma infrastruktuuri kohta, vĂ”ite julgelt esitada taotluse.

P.S. Meil on iga kuu 2 tasuta auditi vÔimalust, vÔib-olla on just teie projekt nende seas.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster