Tarantool сізге өте жылдам дерекқорды және олармен жұмыс істеуге арналған қолданбаны біріктіруге мүмкіндік береді. Мұны істеу қаншалықты оңай

Бес жыл бұрын мен Tarantool-пен жұмыс істеуге тырыстым, бірақ ол мен үшін жұмыс істемеді. Бірақ жақында мен вебинар өткіздім, онда мен Hadoop және MapReduce қалай жұмыс істейтіні туралы айттым. Онда олар маған сұрақ қойды: «Неге бұл тапсырма үшін Tarantool қолданбасқа?»

Қызығушылықтан мен оған қайта оралуды, соңғы нұсқаны сынауды шештім - бұл жолы жоба маған қатты ұнады. Енді мен сізге Tarantool-да қарапайым қосымшаны қалай жазу керектігін көрсетемін, оны жүктеп, оның жұмысын тексеремін, сонда сіз бәрі қаншалықты оңай және керемет екенін көресіз.

Tarantool сізге өте жылдам дерекқорды және олармен жұмыс істеуге арналған қолданбаны біріктіруге мүмкіндік береді. Мұны істеу қаншалықты оңай

Tarantool дегеніміз не

Tarantool өзін өте жылдам дерекқор ретінде көрсетеді. Онда сіз қалаған кез келген деректерді қоя аласыз. Сонымен қатар, оларды қайталаңыз, кесінді – яғни деректердің үлкен көлемін бірнеше серверлер арқылы бөліп, олардан алынған нәтижелерді біріктіріңіз - ақауларға төзімді мастер-мастер қосылымдарын жасаңыз.

Екіншіден, бұл қолданбалы сервер. Сіз оған қосымшаларыңызды жаза аласыз, деректермен жұмыс жасай аласыз, мысалы, белгілі бір ережелерге сәйкес фондық режимде ескі жазбаларды жоя аласыз. Деректермен жұмыс істейтін Http серверін тікелей Tarantula-да жазуға болады: олардың санын беріңіз, сол жерде жаңа деректерді жазып, барлығын шеберге азайтыңыз.

Мен жігіттердің 300 жолдан тұратын хабарламалар кезегін қалай жасағаны туралы мақаланы оқыдым, бұл жай ғана жарылып, асығыс - олардың секундына 20 000 хабарламаның ең аз өнімділігі бар. Мұнда сіз шынымен айналдыра аласыз және өте үлкен қосымшаны жаза аласыз және ол PostgreS-тегідей сақтау болмайды.

Мен осы мақалада осы сервер сияқты нәрсені сипаттауға тырысамын, тек қарапайым.

параметр

Сынақ үшін мен үш стандартты виртуалды машинаны іске қостым - 20 ГБ қатты диск, Ubuntu 18.04. 2 виртуалды процессор және 4 гиг жады.

Біз Tarantool орнатамыз - bash сценарийін іске қосыңыз немесе репозиторий қосыңыз және Tarantool орнатуды орындаңыз. Сценарийге сілтеме - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Бізде келесідей командалар бар:

tarantoolctl — Тарантула даналарын басқарудың негізгі пәрмені.
/etc/tarantool - міне, бүкіл конфигурация.
var/log/tarantool - міне бөренелер.
var/lib/tarantool — деректер осында жатыр, содан кейін ол инстанцияларға бөлінеді.

Дана-қол жетімді және дананы қосу қалталары бар - онда не іске қосылатыны бар - lua коды бар дананы конфигурациялау файлы, ол қандай порттарды тыңдайтынын, оған қандай жад қолжетімді екенін, Винил қозғалтқышының параметрлері, іске қосу кезінде жұмыс істейтін кодты сипаттайды. серверлер, бөлшектеу, кезектер, ескірген деректерді жою және т.б.

Даналар PostgreS сияқты жұмыс істейді. Мысалы, әртүрлі порттарда ілінетін дерекқордың бірнеше көшірмелерін іске қосқыңыз келеді. Бір серверде әртүрлі порттарда ілінетін бірнеше дерекқор даналары іске қосылатыны белгілі болды. Олардың мүлдем басқа параметрлері болуы мүмкін - бір данасы бір логиканы жүзеге асырады, екіншісі - басқа.

Даналарды басқару

Бізде Tarantula даналарын басқаруға мүмкіндік беретін tarantoolctl пәрмені бар. Мысалы, tarantoolctl тексеру мысалы конфигурация файлын тексереді және синтаксистік қателер болмаса, файл дұрыс деп айтады.

Сіз дананың күйін көре аласыз - tarantoolctl күй мысалы. Дәл осылай бастау, тоқтату, қайта қосу әрекеттерін орындауға болады.

Дана іске қосылғаннан кейін оған екі жолмен қосылуға болады.

1. Әкімшілік консоль

Әдепкі бойынша, Tarantool ұяшықты ашады, Tarantool басқару үшін қалыпты ASCII мәтіні жіберіледі. Консольге қосылу әрқашан әкімші пайдаланушының астында болады, аутентификация жоқ, сондықтан Tarantula басқару үшін консоль портын сыртқа шығарудың қажеті жоқ.

Осы әдісті пайдаланып қосылу үшін Tarantoolctl енгізу данасы атауын енгізу керек. Пәрмен консольді іске қосады және әкімші пайдаланушы ретінде қосылады. Консоль портын ешқашан сыртқа шығармаңыз - оны құрылғының розеткасы ретінде қалдырған дұрыс. Содан кейін розеткаға жазу мүмкіндігі бар адамдар ғана Тарантулаға қосыла алады.

Бұл әдіс әкімшілік істер үшін қажет. Деректермен жұмыс істеу үшін екінші әдісті – екілік протоколды қолданыңыз.

2. Белгілі бір портқа қосылу үшін екілік протоколды пайдалану

Конфигурация сыртқы байланыстар үшін портты ашатын тыңдау директивасын қамтиды. Бұл порт екілік протоколмен пайдаланылады және аутентификация сол жерде қосылған.

Бұл қосылым үшін port нөміріне tarantoolctl қосылымы пайдаланылады. Оның көмегімен сіз қашықтағы серверлерге қосыла аласыз, аутентификацияны пайдалана аласыз және әртүрлі кіру құқықтарын бере аласыз.

Деректерді жазу және қорап модулі

Tarantool дерекқор да, қолданбалы сервер де болғандықтан, оның әртүрлі модульдері бар. Бізді бокс модулі қызықтырады - ол деректермен жұмысты жүзеге асырады. Қорапқа бірдеңе жазғанда, Tarantool деректерді дискіге жазады, оны жадқа сақтайды немесе онымен басқа әрекет жасайды.

рекорд

Мысалы, біз box модуліне кіріп, box.once функциясын шақырамыз. Бұл сервер инициализацияланған кезде Tarantool кодты іске қосуға мәжбүр етеді. Біз деректеріміз сақталатын кеңістік жасаймыз.

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

Осыдан кейін біз деректерді іздеуге болатын негізгі индексті - негізгі - жасаймыз. Әдепкі бойынша, ешбір параметрді көрсетпесеңіз, әрбір жазбадағы бірінші өріс негізгі индекс үшін пайдаланылады.

Содан кейін біз қонақ пайдаланушыға грант жасаймыз, оның аясында біз екілік протокол арқылы қосыламыз. Біз бүкіл данада оқуға, жазуға және орындауға мүмкіндік береміз.

Кәдімгі дерекқорлармен салыстырғанда мұнда бәрі өте қарапайым. Бізде кеңістік бар - бұл біздің деректеріміз жай ғана сақталатын аймақ. Әрбір жазба кортеж деп аталады. Ол MessagePack ішінде оралған. Бұл өте керемет пішім - ол екілік және аз орын алады - 18-ге қарсы 27 байт.

Tarantool сізге өте жылдам дерекқорды және олармен жұмыс істеуге арналған қолданбаны біріктіруге мүмкіндік береді. Мұны істеу қаншалықты оңай

Онымен жұмыс істеу өте ыңғайлы. Әрбір дерлік жолдың, әрбір деректер жазбасының мүлдем басқа бағандары болуы мүмкін.

Біз барлық бос орындарды Box.space командасы арқылы көре аламыз. Белгілі бір дананы таңдау үшін box.space мысалын жазып, ол туралы толық ақпаратты алыңыз.

Tarantool-да екі кіріктірілген қозғалтқыш бар: жад және винил. Жад барлық мәліметтерді жадта сақтайды. Сондықтан бәрі қарапайым және жылдам жұмыс істейді. Деректер дискіге тасталады, сонымен қатар алдын ала жазу журналы механизмі бар, сондықтан сервер бұзылған жағдайда ештеңе жоғалтпаймыз.

Винил дискідегі деректерді бізге көбірек таныс пішінде сақтайды - яғни сіз біздегі жадтан гөрі көбірек деректерді сақтай аласыз, ал Тарантула оны дискіден оқиды.

Әзірге біз жадты қолданамыз.

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>

Индекс:

Кез келген кеңістік үшін бастапқы индексті жасау керек, өйткені онсыз ештеңе жұмыс істемейді. Кез келген дерекқордағыдай біз бірінші өрісті – жазба идентификаторын жасаймыз.

Бөлшектер:

Мұнда біз индексіміздің неден тұратынын көрсетеміз. Ол бір бөліктен тұрады - біз қолданатын бірінші өріс unsigned түрі - натурал бүтін сан. Құжаттамадан есімде қалғаны, максималды сан 18 квинтиллон болуы мүмкін. Бұл көп.

Содан кейін біз кірістіру командасы арқылы деректерді кірістіре аламыз.

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>

Бірінші өріс негізгі кілт ретінде пайдаланылады, сондықтан ол бірегей болуы керек. Біз бағандар санымен шектелмейміз, сондықтан біз оған қалағанымызша деректерді енгізе аламыз. Олар мен жоғарыда сипаттаған MessagePack пішімінде көрсетілген.

Мәліметтерді шығару

Содан кейін таңдау пәрмені арқылы деректерді көрсете аламыз.

{1} пернесі бар Box.example.select қажетті жазбаны көрсетеді. Егер біз кілтті төмендетсек, бізде бар барлық жазбаларды көреміз. Олардың барлығы бағандар саны бойынша ерекшеленеді, бірақ мұнда, негізінен, бағандар туралы түсінік жоқ - өріс нөмірлері бар.

Деректердің кез келген саны болуы мүмкін. Мысалы, біз оларды екінші өріс бойынша іздеуіміз керек. Ол үшін жаңа қосымша индекс жасаймыз.


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

Біз Create_index командасын қолданамыз.
Оны Екінші деп атаймыз.

Осыдан кейін сіз параметрлерді көрсетуіңіз керек. Индекс түрі - TREE. Ол бірегей болмауы мүмкін, сондықтан Unique = false енгізіңіз.

Содан кейін индексіміздің қандай бөліктерден тұратынын көрсетеміз. Өріс - индексті байланыстыратын және жол түрін көрсететін өрістің нөмірі. Осылайша, ол құрылды.

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>

Енді оны осылай атауға болады:

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

сақтау

Егер біз дананы қайта іске қосып, деректерді қайта шақыруға тырыссақ, біз оның жоқ екенін көреміз - бәрі бос. Бұл Tarantool бақылау нүктелерін жасайтын және деректерді дискіге сақтайтындықтан орын алады, бірақ егер келесі сақтауға дейін жұмысын тоқтатсақ, біз барлық операцияларды жоғалтамыз - өйткені біз, мысалы, екі сағат бұрын болған соңғы бақылау нүктесінен қалпына келтіреміз.

Әр секунд сайын үнемдеу де жұмыс істемейді, өйткені дискіге 20 ГБ-ды үнемі түсіру жақсы идея емес.

Осы мақсатта алдын ала жазу журналы тұжырымдамасы ойлап табылып, жүзеге асырылды. Оның көмегімен деректердегі әрбір өзгеріс үшін алдын ала жазылатын шағын журнал файлында жазба жасалады.

Бақылау пунктіне дейінгі әрбір кіру оларда сақталады. Бұл файлдар үшін біз өлшемді орнаттық - мысалы, 64 МБ. Ол толған кезде жазу екінші файлға өте бастайды. Қайта іске қосқаннан кейін Tarantool соңғы бақылау нүктесінен қалпына келтіріледі, содан кейін ол тоқтағанша барлық кейінгі транзакцияларды ауыстырады.

Tarantool сізге өте жылдам дерекқорды және олармен жұмыс істеуге арналған қолданбаны біріктіруге мүмкіндік береді. Мұны істеу қаншалықты оңай

Мұндай жазуды орындау үшін box.cfg параметрлерінде опцияны көрсету керек (example.lua файлында):

wal_mode = “write”;

деректерді пайдалану

Қазір жазғандарымызбен сіз Тарантуланы деректерді сақтау үшін пайдалана аласыз және ол дерекқор ретінде өте жылдам жұмыс істейді. Ал енді торттағы глазурь сіз мұның бәрін жасай аласыз.

Өтініш жазу

Мысалы, Тарантулаға келесі қосымшаны жазайық

Спойлер астындағы қолданбаны қараңыз

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

Біз lua тілінде таңбаларды анықтайтын кейбір кестені жариялаймыз. Бұл тақта кездейсоқ жолды құру үшін қажет.

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

Осыдан кейін біз функцияны жариялаймыз - randomString және жақшаның ішінде ұзындық мәнін береміз.

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

Содан кейін біз http маршрутизаторы мен http серверін клиентке жіберетін Tarantula серверіне JSON қосамыз.

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

Осыдан кейін біз барлық http сервер интерфейстеріндегі 8080 портынан бастаймыз, ол барлық сұраулар мен қателерді тіркейді.

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

Әрі қарай, GET әдісі бар сұрау 8080 /count портына келсе, онда біз бір жолдан функцияны шақырамыз. Ол күйді қайтарады - 200, 404, 403 немесе біз көрсеткен кез келген басқа.

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

Денеде біз json.encode қайтарамыз, онда біз count және getcount көрсетеміз, ол шақырылады және біздің дерекқордағы жазбалар санын көрсетеді.

Екінші әдіс

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)

Қай жерде маршрутизатор:бағыт({әдіс = 'GET', жол = '/токен'}, функция() функцияны шақырамыз және таңбалауышты генерациялаймыз.

Жол жергілікті таңбалауыш = randomString(32) 32 таңбадан тұратын кездейсоқ жол.
Кезекте жергілікті соңғы = box.space.example:len() біз соңғы элементті шығарамыз.
Және қатарда box.space.example:insert{ соңғы + 1, таңбалауыш } біз мәліметтерді дерекқорымызға жазамыз, яғни идентификаторды жай ғана 1-ге көбейтеміз. Айтпақшы, мұны тек осы ебедейсіз жолмен ғана емес жасауға болады. Тарантулада бұл үшін тізбектер бар.

Біз сонда белгіні жазамыз.

Осылайша, біз өтінішті бір файлға жаздық. Онда деректерді тікелей өңдеуге болады және қорап модулі сіз үшін барлық лас жұмыстарды орындайды.

Ол http тыңдайды және деректермен жұмыс істейді, барлығы бір данада - қолданбада да, деректерде де. Сондықтан бәрі өте тез болады.

Бастау үшін http модулін орнатамыз:

Мұны қалай жасаймыз, спойлердің астына қараңыз

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

Бізге жүгіру үшін прометей қажет:

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

Біз модульдерді іске қосамыз және оларға қол жеткізе аламыз

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 таңбалауыш шығарады және бұл таңбалауыш дерекқорға жазады.

Жылдамдықты сынау

50 000 сұрауға арналған эталонды орындайық. 500 бәсекелес өтінім болады.

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

Токендер шығарылады. Ал біз деректерді үнемі жазып отырамыз. Сұраныстардың 99%-ы 42 миллисекундта өңделді. Тиісінше, бізде 3500 ядросы және 2 гигабайт жады бар шағын машинада секундына шамамен 4 сұраныс бар.

Сондай-ақ, 50000 XNUMX таңбалауышты таңдап, оның мәнін көруге болады.

Сіз тек http ғана емес, сонымен қатар деректеріңізді өңдейтін фондық функцияларды іске қоса аласыз. Оның үстіне әртүрлі триггерлер бар. Мысалы, жаңартулардағы функцияларды шақыруға, бір нәрсені тексеруге болады - қайшылықтарды түзету.

Сценарий қосымшаларын тікелей дерекқор серверінің өзінде жаза аласыз және ештеңемен шектелмей, кез келген модульдерді қосып, кез келген логиканы жүзеге асыра аласыз.

Қолданбалы сервер сыртқы серверлерге қол жеткізе алады, деректерді шығарып алады және оны өзінің дерекқорына қоса алады. Бұл дерекқордағы деректерді басқа қолданбалар пайдаланады.

Тарантула мұны өзі жасайды және сізге бөлек өтініш жазудың қажеті жоқ.

Қорытындылай келе

Бұл үлкен жұмыстың алғашқы бөлігі ғана. Екіншісі жақын арада Mail.ru Group блогында жарияланады және біз оған сілтемені осы материалда міндетті түрде қосамыз.

Егер сіз осы нәрселерді онлайн жасайтын және нақты уақытта сұрақтар қоятын іс-шараларға қатысуға қызығушылық танытсаңыз, реттеңіз REBRAIN ұсынған DevOps арнасы.

Бұлтқа көшу қажет болса немесе инфрақұрылым туралы сұрақтарыңыз болса, өтініш қалдыруға болады.

PS Бізде айына 2 тегін аудит бар, мүмкін сіздің жобаңыз солардың бірі болуы мүмкін.

Ақпарат көзі: www.habr.com

пікір қалдыру