KwiTarantool, unokudibanisa i-database ekhawuleza kakhulu kunye nesicelo sokusebenza nabo. Nantsi indlela ekulula ngayo ukwenza

Kwiminyaka emihlanu edlulileyo ndazama ukusebenza neTarantool, kodwa ayizange indisebenzele. Kodwa kutsha nje ndiye ndabamba i-webinar apho bendithetha khona ngeHadoop, malunga nendlela iMapReduce esebenza ngayo. Apho ndabuzwa umbuzo - "Kutheni ungasebenzisi iTarantool kulo msebenzi?".

Ngenxa yokufuna ukwazi, ndagqiba ekubeni ndibuyele kuyo, ndivavanye inguqulelo yamva nje- kwaye ngeli xesha ndiyithanda kakhulu le projekthi. Ngoku ndiza kubonisa indlela yokubhala isicelo esilula kwiTarantool, yilayishe kwaye ukhangele ukusebenza, kwaye uya kubona ukuba kulula kangakanani kwaye kupholile yonke into ekhoyo.

KwiTarantool, unokudibanisa i-database ekhawuleza kakhulu kunye nesicelo sokusebenza nabo. Nantsi indlela ekulula ngayo ukwenza

Yintoni iTarantool

I-Tarantool izibeka njengesiseko sedatha esikhawulezayo. Ungabeka nayiphi na idatha oyifunayo apho. Kwaye, ziphindaphinde, i-shard - oko kukuthi, yahlula inani elikhulu ledatha kwiiseva ezininzi kwaye udibanise iziphumo ezivela kuzo - yenza amakhonkco enkosi-ukunyamezela iimpazamo.

Okwesibini, yiseva yesicelo. Ungabhala izicelo zakho kuyo, usebenze ngedatha, umzekelo, cima amangeniso amadala ngasemva ngokwemigaqo ethile. Ungabhala iseva yeHttp ngokuthe ngqo kwiTarantula eya kusebenza kunye nedatha: ukunika inombolo yabo, bhala idatha entsha apho kwaye uyinciphise yonke kwinkosi.

Ndafunda inqaku malunga nendlela abafana benza ngayo umgca womyalezo we-300, apho nje iinyembezi kunye nokubetha - banomsebenzi omncinci wemiyalezo engama-20 ngomzuzwana. Apha ungajika kwaye ubhale isicelo esikhulu kakhulu, kwaye ezi aziyi kugcinwa, njengakwiPostgreS.

Ngokumalunga nomncedisi onjalo, elula kuphela, ndiya kuzama ukuchaza kweli nqaku.

isicwangciso

Kuvavanyo, ndiqale oomatshini abathathu abaqhelekileyo - i-20 gigabyte hard drive, Ubuntu 18.04. I-2 ye-CPU ebonakalayo kunye ne-4 gigabytes yememori.

Sifaka iTarantool-sebenzisa iskripthi se-bash okanye yongeza indawo yokugcina kwaye wenze ngokufanelekileyo ukufaka iTarantool. Ikhonkco kwiscript - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Sinemiyalelo efana nale:

i-tarantoolctl ngowona myalelo uphambili wokulawula iimeko zeTarantula.
/etc/tarantool - apha kulele lonke uqwalaselo.
var/log/tarantool - nazi iinkuni.
var/lib/tarantool - apha kulele idatha, kwaye ke yahlulahlulwe kwiimeko.

Kukho umzekelo-okhoyo kunye nomzekelo-wenza iifolda-iqulathe into eza kuphehlelelwa- ifayile yoqwalaselo lomzekelo ngekhowudi ye-lua, echaza ukuba yeyiphi izibuko ephulaphula kuyo, yeyiphi inkumbulo ekhoyo kuyo, izicwangciso zenjini yeVinyl, ikhowudi esebenza ekuqaleni. iiseva, ukwahlula, imigca, ukucinywa kwedatha ephelelwe lixesha, njalo njalo.

Iimeko zisebenza njengakwiPostgreS. Umzekelo, ufuna ukwenza iikopi ezininzi zedatabase ejinga kumazibuko ahlukeneyo. Kuyavela ukuba iimeko ezininzi zedatha ziqalisiwe kwiseva enye, ejinga kumazibuko ahlukeneyo. Banokuba nezicwangciso ezahlukeneyo ngokupheleleyo - umzekelo omnye usebenzisa ingqiqo enye, okwesibini - enye.

Ulawulo lwemeko

Sinomyalelo we-tarantoolctl osivumela ukuba silawule iimeko zeTarantula. Umzekelo, umzekelo wokujonga i-tarantoolctl uya kukhangela ifayile yoqwalaselo kwaye uthi ifayile ilungile ukuba akukho mpazamo zesintaksi.

Ungayibona imeko yomzekelo - umzekelo wesimo se-tarantoolctl. Ngendlela efanayo, unokwenza ukuqala, ukuyeka, ukuqala kwakhona.

Nje ukuba umzekelo uyasebenza, kukho iindlela ezimbini zokuqhagamshela kuwo.

1. Ikhonsoli yolawulo

Ngokungagqibekanga, iTarantool ivula isiseko kwaye ithumele isicatshulwa esicacileyo se-ASCII ukulawula iTarantula. Uqhagamshelo kwi-console luhlala lusenzeka phantsi komsebenzisi womlawuli, akukho bungqina, ngoko akudingeki ukuba ukhuphe i-console port ukulawula i-Tarantula ngaphandle.

Ukuqhagamshela ngale ndlela, kufuneka ufake iTarantoolctl ngenisa igama lomzekelo. Umyalelo uya kusungula i-console kwaye udibanise njengomsebenzisi womlawuli. Ungaze uveze izibuko le-console ngaphandle - kungcono ukulishiya njengesokethi yeyunithi. Emva koko kuphela abo banokubhala ukufikelela kwi-socket baya kukwazi ukuxhuma kwiTarantula.

Le ndlela iyafuneka kwizinto zolawulo. Ukuze usebenze ngedatha, sebenzisa indlela yesibini - iprotocol yokubini.

2. Ukusebenzisa iprotocol yokubini ukudibanisa kwizibuko elithile

Kukho umyalelo wokumamela kuqwalaselo, ovula izibuko kunxibelelwano lwangaphandle. Elizibuko lisetyenziswa ngeprotocol yokubini kwaye uqinisekiso lwenziwe apho.

Kolu xhulumaniso, i-tarantoolctl yokudibanisa kwinombolo yesiqhagamshelanisi iyasetyenziswa. Ukuyisebenzisa, unokuqhagamshela kwiiseva ezikude, sebenzisa ukuqinisekiswa kwaye unike amalungelo awohlukeneyo okufikelela.

Ukurekhodwa kweDatha kunye neModyuli yeBhokisi

Ekubeni iTarantool zombini isiseko sedatha kunye neseva yesicelo, ineemodyuli ezahlukeneyo. Sinomdla kwimodyuli yebhokisi - isebenzisa umsebenzi kunye nedatha. Xa ubhala into kwibhokisi, iTarantool ibhala idatha kwidiski, iyigcine kwimemori, okanye yenza enye into ngayo.

Ukurekhoda

Umzekelo, singena kwimodyuli yebhokisi kwaye sibize ibhokisi.once umsebenzi. Iya kunyanzela iTarantool ukuba iqhube ikhowudi yethu xa iseva iqaliswa. Senza indawo apho idatha yethu iya kugcinwa 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

Emva koko, senza isalathiso sokuqala - eyona nto iphambili - apho sinokukhangela idatha. Ngokungagqibekanga, ukuba akukho parameters ichaziweyo, indawo yokuqala kwingeniso nganye yesalathisi seprimer izakusetyenziswa.

Emva koko senza isibonelelo kumsebenzisi weendwendwe, apho sidibanisa ngeprotocol yokubini. Sivumela ukufunda, ukubhala kunye nokuphumeza kuwo wonke umzekelo.

Xa kuthelekiswa nogcino-lwazi oluqhelekileyo, yonke into ilula apha. Sinendawo - indawo apho idatha yethu igcinwe ngokulula. Ingeno ngalinye libizwa ngokuba yi-tuple. Ipakishwe kwi-MessagePack. Le yifomati epholile kakhulu - ibini kwaye ithatha indawo encinci - i-18 bytes xa ithelekiswa ne-27.

KwiTarantool, unokudibanisa i-database ekhawuleza kakhulu kunye nesicelo sokusebenza nabo. Nantsi indlela ekulula ngayo ukwenza

Kulula kakhulu ukusebenza naye. Phantse yonke imigca, yonke ingeniso yedatha ingaba neekholomu ezahlukeneyo ngokupheleleyo.

Sinokujonga zonke izithuba sisebenzisa i-Box.space command. Ukukhetha umzekelo othile, sibhala i-box.space umzekelo kwaye sifumane ulwazi olupheleleyo kuyo.

Kukho iintlobo ezimbini zeenjini ezakhiwe kwiTarantool: Imemori kunye neVinyl. Imemori igcina yonke idatha kwimemori. Ngoko ke, yonke into isebenza ngokulula kwaye ngokukhawuleza. Idata ilahlwa kwidisk, kwaye kukwakho nendlela yokubhala ngaphambili, ngoko ke asizukulahlekelwa nantoni na ukuba umncedisi uyantlitheka.

IVinyl igcina idatha kwidiski kwifom eqhelekileyo - oko kukuthi, ungagcina idatha eninzi kunokuba sinememori, kwaye iTarantula iya kuyifunda kwidiski.

Ngoku siza kusebenzisa 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>

Isalathiso:

Isalathiso sokuqala kufuneka senziwe kuyo nayiphi na indawo, kuba akukho nto iya kusebenza ngaphandle kwayo. Njengoko kuyo nayiphi na isiseko sedatha, senza intsimi yokuqala - i-ID yerekhodi.

Icandelo:

Apha kulapho sichaza ukuba isalathiso sethu siqulathe ntoni. Inecandelo elinye - indawo yokuqala esiza kuyisebenzisa, chwetheza ungasayinwanga - inani elipheleleyo. Njengoko ndikhumbula kumaxwebhu, elona nani liphezulu elinokuba li-18 quintillion. Uninzi oluhle kakhulu.

Emva koko sinokufaka idatha ngokusebenzisa umyalelo 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>

Intsimi yokuqala isetyenziswe njengesitshixo sokuqala, ngoko kufuneka ibe yodwa. Asikhawulelwanga ngenani leekholomu, ngoko sinokufaka idatha eninzi njengoko sithanda apho. Zichazwe kwifomati ye-MessagePack, endiyichaze ngasentla.

Imveliso yedatha

Emva koko sinokubonisa idatha kunye nomyalelo okhethiweyo.

Box.example.select ngeqhosha {1} liza kubonisa ungeno olufunekayo. Ukuba siyasishiya isitshixo, siya kubona zonke iirekhodi esinazo. Zonke zihluke kwinani leekholomu, kodwa apha, ngokomgaqo, akukho ngcamango yeekholomu - kukho iinombolo zentsimi.

Kunokubakho ngokupheleleyo data kangangoko uthanda. Kwaye umzekelo, kufuneka sibakhangele kwintsimi yesibini. Ukwenza oku, senza isalathisi esitsha sesibini.


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

Sisebenzisa i-Create_index command.
Siyibiza ngokuba yiSekondari.

Emva koko, kufuneka uchaze iiparameters. Udidi lwesalathiso sithi TREE. Isenokungabi yodwa, ngoko singena i-Unique = bubuxoki.

Size sibonise ukuba zeziphi iinxalenye zesalathiso sethu. Ummandla linani lentsimi apho sibophelela khona isalathisi, kwaye ichaza uhlobo lomtya. Kwaye ngoko 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>

Nantsi indlela esinokuyibiza ngayo:

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

Ukugcina

Ukuba siqala kwakhona umzekelo kwaye sizame ukubiza idatha kwakhona, siya kubona ukuba azikho - yonke into ayinalutho. Oku kwenzeka ngenxa yokuba iTarantool yenza iindawo zokutshekisha kwaye igcina idatha kwidiski, kodwa ukuba siyayeka ukusebenza ngaphambi kokugcina okulandelayo, siya kuphulukana nayo yonke imisebenzi - kuba siya kubuyiselwa kwindawo yokugqibela yokuhlola, eyayikho, umzekelo, iiyure ezimbini ezidlulileyo.

Ukugcina isekhondi nganye nako akuyi kusebenza - kuba ukulahla rhoqo i-20 GB kwidiski ngumbono onjalo.

Ukwenzela oku, ingqikelelo yelogi yokubhala kwangaphambili yaqanjwa yaza yaphunyezwa. Ngoncedo lwayo, kwinguqu nganye kwidatha, irekhodi yenziwe kwifayile encinci yokubhala phambili.

Ingeniso nganye ukuya kwindawo yokukhangela igcinwe kuyo. Kwezi fayile, sibeka ubungakanani - umzekelo, 64 mb. Xa igcwalisa, ukurekhoda kuqala ukuya kwifayile yesibini. Kwaye emva kokuqalisa kwakhona, iTarantool iphinda ibuyele kwindawo yokukhangela yokugqibela kwaye iqengqeleke phezu kwayo yonke intengiselwano yamva ide iyeke.

KwiTarantool, unokudibanisa i-database ekhawuleza kakhulu kunye nesicelo sokusebenza nabo. Nantsi indlela ekulula ngayo ukwenza

Ukwenza ushicilelo olunjalo, kufuneka ukhankanye ukhetho kwibhokisi.cfg useto (kwifayile yomzekelo.lua):

wal_mode = “write”;

ukusetyenziswa kwedatha

Ngento esiyibhalileyo ngoku, ungasebenzisa iTarantula ukugcina idatha kwaye iya kusebenza ngokukhawuleza njengesiseko sedatha. Kwaye ngoku i-cherry kwikhekhe - unokwenza ntoni ngayo yonke into.

Ukubhala isicelo

Umzekelo, masibhale isicelo esinjalo seTarantula

Jonga isicelo phantsi komphangi

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

Sibhengeza itafile kwi-lua echaza iisimboli. Le theyibhile iyafuneka ukwenza umtya ongaqhelekanga.

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

Emva koko, sibhengeza umsebenzi - randomString kwaye unike ixabiso lobude kwizibiyeli.

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

Emva koko sidibanisa i-router ye-http kunye nomncedisi we-http kwi-server yethu ye-Tarantula, i-JSON, esiya kuyinika umxhasi.

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

Emva koko, siqala kwi-port 8080 kuzo zonke iindawo ze-server ze-http, eziza kungena kuzo zonke izicelo kunye neempazamo.

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

Okulandelayo, sibhengeza indlela ukuba isicelo kunye nendlela ye-GET sifika kwi-port 8080 / count, ngoko sibiza umsebenzi kumgca omnye. Ibuyisela isimo - 200, 404, 403 okanye nantoni na esiyichazayo.

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

Emzimbeni, sibuyisela i-json.encode, sicacisa ukubala kunye ne-getcount kuyo, ebizwa kwaye ibonisa inani leerekhodi kwidatha yethu.

Indlela yesibini

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)

Apho emgceni umzila: indlela ({indlela = 'GET', indlela = '/umqondiso'}, umsebenzi () sibiza umsebenzi kwaye sivelise uphawu.

Umgca uphawu lwendawo = randomString(32) luluhlu olungakhethiyo olunamagama angama-32.
Nomgca yendawo yokugqibela = box.space.example:len() sikhupha into yokugqibela.
Kwaye emgceni box.space.example:faka{eyokugqibela + 1, uphawu } sibhala idatha kwi-database yethu, oko kukuthi, sinyusa nje i-ID ngo-1. Oku kunokwenziwa, ngendlela, kungekhona nje ngendlela enzima. I-Tarantula inolandelelwano lwale meko.

Sibhala umqondiso apho.

Ngaloo ndlela, sibhale isicelo kwifayile enye. Unokufikelela kwidatha kwangoko, kwaye imodyuli yebhokisi iya kwenza wonke umsebenzi omdaka kuwe.

Imamela i-http kwaye isebenza ngedatha, yonke into ikwimeko enye - zombini isicelo kunye nedatha. Ngoko ke, yonke into yenzeka ngokukhawuleza.

Ukuqhuba, sifaka imodyuli ye-http:

Siyenza njani loo nto, jonga phantsi kombhuqi

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

Sifuna kwakhona i-prometheus ukuqhuba:

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

Siqala kwaye sinokufikelela kwiimodyuli

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 iwonga lama-200.
/uphawu lukhupha ithokheni kwaye lubhale olu phawu kuvimba weenkcukacha.

Isantya sokuvavanya

Masiqhube umlinganiselo wezicelo ezingama-50. Izicelo ezikhuphisanayo ziya kuba ngama-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:/#

Iimpawu zikhutshwa. Kwaye sihlala sirekhoda idatha. I-99% yezicelo zagqitywa nge-42 milliseconds. Ngokuhambelanayo, sinezicelo ze-3500 ngesibini kumatshini omncinci, apho kukho ii-cores ezi-2 kunye ne-4 gigabytes yememori.

Unokukhetha kwakhona ithokheni ye-50000 kwaye ubone ixabiso layo.

Awukwazi ukusebenzisa i-http kuphela, sebenzisa imisebenzi yangasemva eyenza idatha yakho. Ukongeza, kukho iintlobo ezahlukeneyo zoxinzelelo. Ngokomzekelo, unokubiza imisebenzi ekuhlaziyweni, khangela into - ukulungisa iingxabano.

Ungabhala izicelo zeskripthi ngokuthe ngqo kwiseva yedatha ngokwayo, kwaye ungathinteli nantoni na, qhagamshela nayiphi na imodyuli kwaye usebenzise nayiphi na ingqiqo.

Umncedisi wesicelo unokufikelela kwiiseva zangaphandle, uqokelele idatha kwaye uyongeze kwisiseko sayo sedatha. Idata esuka kolu lwazi iya kusetyenziswa zezinye izicelo.

Oku kuya kwenziwa yiTarantula ngokwayo, kwaye akukho mfuneko yokubhala isicelo esahlukileyo.

Ekugqibeleni

Eli licandelo nje lokuqala lomsebenzi omkhulu. Eyesibini iya kupapashwa kungekudala kwibhlog yeqela le-Mail.ru, kwaye ngokuqinisekileyo siya kongeza ikhonkco kuyo kweli nqaku.

Ukuba unomdla wokuzimasa iminyhadala apho sidala ezi zinto kwi-intanethi kwaye sibuze imibuzo ngexesha lokwenyani, qhagamshela I-DevOps yi-REBRAIN channel.

Ukuba ufuna ukuya kwilifu okanye unemibuzo malunga neziseko zakho, Zive ukhululekile ukuthumela isicelo.

PS Sine-2 yophicotho lwasimahla ngenyanga, mhlawumbi iprojekthi yakho iya kuba yenye yazo.

umthombo: www.habr.com

Yongeza izimvo