Ku-Tarantool, ungahlanganisa i-database eshesha kakhulu kanye nohlelo lokusebenza ukuze usebenze nabo. Nakhu ukuthi kulula kangakanani ukwenza

Eminyakeni emihlanu edlule ngazama ukusebenza neTarantool, kodwa kwangangisebenzela. Kodwa muva nje ngibambe i-webinar lapho ngikhulume khona nge-Hadoop nokuthi i-MapReduce isebenza kanjani. Lapho bangibuza umbuzo: “Kungani ngingasebenzisi iTarantool kulo msebenzi?”

Ngenxa yelukuluku, nganquma ukubuyela kuyo, ngivivinye inguqulo yakamuva - futhi kulokhu ngiwuthande ngempela lo msebenzi. Manje ngizokukhombisa ukuthi ungabhala kanjani uhlelo lokusebenza olulula ku-Tarantool, ulilayishe futhi uhlole ukusebenza kwalo, futhi uzobona ukuthi kulula futhi kupholile kanjani konke.

Ku-Tarantool, ungahlanganisa i-database eshesha kakhulu kanye nohlelo lokusebenza ukuze usebenze nabo. Nakhu ukuthi kulula kangakanani ukwenza

Yini iTarantool

I-Tarantool izibeka njengesizindalwazi esisheshayo. Ungabeka noma iyiphi idatha oyifunayo lapho. Futhi, ziphindaphinde, shard - okungukuthi, hlukanisa inani elikhulu ledatha kumaseva amaningana bese uhlanganisa imiphumela evela kuwo - yenza ukuxhumana okunamandla okubekezelela amaphutha.

Okwesibili, lena iseva yohlelo lokusebenza. Ungabhala izinhlelo zakho zokusebenza kuyo, usebenze ngedatha, isibonelo, susa amarekhodi amadala ngemuva ngokwemithetho ethile. Ungabhala iseva ye-Http ngqo ku-Tarantula ezosebenza nedatha: nikeza ubuningi bayo, bhala idatha entsha lapho futhi unciphise konke ku-master.

Ngifunde isihloko mayelana nendlela abafana abawenza ngayo umugqa womlayezo wemigqa engu-300, ovele uqhume futhi ugijime - banokusebenza okuncane kwemilayezo engu-20 ngomzuzwana. Lapha ungakwazi ngempela ukuphenduka futhi ubhale uhlelo lokusebenza olukhulu kakhulu, futhi ngeke kube isitoreji, njengaku-PostgreS.

Ngizozama ukuchaza into efana nale seva, elula kuphela, kulesi sihloko.

setting

Ngokuhlolwa, ngiqale imishini emithathu ejwayelekile - i-hard drive engu-20 GB, Ubuntu 18.04. Ama-CPU angama-2 nama-gigs angu-4 wenkumbulo.

Sifaka i-Tarantool - sebenzisa iskripthi se-bash noma sengeza indawo yokugcina bese uthola ukufaka i-Tarantool. Xhuma kusikripthi - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Sinemiyalo efana nalena:

i-tarantoolctl - umyalo oyinhloko wokuphatha izimo zeTarantula.
/etc/tarantool - nakhu konke ukucushwa.
var/log/tarantool - nazi izingodo.
var/lib/tarantool - idatha ilele lapha, bese ihlukaniswa ngezimo.

Kunamafolda atholakala ngokwesibonelo-atholakalayo futhi avumela isibonelo - aqukethe okuzokwethulwa - ifayela lokumisa isibonelo elinekhodi ye-lua, echaza ukuthi ilalela maphi amachweba, iyiphi inkumbulo etholakala kuwo, izilungiselelo zenjini ye-Vinyl, ikhodi esebenza ekuqaleni. amaseva, ukwaba, imigqa, ukususwa kwedatha ephelelwe yisikhathi, nokunye.

Izimo zisebenza njengaku-PostgreS. Isibonelo, ufuna ukusebenzisa amakhophi amaningana esizindalwazi esilenga ezimbobeni ezahlukahlukene. Kuvele ukuthi izehlakalo ezimbalwa zesizindalwazi zethulwa kuseva eyodwa, elenga emachwebeni ahlukene. Bangase babe nezilungiselelo ezihluke ngokuphelele - isibonelo esisodwa sisebenzisa umqondo owodwa, owesibili - esinye.

Ukuphathwa kwezigameko

Sinomyalo we-tarantoolctl, okuvumela ukuthi uphathe izimo ze-Tarantula. Isibonelo, isibonelo sokuhlola i-tarantoolctl sizohlola ifayela lokumisa bese sithi - ifayela lilungile uma kungekho amaphutha e-syntax lapho.

Ungabona isimo sesibonelo - isibonelo sesimo se-tarantoolctl. Ngendlela efanayo ungenza ukuqala, yima, qala kabusha.

Uma isibonelo sisebenza, ungaxhuma kuso ngezindlela ezimbili.

1. Ikhonsoli yokuphatha

Ngokuzenzakalelayo, i-Tarantool ivula isokhethi, umbhalo ojwayelekile we-ASCII uthunyelwa lapho ukuze ulawule i-Tarantool. Ukuxhumeka kukhonsoli kuhlala kwenzeka ngaphansi komsebenzisi womlawuli, abukho ubuqiniso, ngakho-ke asikho isidingo sokwenza ngaphandle imbobo yekhonsoli ukuze uphathe i-Tarantula.

Ukuze uxhume usebenzisa le ndlela, udinga ukufaka i-Tarantoolctl faka igama lesibonelo. Umyalo uzovula ikhonsoli futhi uxhume njengomsebenzisi womlawuli. Ungalokothi uveze imbobo ye-console ngaphandle - kungcono ukuyishiya njengesokhethi yeyunithi. Khona-ke kuphela labo abakwaziyo ukubhala kusokhethi bazokwazi ukuxhuma ku-Tarantula.

Le ndlela iyadingeka ezintweni zokuphatha. Ukuze usebenze ngedatha, sebenzisa indlela yesibili - iphrothokholi kanambambili.

2. Ukusebenzisa iphrothokholi kanambambili ukuze uxhume endaweni ethile

Ukucushwa kuqukethe umyalo wokulalela, ovula imbobo yokuxhumana kwangaphandle. Le port isetshenziswa nephrothokholi kanambambili futhi ukuqinisekiswa kunikwe amandla lapho.

Kulokhu kuxhumeka, kusetshenziswa i-tarantoolctl yokuxhuma enombolweni yembobo. Ngokuyisebenzisa, ungaxhuma kumaseva akude, sebenzisa ukufakazela ubuqiniso futhi unikeze amalungelo okufinyelela ahlukahlukene.

Ukuqoshwa Kwedatha kanye Nemojuli Yebhokisi

Njengoba i-Tarantool iyisizindalwazi kanye neseva yohlelo lokusebenza, inamamojula ahlukahlukene. Sinentshisekelo kumojuli yebhokisi - isebenzisa ukusebenza ngedatha. Uma ubhala okuthile ebhokisini, i-Tarantool ibhala idatha kudiski, iyigcine enkumbulweni, noma yenza enye into ngayo.

Qopha

Isibonelo, singena kumojula yebhokisi bese sibiza umsebenzi we-box.once. Lokhu kuzophoqa i-Tarantool ukuthi isebenzise ikhodi yethu lapho iseva iqaliswa. Sakha isikhala lapho idatha yethu izogcinwa khona.

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

    -- Keep things safe by default
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

Ngemva kwalokhu, sakha inkomba eyinhloko - eyinhloko - esingasesha ngayo idatha. Ngokuzenzakalelayo, uma ungacacisi noma yimaphi amapharamitha, inkambu yokuqala kurekhodi ngalinye izosetshenziselwa inkomba eyinhloko.

Bese senza isibonelelo kumsebenzisi oyisivakashi, lapho sixhuma ngaphansi kwephrothokholi kanambambili. Sivumela ukufunda, ukubhala nokwenza kuso sonke isikhathi.

Uma kuqhathaniswa nemininingwane yolwazi evamile, yonke into lapha ilula kakhulu. Sinesikhala - indawo lapho idatha yethu igcinwa khona kalula. Irekhodi ngalinye libizwa ngokuthi i-tuple. Ifakwe ku-MessagePack. Lena ifomethi epholile kakhulu - inambambili futhi ithatha isikhala esincane - amabhayithi angu-18 uma iqhathaniswa no-27.

Ku-Tarantool, ungahlanganisa i-database eshesha kakhulu kanye nohlelo lokusebenza ukuze usebenze nabo. Nakhu ukuthi kulula kangakanani ukwenza

Kulula kakhulu ukusebenza naye. Cishe wonke umugqa, wonke amarekhodi edatha angaba namakholomu ahluke ngokuphelele.

Singakwazi ukubuka zonke izikhala sisebenzisa umyalo we-Box.space. Ukuze ukhethe isenzakalo esithile, bhala isibonelo se-box.space futhi uthole ulwazi oluphelele ngaso.

I-Tarantool inezinjini ezimbili ezakhelwe ngaphakathi: Imemori neVinyl. Imemori igcina yonke idatha kumemori. Ngakho-ke, konke kusebenza kalula futhi ngokushesha. Idatha iphonswa kudiski, futhi kukhona nendlela yokubhala kusengaphambili, ngakho-ke ngeke silahlekelwe yilutho uma iseva iphahlazeka.

I-Vinyl igcina idatha kudiski ngendlela esijwayele ngayo - okungukuthi, ungagcina idatha eningi kunememori yethu, futhi i-Tarantula izoyifunda kudiski.

Okwamanje sizosebenzisa iMemori.

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>

Inkomba:

Inkomba eyinhloko kufanele idalwe kunoma yisiphi isikhala, ngoba ngaphandle kwayo akukho lutho oluzosebenza. Njengakunoma iyiphi i-database, sakha inkambu yokuqala - i-ID yokurekhoda.

Izingxenye:

Lapha sibonisa ukuthi inkomba yethu iqukethe ini. Iqukethe ingxenye eyodwa - inkambu yokuqala esizoyisebenzisa eyohlobo olungasayiniwe - inombolo ephelele. Ngokukhumbula kwami ​​emibhalweni, inombolo enkulu engaba yi-quintillion eyi-18. Kuningi lokho.

Ngemva kwalokho singafaka idatha sisebenzisa umyalo wokufaka.

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>

Inkambu yokuqala isetshenziswa njengokhiye oyinhloko, ngakho-ke kufanele ihluke. Asinqunyelwe ngenani lamakholomu, ngakho-ke singakwazi ukufaka idatha eningi ngendlela esiyifunayo lapho. Acaciswe ngefomethi ye-MessagePack, engiyichaze ngenhla.

Okukhipha idatha

Khona-ke singabonisa idatha sisebenzisa umyalo wokukhetha.

I-Box.example.select ngokhiye othi {1} izoveza okufunayo. Uma sehlisa ukhiye, sizobona wonke amarekhodi esinawo. Zonke ziyahlukahluka ngenani lamakholomu, kodwa lapha, ngokomthetho, akukho mqondo wamakholomu - kunezinombolo zensimu.

Kungaba nhlobo inani ledatha. Futhi ngokwesibonelo, sidinga ukuwacinga ngenkambu yesibili. Ukwenza lokhu, sakha inkomba yesibili entsha.


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

Sisebenzisa umyalo we-Create_index.
Masiyibize ngeSekondari.

Ngemuva kwalokhu udinga ukucacisa amapharamitha. Uhlobo lwenkomba luthi TREE. Ingase ihluke, ngakho faka i-Unique = false.

Bese sikhomba ukuthi yiziphi izingxenye zenkomba yethu. Inkambu inombolo yenkambu lapho sibophezela khona inkomba, futhi ucacise uhlobo lweyunithi yezinhlamvu. Futhi ngakho kwadalwa.

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>

Manje nansi indlela esingayibiza ngayo:

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

Ukulondolozwa

Uma siqala kabusha isibonelo bese sizama ukushayela idatha futhi, sizobona ukuthi ayikho - yonke into ayinalutho. Lokhu kwenzeka ngoba i-Tarantool yenza izindawo zokuhlola futhi igcina idatha kudiski, kodwa uma siyeka ukusebenza kuze kube yilapho silondoloza okulandelayo, sizolahlekelwa yonke imisebenzi - ngoba sizolulama endaweni yokuhlola yokugcina, okwakuyisibonelo, amahora amabili edlule.

Ngeke kusebenze ukulondoloza isekhondi ngalinye, ngoba ukulahla njalo u-20 GB kudiski akuwona umqondo omuhle.

Ngale njongo, umqondo welogi yokubhala kusengaphambili wasungulwa futhi wasetshenziswa. Ngosizo lwayo, kulo lonke ushintsho kudatha, okufakwayo kwakhiwa efayeleni lelogi elincane lokubhala phambili.

Ukungena ngakunye kuze kufike endaweni yokuhlola kugcinwa kuzo. Kulawa mafayela sibeka usayizi - isibonelo, 64 MB. Uma seligcwele, ukurekhoda kuqala ukuya efayeleni lesibili. Futhi ngemuva kokuqalisa kabusha, i-Tarantool ibuyiselwa endaweni yokuhlola yokugcina bese igingqika kukho konke okwenziwa kamuva kuze kube ima.

Ku-Tarantool, ungahlanganisa i-database eshesha kakhulu kanye nohlelo lokusebenza ukuze usebenze nabo. Nakhu ukuthi kulula kangakanani ukwenza

Ukuze wenze ukurekhodwa okunjalo, udinga ukucacisa inketho kuzilungiselelo ze-box.cfg (kufayela elithi example.lua):

wal_mode = “write”;

ukusetshenziswa kwedatha

Ngalokhu esikubhalile manje, ungasebenzisa i-Tarantula ukugcina idatha futhi izosebenza ngokushesha kakhulu njengesizindalwazi. Futhi manje uqweqwe lwekhekhe ekhekheni yilokho ongakwenza ngakho konke.

Ukubhala isicelo

Isibonelo, ake sibhale isicelo esilandelayo seTarantula

Bheka isicelo ngaphansi 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; -- 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()

Simemezela ithebula ngesi-lua elichaza abalingiswa. Leli plate liyadingeka ukuze kukhiqizwe iyunithi yezinhlamvu engahleliwe.

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

Ngemva kwalokho, simemezela umsebenzi - randomString futhi sinikeze inani lobude kubakaki.

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

Bese sixhuma irutha ye-http kanye neseva ye-http kuseva yethu ye-Tarantula, i-JSON, esizoyithumela kuklayenti.

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

Ngemuva kwalokhu, siqala ku-port 8080 kuzo zonke izixhumanisi zeseva ye-http, ezongena zonke izicelo namaphutha.

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

Okulandelayo, simemezela umzila, ukuze uma isicelo esinendlela ye-GET sifika echwebeni 8080 / count, bese sibiza umsebenzi kusuka kulayini owodwa. Ibuyisela isimo - 200, 404, 403 nanoma yisiphi esinye esisicacisayo.

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

Emzimbeni sibuyisela i-json.encode, kuwo sibonisa ukubala kanye ne-getcount, ebizwa futhi ekhombisa inombolo yamarekhodi kusizindalwazi sethu.

Indlela yesibili

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)

Lapho emgqeni umzila:umzila({indlela = 'GET', indlela = '/ithokheni'}, umsebenzi() sibiza umsebenzi futhi sikhiqize ithokheni.

Ulayini ithokheni yendawo = okungahleliweString(32) iwuchungechunge olungahleliwe lwezinhlamvu ezingama-32.
Emugqeni okokugcina = box.space.example:len() sikhipha isici sokugcina.
Futhi emgqeni box.space.example:insert{ last + 1, ithokheni } sibhala idatha ku-database yethu, okungukuthi, simane sikhulise i-ID ngo-1. Lokhu kungenziwa, ngendlela, hhayi kuphela ngale ndlela eyinkimbinkimbi. Kukhona ukulandelana kwalokhu ku-Tarantula.

Sibhala uphawu lapho.

Ngakho, sabhala isicelo efayeleni elilodwa. Ungakwazi ukukhohlisa idatha lapho, futhi imojuli yebhokisi izokwenzela wonke umsebenzi ongcolile.

Ilalela i-http futhi isebenza ngedatha, yonke into isesimweni esisodwa - kokubili uhlelo lokusebenza nedatha. Ngakho-ke, konke kwenzeka ngokushesha okukhulu.

Ukuqala sifaka imojuli ye-http:

Sikwenza kanjani lokhu, bheka ngaphansi kwe-spoiler

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 <new-branch-name>

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

Sidinga futhi i-prometheus ukuze sisebenze:

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 is now installed in /.rocks (license: BSD)

root@test2:/#

Sethula futhi singakwazi ukufinyelela amamojula

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

/ukubala kusinika isimo sama-200.
/ithokheni ikhipha ithokheni bese ibhala le tokheni kusizindalwazi.

Ukuhlola isivinini

Masisebenzise ibhentshimakhi yezicelo ezingu-50. Kuzoba nezicelo ezincintisanayo ezingama-000.

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

Amathokheni akhishwa. Futhi sihlala siqopha idatha. U-99% wezicelo ucutshungulwe ngama-millisecond angama-42. Ngokunjalo, sinezicelo ezingaba ngu-3500 ngomzuzwana emshinini omncane onama-cores angu-2 namagigabhayithi angu-4 enkumbulo.

Ungaphinda ukhethe amanye amathokheni angama-50000 futhi ubone inani lawo.

Awukwazi ukusebenzisa i-http kuphela, kodwa futhi usebenzise imisebenzi yasemuva ecubungula idatha yakho. Ngaphezu kwalokho, kukhona izimbangela ezihlukahlukene. Isibonelo, ungashayela imisebenzi kuzibuyekezo, hlola okuthile - izingxabano okulungile.

Ungabhala izinhlelo zokusebenza zeskripthi ngokuqondile kuseva yedathabhesi ngokwayo, futhi ungakhawulwa yinoma yini, xhuma noma imaphi amamojula futhi usebenzise noma iyiphi ingqondo.

Iseva yohlelo lokusebenza ingafinyelela amaseva angaphandle, ithole idatha futhi iyengeze kusizindalwazi sayo. Idatha evela kule database izosetshenziswa ezinye izinhlelo zokusebenza.

I-Tarantula izokwenza lokhu ngokwayo, futhi ngeke kudingeke ukuthi ubhale isicelo esihlukile.

Ekuphethweni

Lena ingxenye yokuqala kuphela yomsebenzi omkhulu. Eyesibili izoshicilelwa maduze kubhulogi ye-Mail.ru Group, futhi ngokuqinisekile sizokwengeza isixhumanisi kuso kulokhu okuqukethwe.

Uma ungathanda ukuhambela imicimbi lapho sakha khona lezi zinto ku-inthanethi futhi sibuze imibuzo ngesikhathi sangempela, vula isiteshi i-DevOps ngu-REBRAIN.

Uma udinga ukuya efwini noma unemibuzo mayelana nengqalasizinda yakho, zizwe ukhululekile ukushiya isicelo.

PS Sinokuhlolwa kwamahhala okungu-2 ngenyanga, mhlawumbe iphrojekthi yakho izoba enye yazo.

Source: www.habr.com

Engeza amazwana