I Tarantool kan du kombinera en super snabb databas med applikationer för att arbeta med dem. SÄ hÀr enkelt Àr det att göra.

För fem Ă„r sedan försökte jag arbeta med Tarantool, men dĂ„ passade det mig inte. Men nyligen deltog jag i ett webbseminarium dĂ€r jag pratade om Hadoop, om hur MapReduce fungerar. DĂ€r fick jag frĂ„gan — "Varför anvĂ€nda Tarantool för den hĂ€r uppgiften?".

Av nyfikenhet bestĂ€mde jag mig för att Ă„terkomma till det, testa den senaste versionen — och den hĂ€r gĂ„ngen tyckte jag mycket om projektet. Nu ska jag visa hur man skriver en enkel applikation i Tarantool, belastar den och kontrollerar prestandan, och ni kommer att se hur enkelt och bra allt Ă€r dĂ€r.

I Tarantool kan du kombinera en super snabb databas med applikationer för att arbeta med dem. SÄ hÀr enkelt Àr det att göra.

Vad Àr Tarantool?

Tarantool positionerar sig som en super snabb databas. Du kan stoppa in vilka data som helst som du vill. Dessutom kan du replikera dem, sharda — det vill sĂ€ga fördela en enorm mĂ€ngd data över flera servrar och kombinera resultaten frĂ„n dem — göra failover-lösningar som "master-master".

För det andra Àr det en applikationsserver. Du kan skriva dina egna applikationer, arbeta med data, till exempel ta bort gamla poster i bakgrunden enligt vissa regler. Du kan skriva en HTTP-server direkt i Tarantool som kommer att arbeta med data: ge ut mÀngden, registrera nya data och reducera allt detta till en master.

Jag lĂ€ste en artikel om hur killarna gjorde en meddelandekö pĂ„ 300 rader, som helt enkelt sliter och river — de har en minimitakt pĂ„ 20 000 meddelanden per sekund. HĂ€r kan man verkligen utvecklas och skriva en mycket stor applikation, och dessa kommer inte att vara lagrades, som i PostgreS.

En ungefÀr sÄdan server, bara enklare, kommer jag att försöka beskriva i den hÀr artikeln.

Installation

För testet skapade jag tre vanliga virtuella maskiner — en hĂ„rddisk pĂ„ 20 gigabyte, Ubuntu 18.04, 2 virtuella CPU:er och 4 gigabyte minne.

Vi installerar Tarantool — kör ett skript i bash eller lĂ€gger till ett repository och gör apt get install Tarantool. LĂ€nk till skriptet — (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Vi fĂ„r kommandon som:

tarantoolctl — huvudkommandot för att hantera Tarantool-instanser.
/etc/tarantool — hĂ€r ligger all konfiguration.
var/log/tarantool — hĂ€r ligger loggarna.
var/lib/tarantool — hĂ€r ligger data, och vidare Ă€r de uppdelade efter instanser.

Det finns mapparna instance-available och instance-enable — i den finns det som kommer att köras — konfigurationsfilen för instansen med lua-kod, dĂ€r det beskrivs vilka portar den lyssnar pĂ„, vilket minne som Ă€r tillgĂ€ngligt, instĂ€llningarna för motorn Vinyl, koden som körs nĂ€r servern startar, sharding, köer, borttagning av förĂ„ldrad data och sĂ„ vidare.

Instanser fungerar som i PostgreS. Till exempel, om du vill starta flera kopior av en databas som körs pĂ„ olika portar. Det innebĂ€r att flera instanser av databaser startar pĂ„ en och samma server, som körs pĂ„ olika portar. De kan ha helt olika instĂ€llningar — en instans implementerar en logik, den andra en annan.

Hantera instanser

Vi har kommandot tarantoolctl, som gör det möjligt att hantera Tarantool-instanser. Till exempel, tarantoolctl check example kontrollerar konfigurationsfilen och sĂ€ger – filen Ă€r okej, om det inte finns nĂ„gra syntaktiska fel.

Du kan se statusen för instansen — tarantoolctl status example. PĂ„ samma sĂ€tt kan du göra start, stopp, omstart.

NÀr instansen Àr igÄng kan du ansluta pÄ tvÄ sÀtt.

1. Administrationskonsol

Som standard öppnar Tarantool en socket, dÀr vanlig ASCII-text överförs för att hantera Tarantool. Anslutningen till konsolen sker alltid som anvÀndaren admin, det finns ingen autentisering, sÄ att öppna konsolporten för Ätkomst till Tarantool utanför behövs inte.

För att ansluta pĂ„ detta sĂ€tt mĂ„ste du skriva Tarantoolctl enter instance name. Kommandot startar konsolen och ansluter som anvĂ€ndaren admin. Exponera aldrig konsolporten utĂ„t — det Ă€r bĂ€ttre att lĂ€mna den som en enhetssocket. DĂ„ kan endast de som har skrivrĂ€ttighet i socketen ansluta till Tarantool.

Denna metod behövs för administrativa saker. För att arbeta med data, anvĂ€nd den andra metoden — det binĂ€ra protokollet.

2. AnvÀndning av det binÀra protokollet för att ansluta till en specifik port

I konfigurationen finns direktivet listen, som öppnar en port för externa kommunikationer. Denna port anvÀnds med det binÀra protokollet, och autentisering Àr aktiverad.

För denna anslutning anvÀnds tarantoolctl connect to port number. Med den kan du ansluta till externa servrar, anvÀnda autentisering och tilldela olika behörigheter.

Skrivning av data och modul Box

Eftersom Tarantool bĂ„de Ă€r en databas och en applikationsserver finns det olika moduler i den. Vi Ă€r intresserade av box-modulen — den hanterar data. NĂ€r du skriver nĂ„got i box, skriver Tarantool data till disk, sparar dem i minnet eller gör nĂ„got annat med dem.

Skriv

Till exempel gÄr vi in i box-modulen och anropar funktionen box.once. Den fÄr Tarantool att köra vÄr kod vid serverinitiering. Vi skapar en space dÀr vÄra data kommer att lagras.

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

    -- HÄll allt sÀkert som standard
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

DĂ€refter skapar vi ett primĂ€rt index – primary — som kan anvĂ€ndas för att söka data. Som standard, om inga parametrar anges, kommer det första fĂ€ltet i varje post att anvĂ€ndas för primĂ€rindexet.

Sedan ger vi grant till anvÀndaren guest, som vi ansluter med via det binÀra protokollet. Vi tillÄter att lÀsa, skriva och köra i hela instansen.

JĂ€mfört med vanliga databaser Ă€r det hĂ€r ganska enkelt. Vi har en space – ett omrĂ„de dĂ€r vĂ„ra data lagras. Varje post kallas ett tuple. Den paketeras i MessagePack. Det Ă€r ett riktigt cool format — det Ă€r binĂ€rt och tar mindre plats – 18 byte mot 27.

I Tarantool kan du kombinera en super snabb databas med applikationer för att arbeta med dem. SÄ hÀr enkelt Àr det att göra.

Det Àr ganska bekvÀmt att arbeta med. NÀstan varje rad, varje datapost kan ha helt olika kolumner.

Vi kan se alla spaces med kommandot Box.space. För att specifikt markera en instans — skriver vi box.space example och fĂ„r fullstĂ€ndig information om den.

I Tarantool finns det tvÄ typer av motorer: Memory och Vinyl. Memory lagrar all data i minnet. SÄ allt fungerar enkelt och snabbt. Data dumpas till disk, och det finns ocksÄ en mekanism för write ahead log, sÄ vi förlorar inget vid serverkrascher.

Vinyl lagrar data pĂ„ disk pĂ„ ett mer bekant sĂ€tt — det innebĂ€r att vi kan lagra mer data Ă€n vi har minne, och Tarantool kommer att lĂ€sa dem frĂ„n disken.

Nu kommer vi att anvÀnda 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>

Index:

Ett primĂ€rt index mĂ„ste skapas för varje space, eftersom ingenting kommer att fungera utan det. Precis som i varje databas skapar vi det första fĂ€ltet – ID för posten.

Parts:

HĂ€r anger vi vad vĂ„rt index bestĂ„r av. Det bestĂ„r av en del – det första fĂ€ltet som vi ska anvĂ€nda, typ unsigned – ett positivt heltal. SĂ„vitt jag minns frĂ„n dokumentationen Ă€r det maximala talet 18 kvintiljoner. En otrolig mĂ€ngd.

DÀrefter kan vi infoga data med hjÀlp av kommandot 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>

Det första fÀltet anvÀnds som primÀrnyckel, sÄ det mÄste vara unikt. Antalet kolumner Àr oÀndligt, sÄ vi kan infoga hur mycket data som helst. De anges i MessagePack-format, vilket jag beskrev ovan.

Utskrift av data

DĂ€refter kan vi skriva ut data med kommandot select.

Box.example.select med nyckeln {1} kommer att skriva ut den specifika posten. Om vi hoppar över nyckeln kommer vi att se alla poster, vilka alla har olika antal kolumner, men det finns i princip inget som kallas kolumner – det handlar om fĂ€ltens nummer.

Det kan finnas hur mycket data som helst. Och till exempel, vi behöver söka dem efter det andra fÀltet. För det gör vi ett nytt sekundÀrt index.


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

Vi anvÀnder kommandot Create_index.
Vi kallar det Secondary.

Efter det mÄste vi ange parametrarna. Typ av index Àr TREE. Det kan vara icke unikt, sÄ vi anger Unique = false.

DĂ€refter anger vi av vilka delar vĂ„rt index bestĂ„r. Field – detta Ă€r fĂ€ltets nummer som vi kopplar indexet till, och vi anger typen string. Och nu har det skapats.

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>

Nu kan vi kalla det sÄ hÀr:

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

Sparande

Om vi startar om instansen och försöker kalla pĂ„ datan igen — sĂ„ ser vi att den inte finns — allt Ă€r tomt. Detta hĂ€nder eftersom Tarantool gör checkpoints och sparar data pĂ„ disk, men om vi stoppar arbetet innan nĂ€rmaste lagring, förlorar vi alla operationer — eftersom vi kommer att Ă„terhĂ€mta oss frĂ„n den senaste checkpointen, som var för exempel tvĂ„ timmar sedan.

Att spara varje sekund fungerar inte heller — eftersom det att stĂ€ndigt dumpa 20 GB pĂ„ disk Ă€r en dĂ„lig idĂ©.

För detta infördes och implementerades konceptet med write-ahead log. Med hjÀlp av detta skapas en post i en liten write-ahead log-fil för varje Àndring i datan.

Varje post fram till checkpointen sparas i dessa. För dessa filer stĂ€ller vi in en storlek — till exempel 64 MB. NĂ€r den fylls, börjar posten gĂ„ till den andra filen. Och efter en omstart Ă„terhĂ€mtar sig Tarantool frĂ„n den senaste checkpointen och sedan applicerar alla senare transaktioner fram till stoppet.

I Tarantool kan du kombinera en super snabb databas med applikationer för att arbeta med dem. SÄ hÀr enkelt Àr det att göra.

För att genomföra sÄdana skrivningar mÄste du ange en instÀllning i box.cfg (i filen example.lua):

wal_mode = "write";

AnvÀndning av data

Med det vi precis har skrivit kan du anvĂ€nda Tarantool för datalagring, och det kommer att fungera mycket snabbt som en databas. Och nu, den riktiga godbiten – vad du kan göra med allt detta.

Vi skriver en applikation

Till exempel skriver vi en sÄdan applikation för Tarantool

Se applikationen under spoiler

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; -- en timme
    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

-- för första körningen, skapa ett utrymme och sÀtta upp behörigheter
box.once('replica', bootstrap)

-- aktivera konsolÄtkomst
console = require('console')
console.listen('127.0.0.1:3302')

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

Vi deklarerar en tabell i lua som definierar tecken. Denna tabell behövs för att generera en slumpmÀssig strÀng.

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

Efter detta deklarerar vi funktionen – randomString och ger vĂ€rdet av lĂ€ngden inom parentes.

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

Vi kopplar sedan http-router och http-server till vÄr Tarantool-server, JSON, som vi kommer att ge till klienten.

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

DÀrefter startar vi en HTTP-server pÄ port 8080 pÄ alla grÀnssnitt, som kommer att logga alla förfrÄgningar och fel.

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

DĂ€refter deklarerar vi en rutt som, om en GET-förfrĂ„gning kommer till port 8080 /count, anropar en funktion med en rad. Den returnerar en status – 200, 404, 403 eller vilket annat som helst vi anger.

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

I kroppen returnerar vi json.encode dÀr vi anger count och get_count, som anropas och visar antalet poster i vÄr databas.

Den andra metoden

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)

DĂ€r i raden router:route({method = ‘GET’, path = ‘\/token’}, function() anropar vi en funktion och genererar en token.

StrĂ€ng local token = randomString(32) – det Ă€r en slumpmĂ€ssig strĂ€ng av 32 tecken.
I raden local last = box.space.example:len() vi hÀmtar den senaste posten.
Och i raden box.space.example:insert{ last + 1, token } skriver vi data i vÄr databas, det vill sÀga vi ökar bara ID med 1. Detta kan faktiskt göras inte bara pÄ det hÀr klumpiga sÀttet. I Tarantool finns det sekvenser för det.

Vi skriver dit token.

SÄledes har vi skrivit en applikation i en fil. Du kan omedelbart arbeta med data, och modulboxen gör det smutsiga jobbet Ät dig.

Den lyssnar pĂ„ http och arbetar med data; allt finns i en enda instans – bĂ„de applikationen och data. DĂ€rför gĂ„r allt ganska snabbt.

För att starta installerar vi http-modulen:

Hur gör vi det? Se under spoilern.

root@test2:/# tarantoolctl rocks install http
Installerar http://rocks.tarantool.org/http-scm-1.src.rock
Saknade beroenden för http scm-1:
   checks >= 3.0.1 (inte installerat)

http scm-1 beror pÄ checks >= 3.0.1 (inte installerat)
Installerar http://rocks.tarantool.org/checks-3.0.1-1.rockspec

Klonar in i 'checks'...
remote: UpprÀkning av objekt: 28, klart.
remote: RĂ€kning av objekt: 100% (28/28), klart.
remote: Komprimering av objekt: 100% (19/19), klart.
remote: Totalt 28 (delta 1), ÄteranvÀnda 16 (delta 1), pack-reused 0
Mottar objekt: 100% (28/28), 12.69 KiB | 12.69 MiB/s, klart.
Löser deltan: 100% (1/1), klart.
Observera: kontrollerar ut '580388773ef11085015b5a06fe52d61acf16b201'.

Du Àr i 'detached HEAD'-lÀge. Du kan titta runt, göra experimentella
Àndringar och commita dem, och du kan kassera alla commits du gör i detta
lÀge utan att pÄverka nÄgra grenar genom att utföra en annan checkout.

Om du vill skapa en ny gren för att behÄlla commits du skapar kan du
göra det (nu eller senare) genom att anvÀnda -b med checkout-kommandot igen. Exempel:

  git checkout -b 

Ingen befintlig manifest. Försöker Äterbygga...
checks 3.0.1-1 Àr nu installerat i /.rocks (licens: BSD)

-- C-kompilatorns identifiering Àr GNU 7.5.0
-- Kontrollera om C-kompilatorn fungerar: /usr/bin/cc
-- Kontrollera om C-kompilatorn fungerar: /usr/bin/cc -- fungerar
-- UpptÀckande av C-kompilator ABI-info
-- UpptÀckande av C-kompilator ABI-info - klart
-- UpptÀckande av C-kompileringsfunktioner
-- UpptÀckande av C-kompileringsfunktioner - klart
-- Hittade TARANTOOL: /usr/include (hittad version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR Àr /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR Àr /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Konfigureringen Àr klar
-- Genereringen Àr klar
CMake Varning:
  Manuell specificerade variabler anvÀndes inte av projektet:

    version


-- Byggfiler har skrivits till: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Skannar beroenden för mÄlet httpd
[ 50%] Bygger C-objekt http/CMakeFiles/httpd.dir/lib.c.o
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: I funktionen ‘tpl_term’:
/usr/include/tarantool/lauxlib.h:144:15: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
    (*(B)->p++ = (char)(c)))
    ~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: notera: i expansion av makrot ‘luaL_addchar’
       luaL_addchar(b, '\');
       ^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: notera: hÀr
      standard:
      ^~~~~~~
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: I funktionen ‘tpe_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
    type = TPE_TEXT;
    ~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: notera: hÀr
   case TPE_LINECODE:
   ^~~~
I filen inkluderad frÄn /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: I funktionen ‘httpfast_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
                 code = 0;
                 ~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: notera: hÀr
             case status:
             ^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: varning: detta uttalande kan falla igenom [-Wimplicit-fallthrough=]
                 state = message;
                 ~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: notera: hÀr
             case message:
             ^~~~
[100%] LĂ€nkar C delbibliotek lib.so
[100%] Byggt mÄl httpd
[100%] Byggt mÄl httpd
Installera projektet...
-- Installationskonfiguration: "Debug"
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installerar: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 Àr nu installerat i /.rocks (licens: BSD)

root@test2:/#

För att starta behöver vi ocksÄ prometheus:

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

Klona 'prometheus'...
remote: UpprÀkning av objekt: 19, klart.
remote: RĂ€knar objekt: 100% (19/19), klart.
remote: Komprimerar objekt: 100% (19/19), klart.
remote: Totalt 19 (delta 2), ÄteranvÀnt 5 (delta 0), pack-reanvÀnt 0
Mottar objekt: 100% (19/19), 10.73 KiB | 10.73 MiB/s, klart.
Löser deltan: 100% (2/2), klart.
prometheus scm-1 Àr nu installerat i /.rocks (licens: BSD)

root@test2:~#

Vi startar och kan fÄ tillgÄng till modulerna

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

Vi testar hastigheten

LÄt oss köra ett benchmark pÄ 50 000 förfrÄgningar. Antalet samtidiga förfrÄgningar kommer att vara 500.

root@test2:~# ab -c 500 -n 50000 http://127.0.0.1:8080/token
Detta Àr ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensierad till The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (var tÄlmodig)
Fullföljde 5000 förfrÄgningar
Fullföljde 10000 förfrÄgningar
Fullföljde 15000 förfrÄgningar
Fullföljde 20000 förfrÄgningar
Fullföljde 25000 förfrÄgningar
Fullföljde 30000 förfrÄgningar
Fullföljde 35000 förfrÄgningar
Fullföljde 40000 förfrÄgningar
Fullföljde 45000 förfrÄgningar
Fullföljde 50000 förfrÄgningar
Klarade 50000 förfrÄgningar


Serverprogramvara:        Tarantool
Servernamn:        127.0.0.1
Serverport:            8080

DokumentvÀg:          /token
DokumentlÀngd:        44 bytes

SamtidighetsnivÄ:      500
Tid som tagits för tester:   14.578 sekunder
FullstÀndiga begÀrningar:      50000
Misslyckade begÀrningar:        0
Totalt överfört:      7950000 bytes
HTML överfört:       2200000 bytes
BegÀrningar per sekund:    3429.87 [#/sec] (medel)
Tid per begÀran:       145.778 [ms] (medel)
Tid per begÀran:       0.292 [ms] (medel, över alla samtidiga begÀrningar)
Överföringshastighet:          532.57 [Kbytes/sec] mottagna

Anslutningstider (ms)
              min  medel[+/-sd] median   max
Anslut:        0   10 103.2      0    3048
Bearbetning:    12   69 685.1     15   13538
VĂ€ntade:       12   69 685.1     15   13538
Total:         12   78 768.2     15   14573

Procent av begÀrningarna som servades inom viss tid (ms)
  50%     15
  66%     15
  75%     16
  80%     16
  90%     16
  95%     16
  98%     21
  99%     42
 100%  14573 (lÀngsta begÀran)
root@test2:~#

Token skrivs ut. Och vi skriver hela tiden data. 99% av förfrÄgningarna hanterades pÄ 42 millisekunder. DÀrför har vi runt 3500 förfrÄgningar per sekund pÄ en liten maskin med 2 kÀrnor och 4 gigabyte minne.

Du kan ocksÄ vÀlja en 50000-token och se dess vÀrde.

Det Ă€r möjligt att anvĂ€nda inte bara http, utan ocksĂ„ köra bakgrundsfunktioner som bearbetar dina data. Dessutom finns det olika triggers. Till exempel kan du anropa funktioner vid uppdateringar, kontrollera nĂ„got – Ă„tgĂ€rda konflikter.

Det gÄr att skriva skript-applikationer direkt pÄ databasservern, utan begrÀnsningar, ansluta valfria moduler och implementera vilken logik som helst.

Applikationsservern kan kommunicera med externa servrar, hÀmta data och lagra dem i sin databas. Data frÄn denna databas kommer att anvÀndas av andra applikationer.

Detta kommer att göras av Tarantool sjÀlv, sÄ det behövs inget separat program.

Avslutningsvis

Detta Àr bara den första delen av ett stort arbete. Den andra delen kommer snart att publiceras i Mail.ru Groups blogg, och vi kommer definitivt att lÀgga till en lÀnk till den i detta material.

Om du Àr intresserad av att delta i evenemang dÀr vi skapar sÄdana saker online och stÀlla frÄgor i realtid, anslut dig till kanalen DevOps by REBRAIN.

Om du behöver migrera till molnet eller har frÄgor om din infrastruktur, lÀmna gÀrna in en ansökan.

P.S. Vi har tvÄ gratis granskningar per mÄnad, kanske Àr just ditt projekt en av dem.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster