Replikasi tingkat dhuwur ing Tarantool DBMS

Halo, aku nggawe aplikasi kanggo DBMS Tarantool minangka platform sing dikembangake dening Mail.ru Group sing nggabungake DBMS kanthi kinerja dhuwur lan server aplikasi ing basa Lua. Kacepetan dhuwur saka solusi adhedhasar Tarantool digayuh, utamane, amarga dhukungan kanggo mode memori DBMS lan kemampuan kanggo nglakokake logika bisnis aplikasi ing papan alamat siji kanthi data. Ing wektu sing padha, ketekunan data dipesthekake nggunakake transaksi ACID (log WAL dikelola ing disk). Tarantool duwe dhukungan kanggo replikasi lan sharding. Miwiti saka versi 2.1, pitakon ing basa SQL didhukung. Tarantool mbukak sumber lan dilisensi ing lisensi BSD Sederhana. Ana uga versi Enterprise komersial.

Replikasi tingkat dhuwur ing Tarantool DBMS
Rasakna kekuwatane! (...alias seneng pagelaran)

Kabeh ing ndhuwur ndadekake Tarantool minangka platform sing menarik kanggo nggawe aplikasi kanthi beban dhuwur sing bisa digunakake karo database. Ing aplikasi kasebut, asring mbutuhake replikasi data.

Kaya kasebut ing ndhuwur, Tarantool duwe replikasi data sing dibangun. Prinsip operasine yaiku nglakokake replika kabeh transaksi sing ana ing master log (WAL). Biasane replikasi kuwi (kita bakal luwih nyebataken tingkat rendah) digunakake kanggo mesthekake toleransi fault aplikasi lan / utawa kanggo disebaraké mbukak maca antarane kelenjar kluster.

Replikasi tingkat dhuwur ing Tarantool DBMS
Gabah. 1. Replikasi ing kluster

Conto skenario alternatif bakal nransfer data sing digawe ing database siji menyang database liyane kanggo proses / ngawasi. Ing kasus terakhir, solusi sing luwih trep bisa digunakake tingkat dhuwur replikasi - replikasi data ing tingkat logika bisnis aplikasi. Sing. Kita ora nggunakake solusi sing wis siap dibangun ing DBMS, nanging ngleksanakake replikasi dhewe ing aplikasi sing dikembangake. Pendekatan iki nduweni kaluwihan lan kekurangan. Ayo dhaptar kaluwihan.

1. Ngirit lalu lintas:

  • Sampeyan ora bisa nransfer kabeh data, nanging mung bagean (contone, sampeyan bisa nransfer mung sawetara tabel, sawetara kolom utawa cathetan sing ketemu kritéria tartamtu);
  • Ora kaya replikasi tingkat rendah, sing ditindakake terus-terusan ing asinkron (dilaksanakake ing versi Tarantool saiki - 1.10) utawa sinkron (kanggo dileksanakake ing versi Tarantool sabanjure), replikasi tingkat dhuwur bisa ditindakake ing sesi (yaiku, ing aplikasi pisanan nyinkronake data - data sesi ijol-ijolan, banjur ana jeda ing replikasi, sawise sesi ijol-ijolan sabanjure, lsp);
  • yen rekaman wis diganti kaping pirang-pirang, sampeyan mung bisa nransfer versi paling anyar (ora kaya replikasi tingkat kurang, kang kabeh owah-owahan ing master bakal diputer maneh sequentially ing replika).

2. Ora ana kangelan karo ngleksanakake HTTP exchange, sing ngijini sampeyan kanggo nyinkronake database remot.

Replikasi tingkat dhuwur ing Tarantool DBMS
Gabah. 2. Replikasi liwat HTTP

3. Struktur database ing antarane data sing ditransfer ora kudu padha (maneh, ing kasus umum, malah bisa nggunakake DBMS beda, basa program, platform, etc.).

Replikasi tingkat dhuwur ing Tarantool DBMS
Gabah. 3. Replikasi ing sistem heterogen

Kelemahane yaiku, rata-rata, program luwih angel / larang tinimbang konfigurasi, lan tinimbang ngatur fungsi sing dibangun, sampeyan kudu ngetrapake dhewe.

Yen ing kahanan sampeyan, kaluwihan ing ndhuwur iku penting (utawa minangka kondisi sing perlu), mula sampeyan kudu nggunakake replikasi tingkat dhuwur. Ayo goleki sawetara cara kanggo ngetrapake replikasi data tingkat dhuwur ing DBMS Tarantool.

Nyilikake lalu lintas

Dadi, salah sawijining kaluwihan replikasi tingkat dhuwur yaiku penghematan lalu lintas. Supaya kauntungan iki bisa diwujudake kanthi lengkap, perlu kanggo nyilikake jumlah data sing ditransfer sajrone saben sesi ijol-ijolan. Mesthi, kita ora lali yen ing pungkasan sesi, panrima data kudu disinkronake karo sumber (paling ora kanggo bagean data sing melu replikasi).

Kepiye cara nyilikake jumlah data sing ditransfer sajrone replikasi tingkat dhuwur? Solusi sing gampang yaiku milih data miturut tanggal lan wektu. Kanggo nindakake iki, sampeyan bisa nggunakake kolom tanggal-wektu sing wis ana ing tabel (yen ana). Contone, dokumen "pesanan" bisa uga duwe kolom "wektu eksekusi pesenan sing dibutuhake" - delivery_time. Masalah karo solusi iki yaiku nilai-nilai ing lapangan iki ora kudu ana ing urutan sing cocog karo nggawe pesenan. Dadi kita ora bisa ngelingi nilai lapangan maksimal delivery_time, ditularake sajrone sesi ijol-ijolan sadurunge, lan sajrone sesi ijol-ijolan sabanjure pilih kabeh cathetan kanthi nilai lapangan sing luwih dhuwur delivery_time. Cathetan kanthi nilai lapangan sing luwih murah bisa uga ditambahake ing antarane sesi ijol-ijolan delivery_time. Uga, pesenan kasebut bisa uga ngalami owah-owahan, nanging ora mengaruhi lapangan kasebut delivery_time. Ing kasus loro kasebut, owah-owahan ora bakal ditransfer saka sumber menyang panggonan sing dituju. Kanggo ngatasi masalah kasebut, kita kudu nransfer data "tumpang tindih". Sing. ing saben sesi ijol-ijolan kita bakal nransfer kabeh data kanthi nilai lapangan delivery_time, ngluwihi sawetara titik ing sasi (contone, N jam saka wayahe saiki). Nanging, jelas yen kanggo sistem gedhe, pendekatan iki akeh banget lan bisa nyuda penghematan lalu lintas sing ora ditindakake. Kajaba iku, tabel sing ditransfer bisa uga ora duwe lapangan sing digandhengake karo tanggal-wektu.

Solusi liyane, luwih rumit babagan implementasine, yaiku ngakoni panriman data. Ing kasus iki, sajrone saben sesi ijol-ijolan, kabeh data dikirim, panrimo sing durung dikonfirmasi dening panampa. Kanggo ngleksanakake iki, sampeyan kudu nambah kolom Boolean menyang tabel sumber (contone, is_transferred). Yen panrima ngakoni panrimo saka rekaman, lapangan cocog njupuk Nilai true, sawise entri ora melu ijol-ijolan. Opsi implementasine iki nduweni kekurangan ing ngisor iki. Kaping pisanan, kanggo saben rekaman sing ditransfer, pengakuan kudu digawe lan dikirim. Kira-kira, iki bisa dibandhingake karo tikel jumlah data sing ditransfer lan ndadékaké tikel kaping pindho. Kapindho, ora ana kemungkinan ngirim rekaman sing padha menyang sawetara panrima (panrima pisanan sing nampa bakal konfirmasi panrimo kanggo awake dhewe lan kanggo kabeh liyane).

Cara sing ora duwe kekurangan sing kasebut ing ndhuwur yaiku nambah kolom menyang tabel sing ditransfer kanggo nglacak owah-owahan ing larik. Kolom kasebut bisa dadi jinis tanggal-wektu lan kudu disetel / dianyari dening aplikasi menyang wektu saiki saben cathetan wektu ditambahake / diganti (atom kanthi tambahan / owah-owahan). Minangka conto, ayo nelpon kolom update_time. Kanthi nyimpen nilai kolom maksimum kolom iki kanggo cathetan sing ditransfer, kita bisa miwiti sesi ijol-ijolan sabanjure kanthi nilai iki (pilih cathetan kanthi nilai lapangan update_time, ngluwihi nilai sing disimpen sadurunge). Masalah karo pendekatan sing terakhir yaiku owah-owahan data bisa kedadeyan ing batch. Minangka asil saka nilai lapangan ing kolom update_time bisa uga ora unik. Mangkono, kolom iki ora bisa digunakake kanggo output data porsi (kaca-kaca). Kanggo nampilake kaca data miturut kaca, sampeyan kudu nggawe mekanisme tambahan sing paling mungkin nduweni efisiensi sing sithik (contone, njupuk saka database kabeh cathetan kanthi nilai update_time luwih dhuwur tinimbang sing diwenehake lan ngasilake sawetara rekaman tartamtu, diwiwiti saka offset tartamtu saka wiwitan sampel).

Sampeyan bisa nambah efisiensi transfer data kanthi rada nambah pendekatan sadurunge. Kanggo nindakake iki, kita bakal nggunakake jinis integer (integer dawa) minangka nilai kolom kolom kanggo nglacak owah-owahan. Ayo jeneng kolom row_ver. Nilai kolom kolom iki isih kudu disetel / dianyari saben rekaman digawe / diowahi. Nanging ing kasus iki, lapangan ora bakal diutus tanggal-wektu saiki, nanging Nilai saka sawetara counter, tambah siji. Akibaté, kolom row_ver bakal ngemot nilai unik lan bisa digunakake ora mung kanggo nampilake data "delta" (data ditambahake / diganti wiwit pungkasan sesi ijol-ijolan sadurunge), nanging uga kanthi gampang lan efektif dipecah dadi kaca.

Cara pungkasan sing diusulake kanggo nyilikake jumlah data sing ditransfer ing kerangka replikasi tingkat dhuwur katon paling optimal lan universal. Ayo dideleng kanthi luwih rinci.

Nglewati Data Nggunakake Counter Versi Baris

Implementasi bagean server / master

Ing MS SQL Server, ana jinis kolom khusus kanggo ngleksanakake pendekatan iki - rowversion. Saben database wis counter sing mundhak siji saben wektu rekaman ditambahake / diganti ing tabel sing wis kolom kaya rowversion. Nilai counter iki kanthi otomatis diutus menyang kolom kolom iki ing ditambahake / rekaman diganti. Tarantool DBMS ora duwe mekanisme dibangun ing padha. Nanging, ing Tarantool ora angel ditindakake kanthi manual. Ayo ndeleng carane iki rampung.

Pisanan, terminologi cilik: tabel ing Tarantool diarani spasi, lan cathetan diarani tuples. Ing Tarantool sampeyan bisa nggawe urutan. Urutan ora luwih saka generator sing dijenengi saka nilai integer sing diurutake. Sing. iki persis sing kita butuhake kanggo tujuan kita. Ing ngisor iki kita bakal nggawe urutan kasebut.

Sadurunge nindakake operasi database ing Tarantool, sampeyan kudu nglakokake printah ing ngisor iki:

box.cfg{}

Akibaté, Tarantool bakal miwiti nulis snapshot database lan log transaksi menyang direktori saiki.

Ayo nggawe urutan row_version:

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

Pilihan if_not_exists ngidini skrip nggawe bisa dieksekusi kaping pirang-pirang: yen obyek kasebut ana, Tarantool ora bakal nyoba nggawe maneh. Pilihan iki bakal digunakake ing kabeh printah DDL sakteruse.

Ayo nggawe spasi minangka conto.

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

Ing kene kita nyetel jeneng spasi (goods), jeneng lapangan lan jinise.

Kolom nambah otomatis ing Tarantool uga digawe nggunakake urutan. Ayo nggawe kunci primer nambah otomatis miturut kolom 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
})

Tarantool ndhukung sawetara jinis indeks. Indeks sing paling umum digunakake yaiku jinis TREE lan HASH, sing adhedhasar struktur sing cocog karo jeneng kasebut. TREE minangka jinis indeks sing paling serbaguna. Iki ngidini sampeyan njupuk data kanthi cara sing teratur. Nanging kanggo pilihan kesetaraan, HASH luwih cocok. Mulane, disaranake nggunakake HASH kanggo kunci utami (yaiku apa sing ditindakake).

Kanggo nggunakake kolom row_ver kanggo mindhah data sing diganti, sampeyan kudu ngiket nilai urutan menyang kolom kolom iki row_ver. Nanging ora kaya kunci utama, nilai kolom kolom row_ver kudu nambah siji ora mung nalika nambah cathetan anyar, nanging uga nalika ngganti sing wis ana. Sampeyan bisa nggunakake pemicu kanggo iki. Tarantool duwe rong jinis pemicu spasi: before_replace и on_replace. Pemicu dipecat nalika data ing spasi diganti (kanggo saben tuple sing kena pengaruh owah-owahan, fungsi pemicu diluncurake). Boten kados on_replace, before_replace-triggers ngijini sampeyan kanggo ngowahi data saka tuple sing pemicu wis kaleksanan. Mulane, jinis pemicu pungkasan cocog karo kita.

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

Pemicu ing ngisor iki ngganti nilai lapangan row_ver disimpen tuple menyang Nilai sabanjuré saka urutan row_version.

Supaya bisa ngekstrak data saka papan goods dening kolom row_ver, ayo nggawe indeks:

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

Tipe indeks - wit (TREE), amarga kita kudu ngekstrak data kanthi urutan munggah saka nilai ing kolom row_ver.

Ayo nambah sawetara data menyang spasi:

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}

Amarga Kolom pisanan minangka counter nambah otomatis; kita ora lulus. Tarantool bakal kanthi otomatis ngganti nilai sabanjure. Kajaba iku, minangka nilai kolom kolom row_ver sampeyan bisa pass nil - utawa ora nemtokake nilai ing kabeh, amarga kolom iki manggoni posisi pungkasan ing papan.

Ayo priksa asil sisipan:

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

Kaya sing sampeyan ngerteni, kolom pisanan lan pungkasan diisi kanthi otomatis. Saiki bakal gampang nulis fungsi kanggo ngunggahake owah-owahan spasi saben kaca 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

Fungsi njupuk minangka parameter nilai row_ver, wiwit saka iku perlu kanggo mbongkar owahan, lan ngasilake bagean saka data diganti.

Sampling data ing Tarantool ditindakake liwat indeks. Fungsi get_goods nggunakake iterator kanthi indeks row_ver kanggo nampa data sing diganti. Tipe iterator yaiku GT (Greater Than, Greater than). Iki tegese iterator bakal ngliwati nilai indeks kanthi urutan sing diwiwiti saka kunci sing dilewati (nilai lapangan row_ver).

Iterator ngasilake tuples. Supaya banjur bisa nransfer data liwat HTTP, iku perlu kanggo ngowahi tuples kanggo struktur trep kanggo serialization sakteruse. Conto nggunakake fungsi standar kanggo iki tomap. Tinimbang nggunakake tomap sampeyan bisa nulis fungsi dhewe. Contone, kita bisa uga pengin ngganti jeneng lapangan name, aja ngliwati lapangan code lan nambah lapangan 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

Ukuran kaca saka data output (jumlah cathetan ing siji bagean) ditemtokake dening variabel page_size. Ing conto nilai page_size punika 5. Ing program nyata, ukuran kaca biasane luwih. Iku gumantung ing ukuran rata-rata saka tuple spasi. Ukuran kaca sing optimal bisa ditemtokake kanthi empiris kanthi ngukur wektu transfer data. Sing luwih gedhe ukuran kaca, luwih cilik jumlah roundtrip antarane sisih ngirim lan nampa. Kanthi cara iki sampeyan bisa nyuda wektu sakabèhé kanggo ngundhuh owahan. Nanging, yen ukuran kaca gedhe banget, kita bakal nglampahi dawa banget ing server serializing sampel. Akibaté, bisa uga ana wektu tundha kanggo ngolah panjalukan liyane sing teka ing server. Paramèter page_size bisa dimuat saka file konfigurasi. Kanggo saben papan sing ditularake, sampeyan bisa nyetel nilai dhewe. Nanging, kanggo umume spasi, nilai standar (contone, 100) bisa uga cocog.

Ayo nglakokake fungsi kasebut 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
...

Ayo njupuk nilai lapangan row_ver saka baris pungkasan lan nelpon fungsi maneh:

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

Sepisan maneh:

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

Kaya sing sampeyan ngerteni, yen digunakake kanthi cara iki, fungsi kasebut bakal ngasilake kabeh cathetan spasi saben kaca goods. Kaca pungkasan diterusake kanthi pilihan kosong.

Ayo nggawe owahan ing spasi:

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

Kita wis ngganti nilai lapangan name kanggo siji entri lan nambah loro entri anyar.

Ayo baleni telpon fungsi pungkasan:

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

Fungsi kasebut ngasilake rekaman sing diganti lan ditambahake. Dadi fungsi get_goods ngijini sampeyan kanggo nampa data sing wis diganti wiwit telpon pungkasan, kang basis saka cara replikasi ing wawasan.

Kita bakal ninggalake penerbitan asil liwat HTTP ing wangun JSON ing njaba ruang lingkup artikel iki. Sampeyan bisa maca babagan iki ing kene: https://habr.com/ru/company/mailru/blog/272141/

Implementasi bagean klien / budak

Ayo katon ing implementasine saka sisih panampa. Ayo nggawe spasi ing sisih panampa kanggo nyimpen data sing diundhuh:

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

Struktur ruang padha karo struktur ruang ing sumber. Nanging amarga kita ora bakal ngirim data sing ditampa ing ngendi wae, kolom row_ver ora ana ing papan panampa. Ing lapangan id pengenal sumber bakal direkam. Mulane, ing sisih panrima ora perlu kanggo nggawe otomatis incrementing.

Kajaba iku, kita butuh papan kanggo nyimpen nilai 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
})

Kanggo saben spasi dimuat (field space_name) kita bakal nyimpen nilai dimuat pungkasan kene row_ver (lapangan value). Kolom kasebut minangka kunci utama space_name.

Ayo nggawe fungsi kanggo mbukak data spasi goods liwat HTTP. Kanggo nindakake iki, kita butuh perpustakaan sing ngetrapake klien HTTP. Baris ing ngisor iki mbukak perpustakaan lan instantiate klien HTTP:

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

Kita uga butuh perpustakaan kanggo deserialization json:

local json = require('json')

Iki cukup kanggo nggawe fungsi loading data:

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

Fungsi kasebut nindakake panjalukan HTTP menyang alamat url lan dikirim row_ver minangka parameter lan ngasilake asil deserialized saka panjalukan.

Fungsi kanggo nyimpen data sing ditampa katon kaya iki:

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

Siklus nyimpen data menyang papan goods diselehake ing transaksi (fungsi kasebut digunakake kanggo iki box.atomic) kanggo nyuda jumlah operasi disk.

Pungkasan, fungsi sinkronisasi papan lokal goods kanthi sumber sampeyan bisa ngetrapake kaya iki:

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

Kaping pisanan, kita maca nilai sing disimpen sadurunge row_ver kanggo papan goods. Yen ilang (sesi exchange pisanan), banjur kita njupuk minangka row_ver nul. Sabanjure ing siklus kita nindakake download kaca-kaca saka data sing diganti saka sumber ing url sing ditemtokake. Ing saben pengulangan, kita nyimpen data sing ditampa menyang papan lokal sing cocog lan nganyari nilai kasebut row_ver (ing angkasa row_ver lan ing variabel row_ver) - njupuk Nilai row_ver saka baris pungkasan data dimuat.

Kanggo nglindhungi saka looping sengaja (ing cilik saka kesalahan ing program), loop while bisa diganti dening for:

for _ = 1, max_req do ...

Minangka asil saka eksekusi fungsi sync_goods panggonan goods panrima bakal ngemot versi paling anyar saka kabeh cathetan papan goods ing sumber.

Temenan, pambusakan data ora bisa disiarake kanthi cara iki. Yen perlu, sampeyan bisa nggunakake tandha pambusakan. Tambah menyang papan goods lapangan boolean is_deleted lan tinimbang mbusak rekaman kanthi fisik, kita nggunakake pambusakan logis - kita nyetel nilai lapangan is_deleted menyang makna true. Kadhangkala tinimbang kolom boolean is_deleted luwih trep nggunakake lapangan deleted, sing nyimpen tanggal-wektu pambusakan logis saka rekaman. Sawise nindakake pambusakan logis, rekaman sing ditandhani kanggo pambusakan bakal ditransfer saka sumber menyang panggonan sing dituju (miturut logika sing wis dibahas ing ndhuwur).

Urutan row_ver bisa digunakake kanggo ngirim data saka spasi liyane: ora perlu nggawe urutan kapisah kanggo saben papan sing dikirim.

Kita ndeleng cara efektif replikasi data tingkat dhuwur ing aplikasi nggunakake DBMS Tarantool.

temonan

  1. Tarantool DBMS minangka produk sing apik lan janjeni kanggo nggawe aplikasi kanthi beban dhuwur.
  2. Replikasi data tingkat dhuwur nduweni sawetara kaluwihan tinimbang replikasi tingkat rendah.
  3. Cara replikasi tingkat dhuwur sing dibahas ing artikel ngidini sampeyan nyilikake jumlah data sing ditransfer kanthi mung nransfer cathetan sing wis diganti wiwit sesi ijol-ijolan pungkasan.

Source: www.habr.com

Add a comment