Tarantool-da siz super sürətli verilənlər bazası və onlarla işləmək üçün tətbiqi birləşdirə bilərsiniz. Bunu etmək nə qədər asandır

Beş il əvvəl mən Tarantool ilə işləməyə çalışdım, amma sonra bu mənim üçün işləmədi. Ancaq bu yaxınlarda Hadoop və MapReduce-un necə işlədiyi haqqında danışdığım bir vebinar keçirdim. Orada mənə bir sual verdilər: "Niyə bu iş üçün Tarantool istifadə etmirsiniz?"

Maraqdan ona qayıtmaq, ən son versiyanı sınaqdan keçirmək qərarına gəldim - və bu dəfə layihəni çox bəyəndim. İndi mən sizə Tarantool-da sadə bir proqram yazmağı, onu yükləməyi və performansını yoxlamağı göstərəcəyəm və hər şeyin nə qədər asan və sərin olduğunu görəcəksiniz.

Tarantool-da siz super sürətli verilənlər bazası və onlarla işləmək üçün tətbiqi birləşdirə bilərsiniz. Bunu etmək nə qədər asandır

Tarantool nədir

Tarantool özünü ultra sürətli verilənlər bazası kimi təqdim edir. İstədiyiniz məlumatları oraya qoya bilərsiniz. Üstəlik, onları təkrarlayın, parçalayın - yəni böyük miqdarda məlumatı bir neçə server arasında parçalayın və onlardan əldə edilən nəticələri birləşdirin - xətaya dözümlü master-master əlaqələri yaradın.

İkincisi, bu proqram serveridir. Bunun üzərinə proqramlarınızı yaza, verilənlərlə işləyə, məsələn, müəyyən qaydalara uyğun olaraq arxa planda köhnə qeydləri silə bilərsiniz. Verilərlə işləyəcək bir Http serverini birbaşa Tarantulada yaza bilərsiniz: onların miqdarını verin, orada yeni məlumatlar yazın və hamısını mastera azaldın.

Uşaqların 300 sətirdən ibarət mesaj növbəsini necə yaratdıqları haqqında bir məqalə oxudum, bu, sadəcə partlayan və tələsikdir - saniyədə 20 mesajın minimum performansı var. Burada həqiqətən dönüb çox böyük proqram yaza bilərsiniz və o, PostgreS-də olduğu kimi yaddaş olmayacaq.

Bu məqalədə bu server kimi bir şeyi təsvir etməyə çalışacağam, sadəcə sadədir.

Quraşdırma

Test üçün mən üç standart virtual maşın işə saldım - 20 GB sabit disk, Ubuntu 18.04. 2 virtual CPU və 4 giq yaddaş.

Tarantool-u quraşdırırıq - bash skriptini işə salın və ya bir depo əlavə edin və Tarantool-u quraşdırın. Skriptə keçid - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Bizdə belə əmrlər var:

tarantoolctl — Tarantula instansiyalarını idarə etmək üçün əsas komanda.
/etc/tarantool - burada bütün konfiqurasiya var.
var/log/tarantool - budur loglar.
var/lib/tarantool — məlumatlar burada yerləşir, sonra isə instansiyalara bölünür.

Nümunə-mövcud və instansiya-aktiv qovluqlar var - bu işə salınacaqları ehtiva edir - hansı portları dinlədiyini, hansı yaddaşın mövcud olduğunu təsvir edən lua kodu olan nümunə konfiqurasiya faylı, Vinil mühərrik parametrləri, başlanğıcda işləyən kod serverlər, parçalanma, növbələr, köhnəlmiş məlumatların silinməsi və s.

Nümunələr PostgreS-də olduğu kimi işləyir. Məsələn, müxtəlif portlarda asılı olan verilənlər bazasının bir neçə nüsxəsini işlətmək istəyirsiniz. Məlum oldu ki, bir serverdə bir neçə verilənlər bazası nümunəsi işə salınır, onlar müxtəlif portlarda asılır. Onların tamamilə fərqli parametrləri ola bilər - bir nümunə bir məntiqi həyata keçirir, ikincisi - başqa.

Nümunələrin idarə edilməsi

Tarantula nümunələrini idarə etməyə imkan verən tarantoolctl əmrimiz var. Məsələn, tarantoolctl yoxlama nümunəsi konfiqurasiya faylını yoxlayacaq və deyəcək - əgər orada sintaksis səhvləri yoxdursa, fayl yaxşıdır.

Nümunənin statusunu görə bilərsiniz - tarantoolctl status nümunəsi. Eyni şəkildə başlaya, dayandıra, yenidən başlaya bilərsiniz.

Nümunə işə düşdükdən sonra ona iki yolla qoşula bilərsiniz.

1. İnzibati konsol

Varsayılan olaraq, Tarantool bir yuva açır, Tarantool-u idarə etmək üçün ora normal ASCII mətni göndərilir. Konsola qoşulma həmişə admin istifadəçisi altında baş verir, identifikasiya yoxdur, ona görə də Tarantulanı idarə etmək üçün konsol portunu kənara köçürməyə ehtiyac yoxdur.

Bu metoddan istifadə edərək qoşulmaq üçün Tarantoolctl instance name daxil etməlisiniz. Komanda konsolu işə salacaq və admin istifadəçisi kimi qoşulacaq. Konsol portunu heç vaxt kənara qoymayın - onu vahid rozetka kimi tərk etmək daha yaxşıdır. Onda yalnız rozetkaya yazmaq imkanı olanlar Tarantulaya qoşula biləcəklər.

Bu üsul inzibati işlər üçün lazımdır. Məlumatlarla işləmək üçün ikinci üsuldan - ikili protokoldan istifadə edin.

2. Xüsusi porta qoşulmaq üçün ikili protokoldan istifadə

Konfiqurasiyada xarici kommunikasiyalar üçün port açan dinləmə direktivi var. Bu port binar protokolla istifadə olunur və identifikasiya orada aktivləşdirilir.

Bu əlaqə üçün tarantoolctl connect to port nömrəsindən istifadə olunur. Bundan istifadə edərək, uzaq serverlərə qoşula, autentifikasiyadan istifadə edə və müxtəlif giriş hüquqları verə bilərsiniz.

Məlumatların Qeydiyyatı və Qutu Modulu

Tarantool həm verilənlər bazası, həm də proqram serveri olduğundan müxtəlif modullara malikdir. Bizi qutu modulu maraqlandırır - o, verilənlərlə işləməyi həyata keçirir. Siz qutuya bir şey yazdığınız zaman Tarantool məlumatları diskə yazır, yaddaşda saxlayır və ya onunla başqa bir şey edir.

Rekord

Məsələn, qutu moduluna daxil oluruq və box.once funksiyasını çağırırıq. Bu, server işə salındıqda Tarantool-u kodumuzu işlətməyə məcbur edəcək. Məlumatlarımızın saxlanacağı bir boşluq yaradırıq.

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

Bundan sonra biz məlumatları axtara biləcəyimiz əsas indeks - ilkin - yaradırıq. Varsayılan olaraq, heç bir parametr göstərməsəniz, hər bir qeyddəki birinci sahə əsas indeks üçün istifadə olunacaq.

Sonra qonaq istifadəçiyə qrant veririk, bunun altında binar protokol vasitəsilə əlaqə saxlayırıq. Biz bütün instansiyada oxumağa, yazmağa və icra etməyə icazə veririk.

Adi verilənlər bazası ilə müqayisədə burada hər şey olduqca sadədir. Bizdə boş yer var - məlumatlarımızın sadəcə saxlandığı bir sahə. Hər bir qeyd tuple adlanır. MessagePack-də qablaşdırılıb. Bu, çox gözəl formatdır - ikilidir və daha az yer tutur - 18-yə qarşı 27 bayt.

Tarantool-da siz super sürətli verilənlər bazası və onlarla işləmək üçün tətbiqi birləşdirə bilərsiniz. Bunu etmək nə qədər asandır

Onunla işləmək olduqca rahatdır. Demək olar ki, hər bir sətir, hər bir məlumat qeydində tamamilə fərqli sütunlar ola bilər.

Box.space əmrindən istifadə edərək bütün boşluqlara baxa bilərik. Konkret nümunəni seçmək üçün box.space misalını yazın və bu barədə tam məlumat əldə edin.

Tarantool-un iki daxili mühərriki var: Yaddaş və Vinil. Yaddaş bütün məlumatları yaddaşda saxlayır. Buna görə də, hər şey sadə və tez işləyir. Məlumat diskə atılır və həmçinin qabaqcadan yazma jurnalı mexanizmi var, ona görə də server qəzaya uğrasa, heç nə itirməyəcəyik.

Vinil diskdə məlumatları bizə daha tanış olan formada saxlayır - yəni siz yaddaşımızda olduğundan daha çox məlumat saxlaya bilərsiniz və Tarantula onu diskdən oxuyacaq.

Hələlik biz Yaddaşdan istifadə edəcəyik.

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>

İndeks:

İstənilən məkan üçün ilkin indeks yaradılmalıdır, çünki onsuz heç nə işləməyəcək. Hər hansı bir verilənlər bazasında olduğu kimi, biz ilk sahəni - qeyd ID-ni yaradırıq.

Parts:

Burada indeksimizin nədən ibarət olduğunu göstəririk. O, bir hissədən ibarətdir - istifadə edəcəyimiz ilk sahə unsigned tiplidir - müsbət tam ədəddir. Sənədlərdən xatırladığım qədər, ola biləcək maksimum rəqəm 18 kvintilyondur. O çoxdur.

Sonra insert əmrindən istifadə edərək məlumatları daxil edə bilərik.

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>

Birinci sahə əsas açar kimi istifadə olunur, ona görə də unikal olmalıdır. Biz sütunların sayı ilə məhdudlaşmırıq, ona görə də oraya istədiyimiz qədər məlumat daxil edə bilərik. Onlar yuxarıda təsvir etdiyim MessagePack formatında göstərilib.

Məlumat çıxışı

Sonra seçim əmrindən istifadə edərək məlumatları göstərə bilərik.

Box.example.select {1} düyməsi ilə istədiyiniz girişi göstərəcək. Açarı aşağı salsaq, əlimizdə olan bütün qeydləri görəcəyik. Onların hamısı sütunların sayında fərqlənir, lakin burada, prinsipcə, sütunlar anlayışı yoxdur - sahə nömrələri var.

Tamamilə istənilən miqdarda məlumat ola bilər. Məsələn, biz onları ikinci sahə üzrə axtarmalıyıq. Bunun üçün yeni ikinci dərəcəli indeks yaradırıq.


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

Create_index əmrindən istifadə edirik.
Gəlin bunu İkinci dərəcəli adlandıraq.

Bundan sonra parametrləri təyin etməlisiniz. İndeks növü TREE-dir. Bu unikal olmaya bilər, ona görə də Unique = false daxil edin.

Sonra indeksimizin hansı hissələrdən ibarət olduğunu göstəririk. Sahə indeksi bağladığımız sahənin nömrəsidir və sətir tipini təyin edirik. Və beləcə yaradıldı.

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>

İndi bunu belə adlandıra bilərik:

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

Saving

Nümunəni yenidən başladın və məlumatları yenidən çağırmağa çalışsaq, orada olmadığını görəcəyik - hər şey boşdur. Bu, Tarantool-un yoxlama nöqtələri yaratması və məlumatları diskdə saxlaması ilə baş verir, lakin növbəti saxlama qədər işi dayandırsaq, bütün əməliyyatları itirəcəyik - çünki, məsələn, iki saat əvvəl olan son yoxlama məntəqəsindən bərpa edəcəyik.

Hər saniyəyə qənaət etmək də işləməyəcək, çünki daim diskə 20 GB atmaq yaxşı fikir deyil.

Bu məqsədlə qabaqcadan yazma jurnalı konsepsiyası icad edilmiş və tətbiq edilmişdir. Onun köməyi ilə verilənlərdəki hər dəyişiklik üçün kiçik bir qabaqcadan yazmaq jurnalında bir giriş yaradılır.

Keçid məntəqəsinə qədər hər bir giriş onlarda saxlanılır. Bu fayllar üçün ölçü təyin edirik - məsələn, 64 MB. Dolu olduqda, qeyd ikinci fayla getməyə başlayır. Yenidən başladıqdan sonra, Tarantool son yoxlama nöqtəsindən bərpa olunur və sonra dayanana qədər bütün sonrakı əməliyyatlar üzərində yuvarlanır.

Tarantool-da siz super sürətli verilənlər bazası və onlarla işləmək üçün tətbiqi birləşdirə bilərsiniz. Bunu etmək nə qədər asandır

Belə qeydi həyata keçirmək üçün box.cfg parametrlərində (example.lua faylında) seçimi qeyd etməlisiniz:

wal_mode = “write”;

məlumat istifadəsi

İndi yazdıqlarımızla, məlumatları saxlamaq üçün Tarantuladan istifadə edə bilərsiniz və o, verilənlər bazası kimi çox tez işləyəcək. İndi tortun üzərindəki buzlanma bütün bunları edə biləcəyiniz şeydir.

Ərizə yazmaq

Məsələn, Tarantula üçün aşağıdakı ərizəni yazaq

Tətbiqə spoyler altında baxın

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

Biz simvolları müəyyən edən lua-da bəzi cədvəl elan edirik. Bu lövhə təsadüfi sətir yaratmaq üçün lazımdır.

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

Bundan sonra biz funksiyanı - randomString elan edirik və uzunluq dəyərini mötərizədə veririk.

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

Sonra http routeri və http serverini müştəriyə göndərəcəyimiz Tarantula serverimiz JSON-a bağlayırıq.

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

Bundan sonra, bütün sorğuları və səhvləri qeyd edəcək bütün http server interfeyslərində 8080 portundan başlayırıq.

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

Sonra marşrutu elan edirik ki, GET metodu ilə sorğu 8080 /count portuna gələrsə, funksiyanı bir sətirdən çağırırıq. O, statusu qaytarır - 200, 404, 403 və ya müəyyən etdiyimiz hər hansı digər.

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

Bədəndə json.encode-u qaytarırıq, orada biz count və getcount göstəririk ki, bu da adlanır və verilənlər bazamızdakı qeydlərin sayını göstərir.

İkinci üsul

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)

Xəttdə harada marşrutlaşdırıcı:marşrut({metod = 'GET', yol = '/token'}, funksiya() funksiyanı çağırırıq və işarə yaradırıq.

Sətir yerli token = randomString(32) 32 simvoldan ibarət təsadüfi sətirdir.
Xətdə yerli sonuncu = box.space.example:len() sonuncu elementi çıxarırıq.
Və cərgədə box.space.example:insert{ son + 1, işarə } məlumatları verilənlər bazamıza yazırıq, yəni sadəcə olaraq ID-ni 1 artırırıq. Yeri gəlmişkən, bunu təkcə bu yöndəmsiz şəkildə etmək olar. Tarantulada bunun üçün ardıcıllıqlar var.

Tokeni orada yazırıq.

Beləliklə, ərizəni bir faylda yazdıq. Orada məlumatları birbaşa manipulyasiya edə bilərsiniz və qutu modulu sizin üçün bütün çirkli işləri görəcək.

Http-ə qulaq asır və məlumatlarla işləyir, hər şey bir instansiyadadır - həm proqram, həm də məlumat. Buna görə də hər şey olduqca tez baş verir.

Başlamaq üçün http modulunu quraşdırırıq:

Bunu necə edirik, spoylerin altına baxın

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

Bizə də qaçmaq üçün prometey lazımdır:

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

Biz modulları işə salırıq və daxil ola bilirik

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 bizə 200 statusu verir.
/token token verir və bu tokeni verilənlər bazasına yazır.

Sürəti sınamaq

Gəlin 50 sorğu üçün bir müqayisə aparaq. 000 rəqabətli sorğu olacaq.

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

Tokenlər verilir. Və biz daim məlumatları qeyd edirik. Sorğuların 99%-i 42 millisaniyə ərzində işlənib. Müvafiq olaraq, 3500 nüvəli və 2 giqabayt yaddaşa malik kiçik bir maşında saniyədə təxminən 4 sorğumuz var.

Siz həmçinin 50000 token seçib onun dəyərini görə bilərsiniz.

Siz yalnız http deyil, həm də məlumatlarınızı emal edən fon funksiyalarından istifadə edə bilərsiniz. Üstəlik, müxtəlif tetikleyiciler var. Məsələn, yeniləmələrdə funksiyaları çağıra bilərsiniz, bir şey yoxlaya bilərsiniz - münaqişələri düzəldin.

Skript proqramlarını birbaşa verilənlər bazası serverinin özündə yaza bilərsiniz və heç bir şeylə məhdudlaşa, istənilən modulları birləşdirə və istənilən məntiqi həyata keçirə bilərsiniz.

Tətbiq serveri xarici serverlərə daxil ola, məlumatları əldə edə və verilənlər bazasına əlavə edə bilər. Bu verilənlər bazasındakı məlumatlar digər proqramlar tərəfindən istifadə olunacaq.

Tarantula bunu özü edəcək və ayrıca ərizə yazmalı olmayacaqsınız.

Nəticədə

Bu, böyük bir işin yalnız birinci hissəsidir. İkincisi çox yaxında Mail.ru Group bloqunda dərc olunacaq və biz mütləq bu materialda ona bir keçid əlavə edəcəyik.

Onlayn olaraq bunları qurduğumuz tədbirlərdə iştirak etmək və real vaxt rejimində suallar verməklə maraqlanırsınızsa, qoşulun REBRAIN kanalı tərəfindən DevOps.

Buluda keçmək lazımdırsa və ya infrastrukturunuzla bağlı suallarınız varsa, Sorğu göndərməkdən çekinmeyin.

PS Ayda 2 pulsuz auditimiz var, bəlkə də layihəniz onlardan biri olacaq.

Mənbə: www.habr.com

Добавить комментарий