په ترانتول کې، تاسو کولی شئ یو خورا ګړندی ډیټابیس او د دوی سره کار کولو لپاره غوښتنلیک یوځای کړئ. دلته دا ده چې دا کار کول څومره اسانه دي

پنځه کاله دمخه ما هڅه وکړه چې د ترنټول سره کار وکړي، مګر بیا یې زما لپاره کار ونکړ. مګر پدې وروستیو کې ما یو ویبینار ترسره کړ چیرې چې ما د هډوپ په اړه خبرې وکړې او څنګه د MapReduce کار کوي. هلته دوی له ما څخه پوښتنه وکړه: "ولې د دې کار لپاره ترنټول نه کاروئ؟"

د تجسس له امله، ما پریکړه وکړه چې بیرته راستانه شم، وروستۍ نسخه ازموینه وکړم - او دا ځل ما واقعیا پروژه خوښ کړه. اوس زه به تاسو ته وښیم چې څنګه په ترانټول کې یو ساده غوښتنلیک ولیکئ ، دا پورته کړئ او د هغې فعالیت چیک کړئ ، او تاسو به وګورئ چې هرڅه څومره اسانه او یخ دي.

په ترانتول کې، تاسو کولی شئ یو خورا ګړندی ډیټابیس او د دوی سره کار کولو لپاره غوښتنلیک یوځای کړئ. دلته دا ده چې دا کار کول څومره اسانه دي

ترنتول څه شی دی؟

ټرانټول ځان د خورا ګړندي ډیټابیس په توګه موقعیت لري. تاسو کولی شئ هر هغه معلومات چې تاسو یې غواړئ هلته واچوئ. برسیره پردې، دوی نقل کړئ، شارډ - دا دی، د ډیرو سرورونو په اوږدو کې د ډیټا لوی مقدار ویشئ او له دوی څخه پایلې سره یوځای کړئ - د غلطی زغمونکي ماسټر ماسټر ارتباط جوړ کړئ.

دوهم، دا د غوښتنلیک سرور دی. تاسو کولی شئ خپل غوښتنلیکونه په دې ولیکئ، د معلوماتو سره کار وکړئ، د بیلګې په توګه، د ځینې مقرراتو سره سم په شالید کې زاړه ریکارډونه حذف کړئ. تاسو کولی شئ په مستقیم ډول په ټرانټولا کې د Http سرور ولیکئ چې د ډیټا سره به کار وکړي: د دوی مقدار ورکړئ ، هلته نوي معلومات ولیکئ او دا ټول ماسټر ته کم کړئ.

ما یوه مقاله ولوستله چې څنګه هلکانو د 300 لینونو یو پیغام کتار جوړ کړ، کوم چې په ساده ډول ماتول او چټک دي - دوی په هره ثانیه کې د 20 پیغامونو لږترلږه فعالیت لري. دلته تاسو کولی شئ واقعیا شاوخوا وګرځئ او خورا لوی غوښتنلیک ولیکئ ، او دا به ذخیره نه وي ، لکه څنګه چې په PostgreS کې.

زه به هڅه وکړم چې د دې سرور په څیر یو څه تشریح کړم، یوازې ساده، پدې مقاله کې.

د جوړولو

د ازموینې لپاره، ما درې معیاري مجازی ماشینونه پیل کړل - د 20 GB هارډ ډرایو، اوبنټو 18.04. 2 مجازی CPUs او 4 ګیګ حافظه.

موږ ټرانټول نصب کوو - د بش سکریپټ چل کړئ یا یو ذخیره اضافه کړئ او د ټارنټول انسټالولو لپاره مناسب کار وکړئ. سکریپټ ته لینک - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo-E bash). موږ داسې حکمونه لرو:

tarantoolctl - د ټرانټولا مثالونو اداره کولو لپاره اصلي قومانده.
/etc/tarantool - دلته ټول ترتیب دی.
var/log/tarantool - دلته لاګونه دي.
var/lib/tarantool - ډاټا دلته پروت دي، او بیا دا په مثالونو ویشل شوي.

د مثال په توګه فولډر شتون لري - شتون لري او د مثال وړ وړ - پدې کې هغه څه شامل دي چې به پیل شي - د لوا کوډ سره د مثال ترتیب کولو فایل ، کوم چې دا تشریح کوي چې کوم بندرونه یې اوري ، کوم حافظه ورته شتون لري ، د وینیل انجن ترتیبات ، کوډ چې په پیل کې تیریږي سرورونه، شارډینګ، کتارونه، د پخوانیو معلوماتو حذف کول، او داسې نور.

مثالونه د PostgreS په څیر کار کوي. د مثال په توګه، تاسو غواړئ د ډیټابیس ډیری کاپي چل کړئ چې په مختلفو بندرونو کې ځړول کیږي. دا معلومه شوه چې ډیری ډیټابیس مثالونه په یو سرور کې پیل شوي، کوم چې په مختلفو بندرونو کې ځړول کیږي. دوی ممکن په بشپړ ډول مختلف ترتیبات ولري - یو مثال یو منطق پلي کوي، دوهم - بل.

د مثال مدیریت

موږ د tarantoolctl کمانډ لرو، کوم چې تاسو ته اجازه درکوي د Tarantula مثالونه اداره کړئ. د مثال په توګه، د tarantoolctl چیک مثال به د تشکیلاتو فایل وګوري او ووایی - فایل سم دی که چیرې هلته د ترکیب غلطی شتون ونلري.

تاسو کولی شئ د مثال حالت وګورئ - tarantoolctl status example . په ورته ډول تاسو کولی شئ پیل کړئ، ودروئ، بیا پیل کړئ.

یوځل چې مثال چلیږي ، تاسو کولی شئ له دې سره په دوه لارو وصل شئ.

1. اداري کنسول

د ډیفالټ په واسطه، ټرانټول ساکټ پرانیزي، د ASCII نورمال متن د Tarantool کنټرول لپاره هلته لیږل کیږي. د کنسول سره پیوستون تل د اډمین کارونکي لاندې پیښیږي ، هیڅ تصدیق شتون نلري ، نو د ټرانټولا اداره کولو لپاره د کنسول بندر بهر کولو ته اړتیا نشته.

د دې میتود په کارولو سره د نښلولو لپاره، تاسو اړتیا لرئ د Tarantoolctl د مثال نوم داخل کړئ. کمانډ به کنسول پیل کړي او د مدیر کارونکي په توګه وصل شي. هیڅکله د کنسول بندر بهر ته مه ښکاره کوئ - دا غوره ده چې دا د واحد ساکټ په توګه پریږدئ. بیا یوازې هغه څوک چې ساکټ ته لیکلو ته لاسرسی لري د دې وړتیا ولري چې له ترانټولا سره وصل شي.

دا طریقه د اداري کارونو لپاره اړینه ده. د ډیټا سره کار کولو لپاره ، دوهم میتود وکاروئ - بائنری پروتوکول.

2. د یو ځانګړي بندر سره د نښلولو لپاره د بائنری پروتوکول کارول

ترتیب د اوریدلو لارښود لري، کوم چې د بهرنیو اړیکو لپاره بندر خلاصوي. دا بندر د بائنری پروتوکول سره کارول کیږي او تصدیق هلته فعال شوی.

د دې پیوستون لپاره، د پورټ نمبر سره د tarantoolctl نښلول کارول کیږي. د دې په کارولو سره ، تاسو کولی شئ د ریموټ سرورونو سره وصل شئ ، تصدیق وکاروئ او د لاسرسي مختلف حقونه ورکړئ.

د معلوماتو ثبت کول او د بکس ماډل

څرنګه چې ټرانټول دواړه ډیټابیس او د غوښتنلیک سرور دی، دا مختلف ماډلونه لري. موږ د بکس ماډل سره علاقه لرو - دا د ډیټا سره کار کول پلي کوي. کله چې تاسو بکس ته یو څه ولیکئ، ټرانټول ډیسک ته ډاټا لیکي، په حافظه کې یې ذخیره کوي، یا د دې سره بل څه کوي.

ریکارډ

د مثال په توګه، موږ د بکس ماډل ته ځو او د 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 بایټ.

په ترانتول کې، تاسو کولی شئ یو خورا ګړندی ډیټابیس او د دوی سره کار کولو لپاره غوښتنلیک یوځای کړئ. دلته دا ده چې دا کار کول څومره اسانه دي

د هغه سره کار کول خورا اسانه دي. نږدې هره کرښه، د هر ډیټا ریکارډ کولی شي په بشپړه توګه مختلف کالمونه ولري.

موږ کولی شو ټول ځایونه د Box.space کمانډ په کارولو سره وګورو. د یو ځانګړي مثال غوره کولو لپاره، د box.space مثال ولیکئ او د هغې په اړه بشپړ معلومات ترلاسه کړئ.

ټرانټول دوه جوړ شوي انجنونه لري: حافظه او وینیل. حافظه ټول معلومات په حافظه کې ساتي. له همدې امله، هر څه په ساده او چټکۍ سره کار کوي. ډیټا ډیسک ته ډمپ شوی ، او د لیکلو دمخه لاګ میکانیزم هم شتون لري ، نو موږ به هیڅ له لاسه ورنکړو که چیرې سرور خراب شي.

وینیل په ډیسک کې ډیټا په داسې شکل کې ذخیره کوي چې موږ ته ډیر پیژندل شوي - دا دا دی چې تاسو کولی شئ زموږ د حافظې څخه ډیر ډیټا ذخیره کړئ ، او ټرانټولا به دا له ډیسک څخه ولولي.

د اوس لپاره موږ به حافظه وکاروو.

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>

Index:

یو لومړنی شاخص باید د هر ځای لپاره رامینځته شي، ځکه چې پرته له دې هیڅ شی کار نه کوي. لکه څنګه چې په هر ډیټابیس کې، موږ لومړی ساحه جوړوو - د ثبت ID.

برخې:

دلته موږ په ګوته کوو چې زموږ شاخص څه شی دی. دا د یوې برخې څخه جوړه ده - لومړی ساحه چې موږ به یې کاروو د غیر لاسلیک شوي ډول څخه دی - یو مثبت عدد. تر هغه ځایه چې زه د اسنادو څخه یادونه کوم ، اعظمي شمیر چې کیدی شي 18 کوینټیلین وي. دا ډیر څه دي.

بیا موږ کولی شو د 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>

لومړی ساحه د لومړني کیلي په توګه کارول کیږي، نو دا باید ځانګړی وي. موږ د کالمونو په شمیر پورې محدود نه یو، نو موږ کولی شو هرڅومره ډیټا دننه کړو څومره چې موږ غواړو. دوی د میسج پیک ب formatه کې مشخص شوي ، کوم چې ما پورته تشریح کړی.

د معلوماتو تولید

بیا موږ کولی شو د انتخاب کمانډ په کارولو سره ډاټا ښکاره کړو.

د {1} کیلي سره Box.example.select به مطلوب ننوت ښکاره کړي. که موږ کیلي ټیټ کړو، موږ به ټول هغه ریکارډونه وګورو چې موږ یې لرو. دا ټول د کالمونو په شمیر کې توپیر لري، مګر دلته، په اصولو کې، د کالمونو مفهوم شتون نلري - د ساحې شمیرې شتون لري.

کیدای شي په بشپړه توګه هر ډول ډاټا وي. او د مثال په توګه، موږ اړتیا لرو چې دوی د دویمې ساحې لخوا وپلټئ. د دې کولو لپاره، موږ یو نوی ثانوي شاخص جوړوو.


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

موږ د Create_index کمانډ کاروو.
راځئ چې ثانوي ورته ووایو.

له دې وروسته تاسو اړتیا لرئ چې پیرامیټونه مشخص کړئ. د شاخص ډول TREE دی. دا ممکن ځانګړی نه وي، نو یونیک = غلط داخل کړئ.

بیا موږ په ګوته کوو چې زموږ شاخص کومې برخې لري. ساحه د ساحې شمیره ده چې موږ یې شاخص وتړو، او د تار ډول یې مشخص کړو. او په دې توګه دا جوړ شو.

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']
...

خوندي کول

که موږ بیلګه بیا پیل کړو او د ډیټا بیا زنګ وهلو هڅه وکړو ، موږ به وګورو چې دا شتون نلري - هرڅه خالي دي. دا پیښیږي ځکه چې ټرانټول پوستې رامینځته کوي او ډیټا ډیسک ته خوندي کوي ، مګر که موږ تر راتلونکي خوندي کولو پورې کار بند کړو ، نو موږ به ټول عملیات له لاسه ورکړو - ځکه چې موږ به د وروستي پوستې څخه بیرته راستون شو ، کوم چې د مثال په توګه دوه ساعته دمخه و.

دا به د هرې ثانیې خوندي کولو لپاره کار ونکړي ، ځکه چې په دوامداره توګه 20 GB ډیسک ته ډمپ کول ښه نظر ندی.

د دې هدف لپاره، د لیکلو مخکې لاګ مفهوم ایجاد او پلي شو. د دې په مرسته، په ډیټا کې د هر بدلون لپاره، د ننوتلو په یوه کوچنۍ لیکل شوي لاګ فایل کې رامینځته کیږي.

هرې پوستې ته ننوتل په دوی کې زیرمه شوي. د دې فایلونو لپاره موږ اندازه ټاکو - د بیلګې په توګه، 64 MB. کله چې دا ډک وي، ثبت کول دویم فایل ته ځي. او د بیا پیل کولو وروسته، ټرانټول د وروستي پوستې څخه بیرته راګرځول کیږي او بیا وروسته ټولې لیږدونه تر هغه وخته پورې ودریږي چې ودریږي.

په ترانتول کې، تاسو کولی شئ یو خورا ګړندی ډیټابیس او د دوی سره کار کولو لپاره غوښتنلیک یوځای کړئ. دلته دا ده چې دا کار کول څومره اسانه دي

د دې ډول ثبت کولو لپاره، تاسو اړتیا لرئ د box.cfg ترتیباتو کې اختیار مشخص کړئ (په مثال کې.lua فایل کې):

wal_mode = “write”;

د معلوماتو کارول

د هغه څه سره چې موږ اوس لیکلي دي ، تاسو کولی شئ د ډیټا ذخیره کولو لپاره ټرانټولا وکاروئ او دا به د ډیټابیس په توګه خورا ګړندي کار وکړي. او اوس په کیک کې یخ کول هغه څه دي چې تاسو یې د دې ټولو سره کولی شئ.

د غوښتنلیک لیکل

د مثال په توګه، راځئ چې د Tarantula لپاره لاندې غوښتنلیک ولیکئ

د سپیلر لاندې غوښتنلیک وګورئ

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

موږ په لوا کې ځینې جدول اعلانوو چې حروف تعریفوي. دا پلیټ د تصادفي تار جوړولو لپاره اړین دی.

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 سرور زموږ د ټرانټولا سرور ، 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 بیرته راګرځوو، پدې کې موږ شمیره او ګیټ شمیره په ګوته کوو، کوم چې ویل کیږي او زموږ په ډیټابیس کې د ریکارډونو شمیره ښیي.

دوهم طریقه

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)

چیرته په لیکه کې روټر: لاره موږ فنکشن ته زنګ وهو او یوه نښه تولیدوو.

کرښه محلي نښه = تصادفي سټرینګ (32) د 32 حروفونو یو تصادفي تار دی.
په لیکه کې ځایی وروستی = box.space.example:len() موږ وروستی عنصر لرې کوو.
او په کرښه کې box.space.example:insert{ last + 1, token } موږ ډاټا په خپل ډیټابیس کې لیکو، دا دا دی چې موږ په ساده ډول ID 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:/#

/ شمیره موږ ته د 200 حیثیت راکوي.
/token یوه نښه مسله کوي او دا نښه ډیټابیس ته لیکي.

د سرعت ازموینه

راځئ چې د 50 غوښتنو لپاره بنچمارک چلوو. دلته به 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:/#

ټکنونه صادریږي. او موږ په دوامداره توګه ډاټا ثبت کوو. 99٪ غوښتنې په 42 ملی ثانیو کې پروسس شوي. په دې اساس، موږ په یوه کوچني ماشین کې په هره ثانیه کې شاوخوا 3500 غوښتنې لرو چې 2 کورونه او 4 ګیګابایټ حافظه لري.

تاسو کولی شئ ځینې 50000 نښه هم وټاکئ او ارزښت یې وګورئ.

تاسو کولی شئ نه یوازې http وکاروئ ، بلکه د شالید افعال هم پرمخ وړئ چې ستاسو ډاټا پروسس کوي. برسېره پردې، مختلف محرکونه شتون لري. د مثال په توګه، تاسو کولی شئ په تازه معلوماتو کې فنکشنونه ولیکئ، یو څه وګورئ - سمې شخړې.

تاسو کولی شئ د سکریپټ غوښتنلیکونه مستقیم په ډیټابیس سرور کې ولیکئ، او د هیڅ شی لخوا محدود نه وي، کوم ماډلونه وصل کړئ او کوم منطق پلي کړئ.

د اپلیکیشن سرور کولی شي بهرني سرورونو ته لاسرسی ومومي ، ډیټا بیرته ترلاسه کړي او په ډیټابیس کې یې اضافه کړي. د دې ډیټابیس ډیټا به د نورو غوښتنلیکونو لخوا کارول کیږي.

ټرانټولا به دا پخپله وکړي، او تاسو اړتیا نلرئ یو جلا غوښتنلیک ولیکئ.

په پای کې

دا د لوی کار یوازې لومړۍ برخه ده. دوهم به ډیر ژر د Mail.ru ګروپ بلاګ کې خپور شي، او موږ به خامخا پدې موادو کې یو لینک اضافه کړو.

که تاسو په پیښو کې د ګډون کولو لیوالتیا لرئ چیرې چې موږ دا شیان آنلاین رامینځته کوو او په ریښتیني وخت کې پوښتنې کوئ ، نو انډ کړئ د REBRAIN لخوا د DevOps چینل.

که تاسو بادل ته تللو ته اړتیا لرئ یا ستاسو د زیربنا په اړه پوښتنې لرئ، د غوښتنې پریښودلو لپاره وړیا احساس وکړئ.

PS موږ په میاشت کې 2 وړیا پلټنې لرو، شاید ستاسو پروژه به یو له دوی څخه وي.

سرچینه: www.habr.com

Add a comment