Tarantool Cartridge: sharding a backend Lua ing telung baris

Tarantool Cartridge: sharding a backend Lua ing telung baris

Ing Mail.ru Group kita duwe Tarantool - iki minangka server aplikasi ing Lua, sing uga dadi basis data (utawa kosok balene?). Iku cepet lan kelangan, nanging kemampuan siji server isih ora Unlimited. Skala vertikal uga dudu panacea, mula Tarantool duwe alat kanggo skala horisontal - modul vshard [1]. Iku ngijini sampeyan kanggo shard data ing sawetara server, nanging sampeyan kudu tinker karo kanggo nyetel lan masang logika bisnis.

Kabar apik: kita wis nglumpukake sawetara gambar gedhe (contone [2], [3]) lan nggawe kerangka kerja liyane sing bakal nyederhanakake solusi kanggo masalah iki.

Tarantool Cartridge minangka kerangka anyar kanggo ngembangake sistem distribusi sing kompleks. Iki ngidini sampeyan fokus ing nulis logika bisnis tinimbang ngrampungake masalah infrastruktur. Ing ngisor iki, aku bakal ngandhani kepiye cara kerja kerangka iki lan cara nulis layanan sing disebarake nggunakake.

Lan apa, persis, masalahe?

Kita duwe tarantula, kita duwe vshard - apa maneh sing dikarepake?

Kaping pisanan, masalah kepenak. Konfigurasi vshard dikonfigurasi liwat tabel Lua. Kanggo sistem mbagekke sawetara pangolahan Tarantool bisa bener, konfigurasi kudu padha nang endi wae. Ora ana sing pengin nindakake iki kanthi manual. Mulane, kabeh jinis skrip, Ansible, lan sistem penyebaran digunakake.

Cartridge dhewe ngatur konfigurasi vshard, nindakake iki adhedhasar sawijining konfigurasi mbagekke dhewe. Iku ateges file YAML prasaja, salinan kang disimpen ing saben Kayata Tarantool. Nyederhanakake yaiku kerangka kasebut dhewe ngawasi konfigurasi lan mesthekake yen padha ing endi wae.

Sareh, iku maneh prakara penak. Konfigurasi vshard ora ana hubungane karo pangembangan logika bisnis lan mung ngganggu programer saka karyane. Nalika kita ngrembug arsitektur proyek, kita paling kerep ngomong babagan komponen individu lan interaksi. Iku banget awal kanggo mikir babagan nggulung kluster menyang 3 pusat data.

Kita ngrampungake masalah kasebut bola-bali, lan ing sawetara titik kita bisa ngembangake pendekatan sing nyederhanakake nggarap aplikasi ing kabeh siklus urip: nggawe, pangembangan, testing, CI / CD, pangopènan.

Cartridge pirso konsep peran kanggo saben proses Tarantool. Peran minangka konsep sing ngidini pangembang fokus ing nulis kode. Kabeh peran sing kasedhiya ing proyek kasebut bisa ditindakake ing siji conto Tarantool, lan iki bakal cukup kanggo tes.

Fitur utama Tarantool Cartridge:

  • orkestrasi kluster otomatis;
  • ngembangake fungsi aplikasi nggunakake peran anyar;
  • cithakan aplikasi kanggo pangembangan lan penyebaran;
  • dibangun ing sharding otomatis;
  • integrasi karo kerangka testing Luatest;
  • manajemen kluster nggunakake WebUI lan API;
  • packing lan alat panyebaran.

Halo, World!

Aku ora bisa ngenteni kanggo nuduhake framework dhewe, supaya kita bakal ninggalake crita bab arsitektur kanggo mengko lan miwiti karo soko prasaja. Yen kita nganggep yen Tarantool dhewe wis diinstal, mula mung kudu ditindakake

$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH

Loro printah iki bakal nginstal utilitas baris printah lan ngidini sampeyan nggawe aplikasi pisanan saka cithakan:

$ cartridge create --name myapp

Lan iki sing kita entuk:

myapp/
├── .git/
├── .gitignore
├── app/roles/custom.lua
├── deps.sh
├── init.lua
├── myapp-scm-1.rockspec
├── test
│   ├── helper
│   │   ├── integration.lua
│   │   └── unit.lua
│   ├── helper.lua
│   ├── integration/api_test.lua
│   └── unit/sample_test.lua
└── tmp/

Iki minangka repositori git kanthi siap "Hello, World!" aplikasi. Coba langsung mbukak, sawise nginstal dependensi (kalebu kerangka dhewe):

$ tarantoolctl rocks make
$ ./init.lua --http-port 8080

Dadi, kita duwe siji simpul sing mlaku kanggo aplikasi sharded ing mangsa ngarep. Wong awam sing kepengin weruh bisa langsung mbukak antarmuka web, ngatur kluster siji simpul nganggo mouse lan nikmati asile, nanging isih awal banget kanggo bungah. Nganti saiki, aplikasi kasebut ora bisa nindakake apa-apa sing migunani, mula aku bakal ngandhani babagan panyebaran mengko, nanging saiki wektu kanggo nulis kode.

Pangembangan Aplikasi

Bayangake, kita ngrancang proyek sing kudu nampa data, simpen lan gawe laporan sedina.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Kita miwiti nggambar diagram lan nyelehake telung komponen ing: gateway, panyimpenan lan panjadwal. Kita lagi nggarap arsitektur. Awit kita nggunakake vshard minangka panyimpenan, kita nambah vshard-router lan vshard-panyimpenan kanggo rencana. Sanadyan gateway utawa panjadwal bakal langsung ngakses panyimpenan; iku kanggo tujuan router, sing digawe kanggo.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Diagram iki isih ora nggambarake apa sing bakal kita bangun ing proyek kasebut amarga komponen kasebut katon abstrak. Kita isih kudu ndeleng carane iki bakal digambarake menyang Tarantool nyata - ayo klompok komponen kita miturut proses.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Ora ana gunane kanggo njaga vshard-router lan gateway ing kasus sing kapisah. Napa kita kudu njelajah jaringan maneh yen iki wis dadi tanggung jawab router? Dheweke kudu ditindakake ing proses sing padha. Yaiku, loro gateway lan vshard.router.cfg diinisialisasi ing siji proses, lan supaya bisa sesambungan sacara lokal.

Ing tataran desain, luwih trep kanggo nggarap telung komponen, nanging aku, minangka pangembang, nalika nulis kode, ora pengin mikir babagan ngluncurake telung conto Tarnatool. Aku kudu mbukak tes lan priksa manawa aku nulis gateway kanthi bener. Utawa mungkin aku pengin nduduhake fitur kanggo kolega. Yagene aku kudu repot nyebarake telung salinan? Iki carane konsep peran lair. Peran minangka modul luash biasa sing siklus uripe dikelola dening Cartridge. Ing conto iki ana papat - gateway, router, panyimpenan, panjadwal. Bisa uga ana liyane ing proyek liyane. Kabeh peran bisa ditindakake ing siji proses, lan iki bakal cukup.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Lan nalika nerangake penyebaran menyang pementasan utawa produksi, banjur kita bakal nemtokake saben proses Tarantool dhewe-dhewe saka peran gumantung saka kemampuan hardware:

Tarantool Cartridge: sharding a backend Lua ing telung baris

Manajemen topologi

Informasi babagan peran sing ditindakake kudu disimpen ing endi wae. Lan iki "nang endi wae" yaiku konfigurasi sing disebarake, sing wis kasebut ing ndhuwur. Sing paling penting yaiku topologi cluster. Mangkene 3 klompok replikasi saka 5 proses Tarantool:

Tarantool Cartridge: sharding a backend Lua ing telung baris

Kita ora pengin kelangan data, mula kita nambani informasi babagan proses sing mlaku kanthi ati-ati. Cartridge nglacak konfigurasi nggunakake komit rong fase. Sawise kita pengin nganyari konfigurasi, priksa manawa kabeh kedadeyan kasedhiya lan siap nampa konfigurasi anyar. Sawise iki, fase kapindho ngetrapake konfigurasi. Mangkono, sanajan siji salinan dadi ora kasedhiya kanggo sementara, ora ana sing bakal kelakon. Konfigurasi mung ora bakal ditrapake lan sampeyan bakal weruh kesalahan sadurunge.

Uga ing bagean topologi, parameter penting kaya pimpinan saben klompok replikasi dituduhake. Biasane iki salinan sing lagi direkam. Liyane asring mung diwaca, sanajan ana pangecualian. Kadhangkala pangembang sing wani ora wedi karo konflik lan bisa nulis data menyang pirang-pirang replika kanthi paralel, nanging ana sawetara operasi sing, apa wae, ora kudu ditindakake kaping pindho. Kanggo iki ana tandha saka pimpinan.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Urip peran

Kanggo peran abstrak ana ing arsitektur kasebut, kerangka kasebut kudu ngatur apa wae. Alami, kontrol dumadi tanpa miwiti maneh proses Tarantool. Ana 4 callback kanggo ngatur peran. Cartridge dhewe bakal nelpon wong-wong mau gumantung apa sing ditulis ing konfigurasi mbagekke, mangkono nglamar konfigurasi kanggo peran tartamtu.

function init()
function validate_config()
function apply_config()
function stop()

Saben peran nduweni fungsi init. Disebut sapisan nalika peran diaktifake utawa nalika Tarantool diwiwiti maneh. Iku trep ana, contone, kanggo initialize box.space.create, utawa panjadwal bisa miwiti sawetara serat latar mburi sing bakal nindakake karya ing interval wektu tartamtu.

Fungsi siji init bisa uga ora cukup. Cartridge ngidini peran kanggo njupuk kauntungan saka konfigurasi mbagekke digunakake kanggo nyimpen topologi. Kita bisa ngumumake bagean anyar ing konfigurasi sing padha lan nyimpen fragmen konfigurasi bisnis ing kono. Ing contoku, iki bisa dadi skema data utawa setelan jadwal kanggo peran panjadwal.

Telpon kluster validate_config и apply_config saben wektu owah-owahan konfigurasi mbagekke. Nalika konfigurasi diterapake dening komit rong fase, kluster mriksa manawa saben peran wis siyap nampa konfigurasi anyar iki lan, yen perlu, nglaporake kesalahan menyang pangguna. Nalika saben wong setuju yen konfigurasi iku normal, banjur ing apply_config.

Uga peran duwe metode stop, sing dibutuhake kanggo ngresiki output peran. Yen kita ngomong yen panjadwal ora perlu maneh ing server iki, bisa mungkasi serat sing diwiwiti init.

Peran bisa sesambungan karo saben liyane. Kita digunakake kanggo nulis panggilan fungsi ing Lua, nanging bisa uga kedadeyan yen proses tartamtu ora duwe peran sing dibutuhake. Kanggo nggampangake telpon liwat jaringan, kita nggunakake rpc (telpon prosedur remot) modul tambahan, kang dibangun ing basis saka netbox standar dibangun menyang Tarantool. Iki bisa migunani yen, contone, gateway pengin langsung takon panjadwal kanggo nindakake proyek sapunika, tinimbang ngenteni dina.

Titik penting liyane yaiku njamin toleransi kesalahan. Cartridge nggunakake protokol SWIM kanggo ngawasi kesehatan [4]. Ing cendhak, pangolahan ijol-ijolan "gosip" karo saben liyane liwat UDP-saben proses ngandhani pepadhamu kabar paling anyar, lan padha nanggapi. Yen tiba-tiba jawaban ora teka, Tarantool wiwit curiga ana sing salah, lan sawise sawetara wektu dheweke ngucapake pati lan wiwit ngandhani kabeh wong ing sekitar warta iki.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Adhedhasar protokol iki, Cartridge ngatur pangolahan kegagalan otomatis. Saben proses ngawasi lingkungane, lan yen pimpinan dumadakan mandheg nanggapi, tiron bisa njupuk alih peran, lan Cartridge ngatur peran mlaku.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Sampeyan kudu ati-ati ing kene, amarga kerep bolak-balik bisa nyebabake konflik data sajrone replikasi. Mesthi, sampeyan ora kudu ngaktifake failover otomatis kanthi acak. Kita kudu ngerti kanthi jelas apa sing kedadeyan lan manawa replikasi ora bakal rusak sawise pimpinan dipulihake lan makutha bali menyang dheweke.

Saka kabeh iki, sampeyan bisa uga rumangsa yen peran padha karo layanan mikro. Ing pangertèn, padha mung sing, mung minangka modul nang Tarantool pangolahan. Nanging ana uga sawetara beda dhasar. Kaping pisanan, kabeh peran proyek kudu manggon ing basis kode sing padha. Lan kabeh proses Tarantool kudu diluncurake saka basis kode sing padha, supaya ora ana kejutan kaya nalika nyoba miwiti jadwal, nanging ora ana. Uga, sampeyan ora kudu ngidini beda ing versi kode, amarga prilaku sistem ing kahanan kaya mengkono angel banget kanggo prédhiksi lan debug.

Boten kados Docker, kita ora bisa mung njupuk peran "gambar", njupuk menyang mesin liyane lan mbukak ana. Peran kita ora diisolasi kaya kontaner Docker. Uga, kita ora bisa mbukak rong peran sing padha ing siji conto. Peran ana utawa ora ana; ing pangertene, iku tunggal. Lan kaping telune, peran kudu padha ing kabeh klompok replikasi, amarga yen ora bakal absurd - data kasebut padha, nanging konfigurasi beda.

Piranti panyebaran

Aku janji bakal nuduhake carane Cartridge mbantu masang aplikasi. Kanggo nggawe urip luwih gampang kanggo wong liya, kerangka paket paket RPM:

$ cartridge pack rpm myapp -- упакует для нас ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm

Paket sing diinstal ngemot meh kabeh sing dibutuhake: aplikasi lan dependensi sing diinstal. Tarantool uga bakal teka ing server minangka ketergantungan paket RPM, lan layanan kita siap diluncurake. Iki wis rampung liwat systemd, nanging pisanan sampeyan kudu nulis konfigurasi sethitik. Minimal, nemtokake URI saben proses. Telu cukup contone.

$ sudo tee /etc/tarantool/conf.d/demo.yml <<CONFIG
myapp.router: {"advertise_uri": "localhost:3301", "http_port": 8080}
myapp.storage_A: {"advertise_uri": "localhost:3302", "http_enabled": False}
myapp.storage_B: {"advertise_uri": "localhost:3303", "http_enabled": False}
CONFIG

Ana nuansa menarik ing kene. Tinimbang mung nemtokake port protokol binar, kita nemtokake kabeh alamat umum proses kalebu jeneng host. Iki perlu supaya kelenjar kluster ngerti carane nyambungake siji liyane. Ora becik nggunakake 0.0.0.0 minangka alamat advertise_uri; kudu alamat IP eksternal, dudu ikatan soket. Tanpa iku, ora ana sing bisa digunakake, mula Cartridge ora bakal ngidini sampeyan miwiti simpul kanthi advertise_uri sing salah.

Saiki konfigurasi wis siyap, sampeyan bisa miwiti proses. Wiwit unit systemd biasa ora ngidini luwih saka siji proses kanggo miwiti, aplikasi ing Cartridge diinstal dening sing disebut. unit instantiated sing dianggo kaya iki:

$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B

Ing konfigurasi, kita nemtokake port HTTP sing Cartridge serves antarmuka web - 8080. Ayo goleki lan deleng:

Tarantool Cartridge: sharding a backend Lua ing telung baris

Kita weruh manawa proses kasebut mlaku, nanging durung dikonfigurasi. Kartrid durung ngerti sapa sing kudu ditiru karo sapa lan ora bisa nggawe keputusan dhewe, mula ngenteni tumindak kita. Nanging kita ora duwe akeh pilihan: urip kluster anyar diwiwiti kanthi konfigurasi simpul pisanan. Banjur kita bakal nambah liyane menyang kluster, nemtokake peran, lan ing wektu iki penyebaran bisa dianggep kasil rampung.

Ayo tuangake segelas minuman favorit lan santai sawise seminggu kerja. Aplikasi kasebut bisa digunakake.

Tarantool Cartridge: sharding a backend Lua ing telung baris

Hasil

Apa asile? Coba, gunakake, tinggalake umpan balik, gawe tiket ing Github.

referensi

[1] Tarantool » 2.2 » Referensi » Referensi Rocks » Modul vshard

[2] Kepiye cara ngetrapake inti bisnis investasi Alfa-Bank adhedhasar Tarantool

[3] Arsitektur tagihan generasi anyar: transformasi karo transisi menyang Tarantool

[4] SWIM - protokol construction cluster

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/cartridge

Source: www.habr.com

Add a comment