Di Tarantool, Anda dapat menggabungkan database super cepat dan aplikasi untuk bekerja dengannya. Inilah betapa mudahnya melakukannya

Lima tahun yang lalu saya mencoba bekerja dengan Tarantool, tetapi tidak berhasil. Namun baru-baru ini saya mengadakan webinar di mana saya berbicara tentang Hadoop dan cara kerja MapReduce. Di sana mereka mengajukan pertanyaan kepada saya: “Mengapa tidak menggunakan Tarantool untuk tugas ini?”

Karena penasaran, saya memutuskan untuk kembali lagi, menguji versi terbaru - dan kali ini saya sangat menyukai proyek ini. Sekarang saya akan menunjukkan cara menulis aplikasi sederhana di Tarantool, memuatnya dan memeriksa kinerjanya, dan Anda akan melihat betapa mudah dan kerennya semuanya.

Di Tarantool, Anda dapat menggabungkan database super cepat dan aplikasi untuk bekerja dengannya. Inilah betapa mudahnya melakukannya

Apa itu Tarantool

Tarantool memposisikan dirinya sebagai database ultra-cepat. Anda dapat memasukkan data apa pun yang Anda inginkan di sana. Selain itu, replikasi, shard - yaitu, bagi sejumlah besar data ke beberapa server dan gabungkan hasilnya - buat koneksi master-master yang toleran terhadap kesalahan.

Kedua, ini adalah server aplikasi. Anda dapat menulis aplikasi Anda di dalamnya, bekerja dengan data, misalnya, menghapus catatan lama di latar belakang sesuai aturan tertentu. Anda dapat menulis server Http langsung di Tarantula yang akan bekerja dengan data: berikan jumlahnya, tulis data baru di sana dan kurangi semuanya ke master.

Saya membaca artikel tentang bagaimana orang-orang membuat antrian pesan sebanyak 300 baris, yang terus-menerus meledak dan terburu-buru - mereka memiliki kinerja minimum 20 pesan per detik. Di sini Anda benar-benar dapat membalik dan menulis aplikasi yang sangat besar, dan itu tidak akan menjadi penyimpanan, seperti di PostgreS.

Saya akan mencoba menjelaskan sesuatu seperti server ini, sederhana saja, di artikel ini.

Instalasi

Untuk pengujian, saya memulai tiga mesin virtual standar - hard drive 20 GB, Ubuntu 18.04. 2 CPU virtual dan 4 gigs memori.

Kami menginstal Tarantool - jalankan skrip bash atau tambahkan repositori dan lakukan apt get install Tarantool. Tautan ke skrip - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E pesta). Kami memiliki perintah seperti:

tarantoolctl — perintah utama untuk mengelola instance Tarantula.
/etc/tarantool - ini seluruh konfigurasinya.
var/log/tarantool - ini lognya.
var/lib/tarantool — datanya terletak di sini, dan kemudian dibagi menjadi beberapa contoh.

Ada folder instance-available dan instance-enable - berisi apa yang akan diluncurkan - file konfigurasi instance dengan kode lua, yang menjelaskan port apa yang didengarkannya, memori apa yang tersedia, pengaturan mesin Vinyl, kode yang dijalankan saat startup server, sharding, antrian, penghapusan data usang, dan sebagainya.

Instance berfungsi seperti di PostgreS. Misalnya, Anda ingin menjalankan beberapa salinan database yang hang pada port berbeda. Ternyata beberapa instance database diluncurkan di satu server, yang digantung di port berbeda. Mereka mungkin memiliki pengaturan yang sangat berbeda - satu contoh mengimplementasikan satu logika, yang kedua - yang lain.

Manajemen contoh

Kami memiliki perintah tarantoolctl, yang memungkinkan Anda mengelola instance Tarantula. Misalnya, contoh pemeriksaan tarantoolctl akan memeriksa file konfigurasi dan mengatakan - file baik-baik saja jika tidak ada kesalahan sintaksis di sana.

Anda dapat melihat status instance - contoh status tarantoolctl. Dengan cara yang sama Anda dapat melakukan start, stop, restart.

Setelah instance berjalan, Anda dapat menyambungkannya dengan dua cara.

1. Konsol administratif

Secara default, Tarantool membuka soket, teks ASCII normal dikirim ke sana untuk mengontrol Tarantool. Koneksi ke konsol selalu terjadi di bawah pengguna admin, tidak ada otentikasi, sehingga tidak perlu mengeksternalisasi port konsol untuk mengelola Tarantula.

Untuk terhubung menggunakan metode ini, Anda harus memasukkan Tarantoolctl masukkan nama instance. Perintah tersebut akan meluncurkan konsol dan terhubung sebagai pengguna admin. Jangan pernah memaparkan port konsol ke luar - lebih baik membiarkannya sebagai soket unit. Maka hanya mereka yang memiliki akses untuk menulis ke soket yang dapat terhubung ke Tarantula.

Cara ini diperlukan untuk urusan administratif. Untuk bekerja dengan data, gunakan metode kedua - protokol biner.

2. Menggunakan protokol biner untuk terhubung ke port tertentu

Konfigurasi tersebut berisi arahan mendengarkan, yang membuka port untuk komunikasi eksternal. Port ini digunakan dengan protokol biner dan otentikasi diaktifkan di sana.

Untuk koneksi ini, tarantoolctl connect to port number digunakan. Dengan menggunakannya, Anda dapat terhubung ke server jarak jauh, menggunakan otentikasi dan memberikan berbagai hak akses.

Modul Pencatatan Data dan Kotak

Karena Tarantool adalah database dan server aplikasi, ia memiliki berbagai modul. Kami tertarik dengan modul kotak - modul ini mengimplementasikan pekerjaan dengan data. Saat Anda menulis sesuatu ke kotak, Tarantool menulis data ke disk, menyimpannya di memori, atau melakukan hal lain dengannya.

Catatan

Misalnya, kita masuk ke modul box dan memanggil fungsi box.once. Ini akan memaksa Tarantool untuk menjalankan kode kita saat server diinisialisasi. Kami membuat ruang di mana data kami akan disimpan.

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

Setelah ini, kita membuat indeks utama - primer - yang dengannya kita dapat mencari data. Secara default, jika Anda tidak menentukan parameter apa pun, kolom pertama di setiap rekaman akan digunakan untuk indeks utama.

Kemudian kami memberikan hibah kepada pengguna tamu, yang mana kami terhubung melalui protokol biner. Kami mengizinkan membaca, menulis, dan mengeksekusi di seluruh instance.

Dibandingkan dengan database konvensional, semuanya di sini cukup sederhana. Kami memiliki ruang - area tempat data kami disimpan. Setiap record disebut tuple. Itu dikemas dalam MessagePack. Ini adalah format yang sangat keren - biner dan memakan lebih sedikit ruang - 18 byte versus 27.

Di Tarantool, Anda dapat menggabungkan database super cepat dan aplikasi untuk bekerja dengannya. Inilah betapa mudahnya melakukannya

Sangat nyaman untuk bekerja dengannya. Hampir setiap baris, setiap record data dapat memiliki kolom yang sangat berbeda.

Kita dapat melihat semua spasi menggunakan perintah Box.space. Untuk memilih instance tertentu, tulis contoh box.space dan dapatkan informasi lengkap tentangnya.

Tarantool memiliki dua mesin bawaan: Memori dan Vinyl. Memori menyimpan semua data dalam memori. Oleh karena itu, semuanya bekerja dengan sederhana dan cepat. Data dibuang ke disk, dan ada juga mekanisme log depan tulis, jadi kita tidak akan kehilangan apa pun jika server mogok.

Vinyl menyimpan data pada disk dalam bentuk yang lebih familiar bagi kita - yaitu, Anda dapat menyimpan lebih banyak data daripada memori yang kita miliki, dan Tarantula akan membacanya dari disk.

Untuk saat ini kita akan menggunakan Memori.

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>

Indeks:

Indeks utama harus dibuat untuk ruang mana pun, karena tanpanya, tidak ada yang akan berhasil. Seperti dalam database apa pun, kami membuat bidang pertama – ID rekaman.

Bagian:

Di sini kami menunjukkan terdiri dari apa indeks kami. Ini terdiri dari satu bagian - bidang pertama yang akan kita gunakan bertipe unsigned - bilangan bulat positif. Seingat saya dari dokumentasinya, jumlah maksimal yang bisa didapat adalah 18 triliun. Itu banyak.

Kemudian kita bisa memasukkan data menggunakan perintah insert.

unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...

unix/:/var/run/tarantool/example.control>

Field pertama digunakan sebagai kunci utama, jadi harus unik. Kita tidak dibatasi oleh jumlah kolom, jadi kita bisa memasukkan data sebanyak yang kita mau disana. Mereka ditentukan dalam format MessagePack yang saya jelaskan di atas.

Keluaran data

Kemudian kita bisa menampilkan datanya menggunakan perintah select.

Box.example.select dengan tombol {1} ​​akan menampilkan entri yang diinginkan. Jika kita menurunkan kuncinya, kita akan melihat semua catatan yang kita miliki. Semuanya berbeda dalam jumlah kolom, tetapi di sini, pada prinsipnya, tidak ada konsep kolom - yang ada adalah nomor bidang.

Jumlah datanya bisa berapa pun. Dan misalnya, kita perlu mencarinya berdasarkan kolom kedua. Untuk melakukan ini, kami membuat indeks sekunder baru.


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

Kami menggunakan perintah Create_index.
Sebut saja Sekunder.

Setelah ini, Anda perlu menentukan parameternya. Jenis indeksnya adalah POHON. Ini mungkin tidak unik, jadi masukkan Unique = false.

Kemudian kami menunjukkan bagian mana dari indeks kami. Bidang adalah nomor bidang yang kita ikat indeksnya, dan tentukan jenis stringnya. Dan begitulah hal itu tercipta.

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>

Sekarang kita bisa menyebutnya seperti ini:

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

Pengawetan

Jika kita me-restart instance dan mencoba memanggil data lagi, kita akan melihat bahwa data tersebut tidak ada - semuanya kosong. Hal ini terjadi karena Tarantool membuat pos pemeriksaan dan menyimpan data ke disk, tetapi jika kita berhenti bekerja hingga penyimpanan berikutnya, kita akan kehilangan semua operasi - karena kita akan memulihkan dari pos pemeriksaan terakhir, misalnya dua jam yang lalu.

Menghemat setiap detik juga tidak akan berhasil, karena terus-menerus membuang 20 GB ke disk bukanlah ide yang baik.

Untuk tujuan ini, konsep write-ahead log ditemukan dan diimplementasikan. Dengan bantuannya, untuk setiap perubahan data, sebuah entri dibuat dalam file log kecil yang dapat ditulis ulang.

Setiap entri hingga pos pemeriksaan disimpan di dalamnya. Untuk file-file ini kami menetapkan ukurannya - misalnya, 64 MB. Jika sudah penuh, rekaman mulai masuk ke file kedua. Dan setelah restart, Tarantool dipulihkan dari pos pemeriksaan terakhir dan kemudian meneruskan semua transaksi selanjutnya hingga berhenti.

Di Tarantool, Anda dapat menggabungkan database super cepat dan aplikasi untuk bekerja dengannya. Inilah betapa mudahnya melakukannya

Untuk melakukan perekaman seperti itu, Anda perlu menentukan opsi di pengaturan box.cfg (dalam file example.lua):

wal_mode = “write”;

penggunaan data

Dengan apa yang telah kami tulis sekarang, Anda dapat menggunakan Tarantula untuk menyimpan data dan akan bekerja sangat cepat sebagai database. Dan sekarang hal yang paling menarik adalah apa yang dapat Anda lakukan dengan semuanya.

Menulis aplikasi

Sebagai contoh, mari kita tulis aplikasi Tarantula berikut ini

Lihat aplikasi di bawah 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()

Kami mendeklarasikan beberapa tabel di lua yang mendefinisikan karakter. Pelat ini diperlukan untuk menghasilkan string acak.

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

Setelah itu, kita mendeklarasikan fungsi - randomString dan memberikan nilai panjangnya dalam tanda kurung.

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

Kemudian kita menghubungkan router http dan server http ke server Tarantula kita, JSON, yang akan kita kirimkan ke klien.

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

Setelah ini, kita mulai pada port 8080 di semua antarmuka server http, yang akan mencatat semua permintaan dan kesalahan.

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

Selanjutnya kita deklarasikan rute, sehingga jika request dengan metode GET masuk pada port 8080 /count, maka kita memanggil fungsi tersebut dari satu baris. Ini mengembalikan status - 200, 404, 403 atau lainnya yang kami tentukan.

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

Di badan kita mengembalikan json.encode, di dalamnya kita menunjukkan count dan getcount, yang dipanggil dan menunjukkan jumlah record dalam database kita.

Metode kedua

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)

Di mana dalam antrean router:route({metode = 'GET', jalur = '/token'}, function() kami memanggil fungsi dan menghasilkan token.

Tali token lokal = randomString(32) adalah string acak yang terdiri dari 32 karakter.
Di barisan lokal terakhir = box.space.example:len() kami mengambil elemen terakhir.
Dan di barisan box.space.example:insert{ terakhir + 1, token } kita menulis datanya ke dalam database kita, yaitu kita cukup menambah ID sebanyak 1. Omong-omong, ini bisa dilakukan tidak hanya dengan cara yang kikuk ini. Ada urutan untuk ini di Tarantula.

Kami menulis token di sana.

Jadi, kami menulis aplikasi dalam satu file. Anda dapat langsung memanipulasi data di sana, dan modul kotak akan melakukan semua pekerjaan kotor untuk Anda.

Ia mendengarkan http dan bekerja dengan data, semuanya ada dalam satu contoh - baik aplikasi maupun data. Oleh karena itu, semuanya terjadi cukup cepat.

Untuk memulai kita menginstal modul http:

Bagaimana kami melakukan ini, lihat di bawah 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:/#

Kita juga membutuhkan prometheus untuk menjalankan:

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

Kami meluncurkan dan dapat mengakses modul

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 memberi kita status 200.
/token mengeluarkan token dan menulis token ini ke database.

Kecepatan pengujian

Mari kita jalankan benchmark untuk 50 permintaan. Akan ada 000 permintaan yang bersaing.

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

Token dikeluarkan. Dan kami terus-menerus mencatat data. 99% permintaan diproses dalam 42 milidetik. Oleh karena itu, kami memiliki sekitar 3500 permintaan per detik pada mesin kecil dengan 2 core dan memori 4 gigabyte.

Anda juga dapat memilih sekitar 50000 token dan melihat nilainya.

Anda tidak hanya dapat menggunakan http, tetapi juga menjalankan fungsi latar belakang yang memproses data Anda. Ditambah lagi, pemicunya bermacam-macam. Misalnya, Anda dapat memanggil fungsi pembaruan, memeriksa sesuatu - memperbaiki konflik.

Anda dapat menulis aplikasi skrip langsung di server database itu sendiri, dan tidak dibatasi oleh apa pun, menghubungkan modul apa pun, dan mengimplementasikan logika apa pun.

Server aplikasi dapat mengakses server eksternal, mengambil data dan menambahkannya ke database-nya. Data dari database ini akan digunakan oleh aplikasi lain.

Tarantula akan melakukannya sendiri, dan Anda tidak perlu menulis aplikasi terpisah.

Sebagai kesimpulan

Ini hanyalah bagian pertama dari sebuah pekerjaan besar. Yang kedua akan segera diterbitkan di blog Grup Mail.ru, dan kami pasti akan menambahkan tautan ke materi ini.

Jika Anda tertarik untuk menghadiri acara di mana kami membuat hal-hal ini secara online dan mengajukan pertanyaan secara real time, saksikanlah saluran DevOps oleh REBRAIN.

Jika Anda perlu berpindah ke cloud atau memiliki pertanyaan tentang infrastruktur Anda, jangan ragu untuk meninggalkan permintaan.

PS Kami memiliki 2 audit gratis per bulan, mungkin proyek Anda adalah salah satunya.

Sumber: www.habr.com

Tambah komentar