Taas nga lebel nga replikasyon sa Tarantool DBMS

Kumusta, naghimo ako mga aplikasyon alang sa DBMS Tarantool usa ka plataporma nga gihimo sa Mail.ru Group nga naghiusa sa usa ka high-performance nga DBMS ug usa ka server sa aplikasyon sa pinulongang Lua. Ang taas nga tulin sa mga solusyon nga gibase sa Tarantool nakab-ot, ilabi na, tungod sa suporta alang sa in-memory mode sa DBMS ug ang abilidad sa pagpatuman sa logic sa negosyo sa aplikasyon sa usa ka address space nga adunay data. Sa parehas nga oras, ang pagpadayon sa datos gisiguro gamit ang mga transaksyon sa ACID (usa ka log sa WAL ang gipadayon sa disk). Ang Tarantool adunay built-in nga suporta alang sa pagkopya ug sharding. Sugod sa bersyon 2.1, ang mga pangutana sa SQL nga pinulongan gisuportahan. Ang Tarantool bukas nga gigikanan ug lisensyado sa ilawom sa lisensya sa Pinasimple nga BSD. Adunay usab usa ka komersyal nga bersyon sa Enterprise.

Taas nga lebel nga replikasyon sa Tarantool DBMS
Bati ang gahum! (...aka nalingaw sa pasundayag)

Ang tanan sa ibabaw naghimo sa Tarantool nga usa ka madanihon nga plataporma alang sa paghimo og mga aplikasyon nga adunay taas nga karga nga nagtrabaho sa mga database. Sa ingon nga mga aplikasyon, kanunay adunay panginahanglan alang sa pagkopya sa datos.

Sama sa gihisgutan sa ibabaw, ang Tarantool adunay built-in nga data replication. Ang prinsipyo sa operasyon niini mao ang sunodsunod nga pagpatuman sa mga replika sa tanang transaksyon nga anaa sa master log (WAL). Kasagaran ang ingon nga pagkopya (atong dugang nga tawgon kini ubos nga lebel) gigamit aron masiguro ang pagtugot sa sayup sa aplikasyon ug / o pag-apod-apod sa load sa pagbasa taliwala sa mga cluster node.

Taas nga lebel nga replikasyon sa Tarantool DBMS
bugas. 1. Replikasyon sulod sa cluster

Usa ka pananglitan sa alternatibong senaryo mao ang pagbalhin sa datos nga gihimo sa usa ka database ngadto sa lain nga database para sa pagproseso/pagmonitor. Sa ulahing kaso, ang usa ka mas sayon ​​​​nga solusyon mahimong gamiton taas nga lebel replikasyon - replikasyon sa datos sa lebel sa lohika sa negosyo sa aplikasyon. Mga. Wala kami mogamit usa ka andam nga solusyon nga gitukod sa DBMS, apan gipatuman ang pagkopya sa among kaugalingon sulod sa aplikasyon nga among gipalambo. Kini nga pamaagi adunay duha ka bentaha ug disbentaha. Atong ilista ang mga bentaha.

1. Pagdaginot sa trapiko:

  • Dili nimo mabalhin ang tanan nga datos, apan bahin ra niini (pananglitan, mahimo nimong ibalhin ang pipila ra nga mga lamesa, pipila sa ilang mga kolum o mga rekord nga nagtagbo sa usa ka piho nga sukaranan);
  • Dili sama sa ubos nga lebel nga replikasyon, nga padayon nga gihimo sa asynchronous (gipatuman sa kasamtangan nga bersyon sa Tarantool - 1.10) o synchronous (nga ipatuman sa sunod nga mga bersyon sa Tarantool) nga mode, ang taas nga lebel nga replikasyon mahimong ipahigayon sa mga sesyon (ie, ang Ang aplikasyon una nga nag-synchronize sa datos - usa ka data sa sesyon sa pagbinayloay, unya adunay paghunong sa pagkopya, pagkahuman mahitabo ang sunod nga sesyon sa pagbinayloay, ug uban pa);
  • kung ang usa ka rekord nausab sa daghang mga higayon, mahimo nimong ibalhin ang pinakabag-o nga bersyon niini (dili sama sa ubos nga lebel nga replikasyon, diin ang tanan nga mga pagbag-o nga gihimo sa master ipatugtog balik nga sunud-sunod sa mga replika).

2. Walay mga kalisud sa pagpatuman sa HTTP exchange, nga nagtugot kanimo sa pag-synchronize sa hilit nga mga database.

Taas nga lebel nga replikasyon sa Tarantool DBMS
bugas. 2. Replikasyon sa HTTP

3. Ang mga istruktura sa database sa taliwala diin ang data gibalhin dili kinahanglan nga managsama (dugang pa, sa kinatibuk-ang kaso, posible pa gani nga mogamit sa lain-laing mga DBMS, programming language, plataporma, ug uban pa).

Taas nga lebel nga replikasyon sa Tarantool DBMS
bugas. 3. Replikasyon sa heterogeneous nga mga sistema

Ang downside mao nga, sa kasagaran, ang programming mas lisud / mahal kaysa sa pag-configure, ug imbis nga ipasibo ang built-in nga gamit, kinahanglan nimo nga ipatuman ang imong kaugalingon.

Kung sa imong sitwasyon ang mga bentaha sa ibabaw hinungdanon (o usa ka kinahanglanon nga kondisyon), nan makatarunganon nga gamiton ang taas nga lebel nga pagkopya. Atong tan-awon ang daghang mga paagi aron mapatuman ang taas nga lebel nga pagkopya sa datos sa Tarantool DBMS.

Pagminus sa trapiko

Mao nga, usa sa mga bentaha sa taas nga lebel nga pagkopya mao ang pagtipig sa trapiko. Aron kini nga bentaha hingpit nga matuman, gikinahanglan nga mamenosan ang gidaghanon sa datos nga gibalhin sa matag exchange session. Siyempre, dili nato kalimtan nga sa katapusan sa sesyon, ang tigdawat sa datos kinahanglan nga i-synchronize sa tinubdan (labing menos alang sa bahin sa datos nga nalangkit sa pagkopya).

Giunsa pagminus ang gidaghanon sa datos nga gibalhin sa panahon sa taas nga lebel nga pagkopya? Ang usa ka prangka nga solusyon mao ang pagpili sa datos sa petsa ug oras. Aron mahimo kini, mahimo nimong gamiton ang field sa petsa-oras nga anaa na sa lamesa (kon anaa na). Pananglitan, ang usa ka "order" nga dokumento mahimong adunay usa ka field nga "gikinahanglan nga oras sa pagpatuman sa order" - delivery_time. Ang problema sa kini nga solusyon mao nga ang mga kantidad sa kini nga natad dili kinahanglan nga naa sa pagkasunud nga gihimo ang mga order. Busa dili nato mahinumduman ang pinakataas nga kantidad sa field delivery_time, nga gipasa sa miaging sesyon sa pagbinayloay, ug sa sunod nga sesyon sa pagbinayloay pilia ang tanan nga mga rekord nga adunay mas taas nga kantidad sa uma delivery_time. Ang mga rekord nga adunay mas ubos nga kantidad sa field mahimong gidugang tali sa mga sesyon sa pagbayloay delivery_time. Usab, ang order mahimo nga nakaagi sa mga pagbag-o, nga bisan pa wala makaapekto sa uma delivery_time. Sa duha ka mga kaso, ang mga pagbag-o dili ibalhin gikan sa gigikanan ngadto sa destinasyon. Aron masulbad kini nga mga problema, kinahanglan namon nga ibalhin ang data nga "nagsapaw-sapaw". Mga. sa matag exchange session among ibalhin ang tanang datos nga adunay field value delivery_time, milapas sa pipila ka punto sa miagi (pananglitan, N ka oras gikan sa kasamtangan nga gutlo). Bisan pa, klaro nga alang sa dagkong mga sistema kini nga pamaagi labi ka daghan ug makapakunhod sa pagtipig sa trapiko nga among gipaningkamutan nga wala’y kapuslanan. Dugang pa, ang lamesa nga gibalhin mahimong walay field nga may kalabotan sa petsa-oras.

Ang laing solusyon, mas komplikado sa mga termino sa pagpatuman, mao ang pag-ila sa resibo sa datos. Sa kini nga kaso, sa matag sesyon sa pagbinayloay, ang tanan nga datos gipasa, ang resibo nga wala gikumpirma sa nakadawat. Aron mapatuman kini, kinahanglan nimong idugang ang Boolean column sa source table (pananglitan, is_transferred). Kon ang tigdawat moila sa resibo sa rekord, ang katugbang nga field mokuha sa bili true, human niini ang entry wala nay labot sa mga pagbayloay. Kini nga opsyon sa pagpatuman adunay mosunod nga mga disbentaha. Una, alang sa matag rekord nga gibalhin, usa ka pag-ila kinahanglan nga mamugna ug ipadala. Sa kinatibuk-an, kini mahimong ikatandi sa pagdoble sa gidaghanon sa datos nga gibalhin ug sa pagdoble sa gidaghanon sa mga roundtrip. Ikaduha, wala’y posibilidad nga ipadala ang parehas nga rekord sa daghang mga tigdawat (ang una nga nakadawat nga makadawat magkumpirma sa resibo alang sa iyang kaugalingon ug alang sa tanan nga uban pa).

Ang usa ka pamaagi nga walay mga disbentaha nga gihulagway sa ibabaw mao ang pagdugang og kolum sa gibalhin nga lamesa aron masubay ang mga kausaban sa mga laray niini. Ang ingon nga kolum mahimo nga tipo sa petsa-oras ug kinahanglan nga itakda / i-update sa aplikasyon sa karon nga oras sa matag higayon nga ang mga rekord idugang / usbon (atom nga adunay pagdugang / pagbag-o). Isip pananglitan, tawgon nato ang kolum update_time. Pinaagi sa pagtipig sa labing taas nga kantidad sa uma niini nga kolum alang sa gibalhin nga mga rekord, mahimo naton sugdan ang sunod nga sesyon sa pagbinayloay nga adunay kini nga kantidad (pilia ang mga rekord nga adunay kantidad sa uma. update_time, labaw sa gitipigan kaniadto nga kantidad). Ang problema sa ulahi nga pamaagi mao nga ang mga pagbag-o sa datos mahimong mahitabo sa mga batch. Ingon usa ka sangputanan sa mga kantidad sa uma sa kolum update_time mahimong dili talagsaon. Busa, kini nga kolum dili magamit alang sa gibahin (panid-sa-panid) nga output sa datos. Aron mapakita ang panid sa datos sa panid, kinahanglan kang mag-imbento ug dugang nga mga mekanismo nga lagmit adunay ubos kaayo nga kahusayan (pananglitan, pagkuha gikan sa database sa tanang mga rekord nga adunay bili update_time mas taas kay sa gihatag nga usa ug naghimo og usa ka piho nga gidaghanon sa mga rekord, sugod sa usa ka piho nga offset gikan sa sinugdanan sa sample).

Mahimo nimong pauswagon ang kahusayan sa pagbalhin sa datos pinaagi sa gamay nga pagpaayo sa miaging pamaagi. Aron mahimo kini, gamiton namon ang tipo nga integer (taas nga integer) ingon mga kantidad sa field sa kolum alang sa pagsubay sa mga pagbag-o. Atong nganlan ang column row_ver. Ang field value niini nga column kinahanglan gihapon nga itakda/update sa matag higayon nga ang usa ka rekord gihimo/giusab. Apan sa kini nga kaso, ang uma dili ma-assign sa karon nga petsa-oras, apan ang kantidad sa pipila nga counter, nadugangan sa usa. Ingon usa ka sangputanan, ang kolum row_ver maglangkob sa talagsaon nga mga kantidad ug mahimong magamit dili lamang sa pagpakita sa "delta" nga datos (data nga gidugang / gibag-o sukad sa katapusan sa miaging sesyon sa pagbinayloay), apan usab sa yano ug epektibo nga pagbungkag niini sa mga panid.

Ang katapusan nga gisugyot nga pamaagi sa pagminus sa gidaghanon sa mga datos nga gibalhin sa sulod sa gambalay sa taas nga lebel nga pagkopya ingon kanako ang labing kamalaumon ug unibersal. Atong tan-awon kini sa mas detalyado.

Pagpasa sa Data Gamit ang usa ka Row Version Counter

Pagpatuman sa server/master nga bahin

Sa MS SQL Server, adunay usa ka espesyal nga tipo sa kolum aron ipatuman kini nga pamaagi - rowversion. Ang matag database adunay usa ka counter nga nagdugang sa usa sa matag higayon nga ang usa ka rekord gidugang / giusab sa usa ka lamesa nga adunay usa ka kolum nga sama rowversion. Ang bili niini nga counter awtomatik nga gi-assign sa field niini nga column sa gidugang/giusab nga rekord. Ang Tarantool DBMS walay susama nga built-in nga mekanismo. Bisan pa, sa Tarantool dili lisud ang pagpatuman niini nga mano-mano. Atong tan-awon kung giunsa kini nahimo.

Una, usa ka gamay nga terminolohiya: ang mga lamesa sa Tarantool gitawag nga mga luna, ug ang mga rekord gitawag nga tuples. Sa Tarantool makahimo ka og mga han-ay. Ang mga pagkasunod-sunod wala'y labaw pa sa ginganlan nga mga generator sa gimando nga mga kantidad sa integer. Mga. mao gayud kini ang atong gikinahanglan alang sa atong mga katuyoan. Sa ubos maghimo kami sa ingon nga pagkasunod-sunod.

Sa wala pa ipahigayon ang bisan unsang operasyon sa database sa Tarantool, kinahanglan nimo nga ipadagan ang mosunud nga mando:

box.cfg{}

Ingon usa ka sangputanan, ang Tarantool magsugod sa pagsulat sa mga snapshot sa database ug mga log sa transaksyon sa karon nga direktoryo.

Magbuhat ta ug sequence row_version:

box.schema.sequence.create('row_version',
    { if_not_exists = true })

Kapilian if_not_exists nagtugot sa script sa paghimo nga ipatuman sa daghang mga higayon: kung ang butang anaa, ang Tarantool dili mosulay sa paghimo niini pag-usab. Kini nga opsyon gamiton sa tanang mosunod nga DDL commands.

Maghimo kita og usa ka luna isip pananglitan.

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        },
        {
            name = 'row_ver',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

Dinhi atong gibutang ang ngalan sa luna (goods), mga ngalan sa uma ug ang ilang mga tipo.

Ang auto-incrementing nga mga natad sa Tarantool gihimo usab gamit ang mga han-ay. Magbuhat ta ug auto-incrementing primary key sa field id:

box.schema.sequence.create('goods_id',
    { if_not_exists = true })
box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Gisuportahan sa Tarantool ang daghang mga lahi sa mga indeks. Ang labing sagad nga gigamit nga mga indeks mao ang TREE ug HASH nga mga tipo, nga gibase sa mga istruktura nga katumbas sa ngalan. Ang TREE mao ang labing daghang gamit nga tipo sa indeks. Gitugotan ka niini nga makuha ang datos sa usa ka organisado nga paagi. Apan alang sa pagkaparehas nga pagpili, ang HASH mas angay. Tungod niini, gisugyot nga gamiton ang HASH alang sa panguna nga yawe (nga mao ang among gibuhat).

Sa paggamit sa kolum row_ver aron mabalhin ang nabag-o nga datos, kinahanglan nimo nga ibugkos ang mga kantidad sa pagkasunod-sunod sa mga natad sa kini nga kolum row_ver. Apan dili sama sa nag-unang yawe, ang kolum nga kantidad sa uma row_ver kinahanglan nga madugangan ug usa dili lamang kung magdugang ug bag-ong mga rekord, apan usab kung magbag-o sa mga naa na. Mahimo nimong gamiton ang mga trigger alang niini. Ang Tarantool adunay duha ka matang sa space triggers: before_replace ΠΈ on_replace. Ang mga trigger gipabuthan sa matag higayon nga ang data sa luna mausab (alang sa matag tuple nga apektado sa mga kausaban, usa ka trigger function ang gilusad). Dili sama on_replace, before_replaceGitugotan ka sa mga trigger nga usbon ang datos sa tuple diin gipatuman ang gatilyo. Sumala niana, ang kataposang matang sa mga trigger mohaom kanato.

box.space.goods:before_replace(function(old, new)
    return box.tuple.new({new[1], new[2], new[3],
        box.sequence.row_version:next()})
end)

Ang mosunod nga gatilyo mopuli sa field value row_ver gitipigan tuple sa sunod nga bili sa han-ay row_version.

Aron makahimo sa pagkuha sa datos gikan sa kawanangan goods pinaagi sa kolum row_ver, maghimo ta ug index:

box.space.goods:create_index('row_ver', {
    parts = { 'row_ver' },
    unique = true,
    type = 'TREE',
    if_not_exists = true
})

Uri sa indeks - kahoy (TREE), tungod kay kinahanglan namon nga makuha ang datos sa pagsaka sa han-ay sa mga kantidad sa kolum row_ver.

Atong idugang ang pipila ka datos sa wanang:

box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}

Kay Ang una nga field kay usa ka auto-incrementing counter; wala na hinuon mi ipasa. Ang Tarantool awtomatikong mopuli sa sunod nga kantidad. Sa susama, ingon nga ang bili sa mga kolum natad row_ver mahimo nimong ipasa ang nil - o dili ipiho ang kantidad, tungod kay kini nga kolum nag-okupar sa katapusang posisyon sa wanang.

Atong susihon ang resulta sa pagsal-ot:

tarantool> box.space.goods:select()
---
- - [1, 'pen', 123, 1]
  - [2, 'pencil', 321, 2]
  - [3, 'brush', 100, 3]
  - [4, 'watercolour', 456, 4]
  - [5, 'album', 101, 5]
  - [6, 'notebook', 800, 6]
  - [7, 'rubber', 531, 7]
  - [8, 'ruler', 135, 8]
...

Sama sa imong nakita, ang una ug katapusan nga mga natad awtomatiko nga napuno. Karon sayon ​​na ang pagsulat sa usa ka function alang sa panid-sa-panid nga pag-upload sa mga kausaban sa luna goods:

local page_size = 5
local function get_goods(row_ver)
    local index = box.space.goods.index.row_ver
    local goods = {}
    local counter = 0
    for _, tuple in index:pairs(row_ver, {
        iterator = 'GT' }) do
        local obj = tuple:tomap({ names_only = true })
        table.insert(goods, obj)
        counter = counter + 1
        if counter >= page_size then
            break
        end
    end
    return goods
end

Gikuha sa function ingon usa ka parameter ang kantidad row_ver, sugod diin kinahanglan nga idiskarga ang mga pagbag-o, ug ibalik ang usa ka bahin sa nabag-o nga datos.

Ang sampling sa datos sa Tarantool gihimo pinaagi sa mga indeks. Kalihokan get_goods naggamit sa usa ka iterator pinaagi sa index row_ver aron makadawat sa nabag-o nga datos. Ang matang sa iterator mao ang GT (Labaw pa kay sa, labaw pa sa). Kini nagpasabot nga ang iterator sunodsunod nga moagi sa mga bili sa indeks sugod sa gipasa nga yawe (field value row_ver).

Gibalik sa iterator ang mga tuple. Aron sa sunod makahimo sa pagbalhin sa data pinaagi sa HTTP, gikinahanglan ang pag-convert sa mga tuple ngadto sa usa ka istruktura nga sayon ​​alang sa sunod nga serialization. Ang pananglitan naggamit sa standard function alang niini tomap. Imbes gamiton tomap mahimo nimong isulat ang imong kaugalingon nga function. Pananglitan, mahimo natong usbon ang ngalan sa usa ka field name, ayaw pag-agi sa uma code ug pagdugang usa ka uma comment:

local function unflatten_goods(tuple)
    local obj = {}
    obj.id = tuple.id
    obj.goods_name = tuple.name
    obj.comment = 'some comment'
    obj.row_ver = tuple.row_ver
    return obj
end

Ang gidak-on sa panid sa datos sa output (ang gidaghanon sa mga rekord sa usa ka bahin) gitino sa variable page_size. Sa pananglitan ang bili page_size mao ang 5. Sa usa ka tinuod nga programa, ang gidak-on sa panid kasagaran mas importante. Nagdepende kini sa kasagaran nga gidak-on sa tuple sa kawanangan. Ang kamalaumon nga gidak-on sa panid mahimong matino pinaagi sa pagsukod sa oras sa pagbalhin sa datos. Kon mas dako ang gidak-on sa panid, mas gamay ang gidaghanon sa mga roundtrip tali sa nagpadala ug nagdawat nga mga kilid. Niining paagiha mahimo nimong makunhuran ang kinatibuk-ang oras sa pag-download sa mga pagbag-o. Bisan pa, kung ang gidak-on sa panid dako kaayo, magdugay kami sa server sa pag-serialize sa sample. Ingon usa ka sangputanan, mahimong adunay mga paglangan sa pagproseso sa ubang mga hangyo nga moabut sa server. Parameter page_size mahimong i-load gikan sa configuration file. Alang sa matag gipasa nga luna, mahimo nimong itakda ang kaugalingon nga kantidad. Bisan pa, alang sa kadaghanan nga mga luna ang default nga kantidad (pananglitan, 100) mahimong angay.

Atong i-execute ang function get_goods:

tarantool> get_goods(0)

---
- - row_ver: 1
    code: 123
    name: pen
    id: 1
  - row_ver: 2
    code: 321
    name: pencil
    id: 2
  - row_ver: 3
    code: 100
    name: brush
    id: 3
  - row_ver: 4
    code: 456
    name: watercolour
    id: 4
  - row_ver: 5
    code: 101
    name: album
    id: 5
...

Atong kuhaon ang field value row_ver gikan sa katapusang linya ug tawga ang function pag-usab:

tarantool> get_goods(5)

---
- - row_ver: 6
    code: 800
    name: notebook
    id: 6
  - row_ver: 7
    code: 531
    name: rubber
    id: 7
  - row_ver: 8
    code: 135
    name: ruler
    id: 8
...

Sa makausa pa:

tarantool> get_goods(8)
---
- []
...

Sama sa imong makita, kung gigamit kini nga paagi, ang function ibalik ang tanan nga mga rekord sa wanang panid sa panid goods. Ang katapusang panid gisundan sa usa ka walay sulod nga pagpili.

Himoon nato ang mga kausaban sa luna:

box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}

Gibag-o namon ang kantidad sa uma name para sa usa ka entry ug midugang og duha ka bag-ong entry.

Atong sublion ang katapusang tawag sa function:

tarantool> get_goods(8)
---



- - row_ver: 9
    code: 800
    name: copybook
    id: 6
  - row_ver: 10
    code: 234
    name: clip
    id: 9
  - row_ver: 11
    code: 432
    name: folder
    id: 10
...

Gibalik sa function ang giusab ug gidugang nga mga rekord. Busa ang function get_goods nagtugot kanimo sa pagdawat sa datos nga nausab sukad sa kataposang tawag niini, nga mao ang basehan sa pamaagi sa pagkopya nga gikonsiderar.

Ibilin namon ang pag-isyu sa mga resulta pinaagi sa HTTP sa porma sa JSON gawas sa sakup niini nga artikulo. Mahimo nimong basahon ang bahin niini dinhi: https://habr.com/ru/company/mailru/blog/272141/

Pagpatuman sa bahin sa kliyente/ulipon

Atong tan-awon kung unsa ang hitsura sa pagpatuman sa nakadawat nga bahin. Maghimo kita og usa ka luna sa nakadawat nga bahin aron tipigan ang na-download nga datos:

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Ang istruktura sa luna susama sa istruktura sa luna sa tinubdan. Apan tungod kay dili namo ipasa ang nadawat nga datos bisan asa pa, ang kolum row_ver wala sa luna sa nakadawat. Sa kapatagan id ang tinubdan identifiers irekord. Busa, sa bahin sa tigdawat dili kinahanglan nga himoon kini nga auto-incrementing.

Dugang pa, nagkinahanglan kita og usa ka luna aron sa pagluwas sa mga mithi row_ver:

box.schema.space.create('row_ver', {
    format = {
        {
            name = 'space_name',
            type = 'string'

        },
        {
            name = 'value',
            type = 'string'

        }
    },
    if_not_exists = true
})

box.space.row_ver:create_index('primary', {
    parts = { 'space_name' },
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Alang sa matag loaded space (field space_name) atong tipigan ang kataposang loaded value dinhi row_ver (field value). Ang kolum naglihok isip panguna nga yawe space_name.

Magbuhat ta ug function para makarga ang data sa kawanangan goods pinaagi sa HTTP. Aron mahimo kini, kinahanglan namon ang usa ka librarya nga nagpatuman sa usa ka kliyente sa HTTP. Ang mosunod nga linya nagkarga sa librarya ug nag-instantiate sa HTTP nga kliyente:

local http_client = require('http.client').new()

Nagkinahanglan usab kami usa ka librarya alang sa deserialization sa json:

local json = require('json')

Igo na kini aron makahimo usa ka function sa pagkarga sa datos:

local function load_data(url, row_ver)
    local url = ('%s?rowVer=%s'):format(url,
        tostring(row_ver))
    local body = nil
    local data = http_client:request('GET', url, body, {
        keepalive_idle =  1,
        keepalive_interval = 1
    })
    return json.decode(data.body)
end

Ang function nagpatuman sa usa ka HTTP nga hangyo sa url address ug ipadala kini row_ver isip parameter ug ibalik ang deserialized nga resulta sa hangyo.

Ang function alang sa pagtipig sa nadawat nga datos ingon niini:

local function save_goods(goods)
    local n = #goods
    box.atomic(function()
        for i = 1, n do
            local obj = goods[i]
            box.space.goods:put(
                obj.id, obj.name, obj.code)
        end
    end)
end

Siklo sa pagtipig sa datos ngadto sa kawanangan goods gibutang sa usa ka transaksyon (ang function gigamit alang niini box.atomic) aron makunhuran ang gidaghanon sa mga operasyon sa disk.

Sa katapusan, ang lokal nga pag-synchronize function goods sa usa ka tinubdan mahimo nimong ipatuman kini sama niini:

local function sync_goods()
    local tuple = box.space.row_ver:get('goods')
    local row_ver = tuple and tuple.value or 0

    β€”β€” set your url here:
    local url = 'http://127.0.0.1:81/test/goods/list'

    while true do
        local goods = load_goods(url, row_ver)

        local count = #goods
        if count == 0 then
            return
        end

        save_goods(goods)

        row_ver = goods[count].rowVer
        box.space.row_ver:put({'goods', row_ver})
    end
end

Una atong basahon ang na-save nga bili row_ver alang sa luna goods. Kung nawala kini (ang una nga sesyon sa pagbinayloay), nan among kuhaon kini ingon row_ver sero. Sunod sa siklo naghimo kami usa ka panid sa panid nga pag-download sa nabag-o nga datos gikan sa gigikanan sa gitakda nga url. Sa matag pag-uli, among gitipigan ang nadawat nga datos sa angay nga lokal nga wanang ug gi-update ang kantidad row_ver (sa kawanangan row_ver ug sa variable row_ver) - kuhaa ang bili row_ver gikan sa katapusang linya sa gikarga nga datos.

Aron mapanalipdan batok sa aksidente nga pag-loop (sa kaso sa usa ka sayup sa programa), ang loop while mahimong pulihan sa for:

for _ = 1, max_req do ...

Ingon usa ka sangputanan sa pagpatuman sa function sync_goods luna goods ang tigdawat maglangkob sa labing bag-ong bersyon sa tanan nga mga rekord sa kawanangan goods sa tinubdan.

Dayag, ang pagtangtang sa datos dili masibya niining paagiha. Kung adunay ingon nga panginahanglan, mahimo nimong gamiton ang marka sa pagtangtang. Idugang sa wanang goods boolean nga natad is_deleted ug imbes sa pisikal nga pagtangtang sa usa ka rekord, among gigamit ang lohikal nga pagtangtang - among gibutang ang kantidad sa uma is_deleted ngadto sa kahulogan true. Usahay imbes nga boolean field is_deleted kini mao ang mas sayon ​​sa paggamit sa kapatagan deleted, nga nagtipig sa petsa-oras sa lohikal nga pagtangtang sa rekord. Human sa paghimo sa usa ka lohikal nga pagtangtang, ang rekord nga gimarkahan para sa pagtangtang ibalhin gikan sa tinubdan ngadto sa destinasyon (sumala sa lohika nga gihisgutan sa ibabaw).

Han-ay row_ver mahimong gamiton sa pagpasa sa datos gikan sa ubang mga luna: dili na kinahanglan nga maghimo ug bulag nga han-ay alang sa matag gipasa nga luna.

Among gitan-aw ang usa ka epektibo nga paagi sa taas nga lebel nga pagkopya sa datos sa mga aplikasyon gamit ang Tarantool DBMS.

kaplag

  1. Ang Tarantool DBMS usa ka madanihon, nagsaad nga produkto alang sa paghimo og mga aplikasyon nga adunay taas nga karga.
  2. Ang taas nga lebel sa replikasyon sa datos adunay daghang mga bentaha kaysa ubos nga lebel nga pagkopya.
  3. Ang taas nga lebel nga pamaagi sa pagkopya nga gihisgutan sa artikulo nagtugot kanimo nga maminusan ang gidaghanon sa gibalhin nga datos pinaagi sa pagbalhin lamang sa mga rekord nga nausab sukad sa katapusan nga sesyon sa pagbinayloay.

Source: www.habr.com

Idugang sa usa ka comment