Tarantool Cartridge: Lua backend sharding dina tilu garis

Tarantool Cartridge: Lua backend sharding dina tilu garis

Di Mail.ru Grup kami ngagaduhan Tarantool - ieu mangrupikeun server aplikasi di Lua, anu ogé ngarangkep salaku pangkalan data (atanapi sabalikna?). Éta gancang sareng keren, tapi kamampuan hiji server masih henteu terbatas. Skala vertikal ogé sanés panacea, janten Tarantool gaduh alat pikeun skala horisontal - modul vshard [1]. Eta ngidinan Anjeun pikeun beling data sakuliah sababaraha server, tapi anjeun kudu tinker kalawan eta pikeun nyetél tur masangkeun logika bisnis.

Warta alus: kami geus ngumpulkeun sababaraha nembak badag (misalna [2], [3]) sareng nyiptakeun kerangka sanés anu sacara signifikan bakal nyederhanakeun solusi pikeun masalah ieu.

Tarantool Cartridge mangrupa kerangka anyar pikeun ngembangkeun sistem sebaran kompléks. Eta ngidinan Anjeun pikeun difokuskeun nulis logika bisnis tinimbang ngarengsekeun masalah infrastruktur. Di handap potongan kuring bakal nyarioskeun ka anjeun kumaha kerangka ieu jalan sareng kumaha cara nyerat jasa anu disebarkeun ngagunakeunana.

Naon sabenerna masalahna?

Kami gaduh tarantula, kami gaduh vshard - naon deui anu anjeun pikahoyong?

Anu mimiti, éta masalah genah. Konfigurasi vshard dikonpigurasi ngaliwatan tabel Lua. Pikeun sistem anu disebarkeun tina sababaraha prosés Tarantool tiasa dianggo leres, konfigurasi kedah sami di mana waé. Teu aya anu hoyong ngalakukeun ieu sacara manual. Ku alatan éta, sagala sorts Aksara, Ansible, sarta sistem deployment dipaké.

Cartridge sorangan ngatur konfigurasi vshard, ngalakukeun ieu dumasar kana na konfigurasi disebarkeun sorangan. Dasarna mangrupikeun file YAML saderhana, salinan anu disimpen dina unggal conto Tarantool. Nyederhanakeun nyaéta kerangka sorangan ngawas konfigurasina sareng mastikeun yén éta sami di mana waé.

Bréh, éta deui masalah genah. Konfigurasi vshard teu aya hubunganana sareng pamekaran logika bisnis sareng ngan ukur ngaganggu programer tina karyana. Nalika urang bahas arsitéktur proyék, urang sering ngobrol ngeunaan komponén individu sareng interaksina. Ieu teuing mimiti mikir ngeunaan rolling kaluar klaster ka 3 puseur data.

Urang direngsekeun masalah ieu leuwih sarta leuwih deui, sarta di sawatara titik urang junun ngamekarkeun hiji pendekatan nu disederhanakeun gawé bareng aplikasi sapanjang sakabéh siklus hirup na: kreasi, ngembangkeun, nguji, CI / CD, pangropéa.

Cartridge ngawanohkeun konsép peran pikeun tiap prosés Tarantool. Kalungguhan mangrupikeun konsép anu ngamungkinkeun pamekar fokus kana nyerat kode. Sadaya peran anu aya dina proyék tiasa dijalankeun dina hiji conto Tarantool, sareng ieu bakal cekap pikeun tés.

Keunggulan Tarantool Cartridge:

  • orkestrasi klaster otomatis;
  • ngalegaan pungsionalitas aplikasi nganggo peran anyar;
  • template aplikasi pikeun ngembangkeun sarta deployment;
  • diwangun-di sharding otomatis;
  • integrasi jeung kerangka nguji Luatest;
  • manajemén klaster ngagunakeun WebUI jeung API;
  • bungkusan sareng alat panyebaran.

Halo Dunya!

Abdi teu tiasa ngantosan pikeun nembongkeun kerangka sorangan, sangkan bakal ninggalkeun carita ngeunaan arsitektur keur engké tur mimitian ku hal basajan. Upami urang nganggap yén Tarantool sorangan parantos dipasang, maka sadaya anu tetep kedah dilakukeun

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

Dua paréntah ieu bakal masang utilitas garis paréntah sareng ngamungkinkeun anjeun nyiptakeun aplikasi munggaran anjeun tina citakan:

$ cartridge create --name myapp

Sareng ieu anu urang kéngingkeun:

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/

Ieu mangrupikeun gudang git kalayan siap-siap "Halo, Dunya!" aplikasi. Hayu urang cobian langsung ngajalankeun éta, saatos masang dependensi (kalebet kerangka sorangan):

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

Janten, urang gaduh hiji titik anu ngajalankeun pikeun aplikasi sharded ka hareup. Jalma awam anu hoyong terang tiasa langsung muka antarmuka wéb, ngonpigurasikeun gugusan hiji titik kalayan beurit sareng nikmati hasilna, tapi éta awal teuing pikeun girang. Sajauh, aplikasi nu teu bisa ngalakukeun nanaon mangpaat, jadi kuring gé ngabejaan Anjeun tentang deployment engké, tapi ayeuna éta waktu nulis kode.

Pangwangunan Aplikasi

Bayangkeun waé, urang ngarancang proyék anu kedah nampi data, simpen sareng ngawangun laporan sakali sapoé.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Urang ngawitan ngagambar diagram jeung nempatkeun tilu komponén di dinya: gateway, neundeun jeung scheduler. Kami nuju ngusahakeun arsitéktur salajengna. Kusabab kami nganggo vshard salaku gudang, urang tambahkeun vshard-router na vshard-panyimpenan kana skéma. Sanes gateway atanapi scheduler bakal langsung ngakses gudang; éta pikeun router, éta pikeun naon dijieun.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Diagram ieu masih teu persis ngagambarkeun naon urang bakal ngawangun dina proyék sabab komponén kasampak abstrak. Urang masih peryogi ningali kumaha ieu bakal projected kana Tarantool nyata - hayu urang grup komponén urang ku prosés.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Aya saeutik titik dina ngajaga vshard-router na gateway on instansi misah. Naha urang kedah surfing jaringan sakali deui upami ieu mangrupikeun tanggung jawab router? Aranjeunna kedah dijalankeun dina prosés anu sami. Hartina, duanana gateway na vshard.router.cfg anu initialized dina hiji prosés, sarta ngantep éta interaksi lokal.

Dina tahap desain, éta merenah pikeun digawekeun ku tilu komponén, tapi kuring, salaku pamekar, bari nulis kode, teu hayang mikir ngeunaan launching tilu instansi Tarnatool. Abdi kedah ngajalankeun tés sareng pariksa yén kuring nyerat gateway leres. Atawa meureun kuring rék demonstrate fitur ka kolega kuring. Naha kuring kedah ngaliwat repot nyebarkeun tilu salinan? Ieu kumaha konsep peran dilahirkeun. Peran nyaéta modul luash biasa anu siklus hirupna diurus ku Cartridge. Dina conto ieu aya opat di antarana - gateway, router, gudang, scheduler. Meureun aya deui dina proyék séjén. Sadaya peran tiasa dijalankeun dina hiji prosés, sareng ieu bakal cekap.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Sareng ngeunaan panyebaran kana pementasan atanapi produksi, maka kami bakal napelkeun unggal prosés Tarantool masing-masing peranna gumantung kana kamampuan hardware:

Tarantool Cartridge: Lua backend sharding dina tilu garis

manajemén Topology

Inpormasi ngeunaan dimana peran anu dijalankeun kedah disimpen dimana waé. Sareng ieu "tempat" nyaéta konfigurasi anu disebarkeun, anu ku kuring parantos disebatkeun di luhur. Hal pangpentingna ngeunaan éta topologi klaster. Ieu 3 grup réplikasi tina 5 prosés Tarantool:

Tarantool Cartridge: Lua backend sharding dina tilu garis

Kami henteu hoyong kaleungitan data, janten kami ngarawat inpormasi ngeunaan jalanna prosés kalayan ati-ati. Cartridge ngalacak konfigurasi nganggo komitmen dua-fase. Sakali kami hoyong ngapdet konfigurasi, éta mimitina pariksa yén sadaya instansi sayogi sareng siap nampi konfigurasi énggal. Saatos ieu, fase kadua nerapkeun config. Ku kituna, sanajan hiji salinan tétéla jadi samentara teu sadia, nanaon goréng bakal kajadian. Konfigurasi bakal saukur teu dilarapkeun jeung anjeun bakal nempo kasalahan sateuacanna.

Ogé dina bagian topologi, parameter penting sapertos pamimpin unggal grup réplikasi dituduhkeun. Biasana ieu salinan nu keur dirékam. Sésana paling sering ngan ukur dibaca, sanaos aya pengecualian. Kadang pamekar gagah teu sieun konflik sarta bisa nulis data ka sababaraha réplika paralel, tapi aya sababaraha operasi anu, euweuh urusan naon, teu kudu dipigawé dua kali. Pikeun ieu aya tanda pamingpin.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Kahirupan kalungguhan

Pikeun peran abstrak aya dina arsitéktur sapertos kitu, kerangka kedah kumaha waé ngaturana. Alami, kontrol lumangsung tanpa restarting prosés Tarantool. Aya 4 callbacks pikeun ngatur peran. Cartridge sorangan bakal nelepon aranjeunna gumantung kana naon anu ditulis dina konfigurasi disebarkeun na, kukituna nerapkeun konfigurasi kana peran husus.

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

Unggal kalungguhan boga fungsi init. Disebut sakali nalika peranna diaktipkeun atanapi nalika Tarantool di-restart. Éta merenah di dinya, contona, pikeun initialize box.space.create, atawa scheduler nu bisa ngajalankeun sababaraha serat latar nu bakal ngalakukeun pagawean dina interval waktu nu tangtu.

Hiji fungsi init bisa jadi teu cukup. Cartridge ngamungkinkeun peran ngamangpaatkeun konfigurasi disebarkeun dipaké pikeun nyimpen topologi nu. Urang tiasa nyatakeun bagian anyar dina konfigurasi anu sami sareng nyimpen sempalan tina konfigurasi bisnis di jerona. Dina conto abdi, ieu bisa jadi schema data atawa setelan jadwal pikeun peran scheduler.

Kluster nelepon validate_config и apply_config unggal waktos parobahan konfigurasi disebarkeun. Nalika konfigurasi diterapkeun ku komitmen dua fase, klaster mariksa yén unggal peran parantos siap nampi konfigurasi énggal ieu sareng, upami diperyogikeun, ngalaporkeun kasalahan ka pangguna. Nalika sadayana satuju yén konfigurasi normal, teras éta apply_config.

Ogé peran boga metoda stop, anu diperlukeun pikeun ngabersihan kaluaran peran. Upami urang nyarios yén scheduler henteu diperyogikeun deui dina server ieu, éta tiasa ngeureunkeun serat-serat anu dimimitian init.

Peran tiasa saling berinteraksi. Urang biasa nulis panggero fungsi di Lua, tapi bisa jadi aya hiji prosés nu tangtu teu boga peran urang kudu. Pikeun mempermudah nelepon ngaliwatan jaringan, kami nganggo rpc (panggero prosedur jauh) modul bantu, nu diwangun dina dasar netbox baku diwangun kana Tarantool. Ieu tiasa mangpaat upami, contona, gateway anjeun hoyong langsung naroskeun ka penjadwal pikeun ngalakukeun padamelan ayeuna, tinimbang ngantosan sadinten.

Titik penting séjén nyaéta mastikeun kasabaran kasalahan. Cartridge ngagunakeun protokol SWIM pikeun ngawas kaséhatan [4]. Pondokna, prosés silih tukeur "gosip" saling ngeunaan UDP-unggal prosés nyarioskeun beja panganyarna ka tatanggana, sareng aranjeunna ngabales. Lamun ujug-ujug jawaban teu datang, Tarantool mimiti curiga hal anu salah, sarta sanggeus bari eta recites maot sarta mimiti ngabejaan dulur sabudeureun warta ieu.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Dumasar protokol ieu, Cartridge ngatur pamrosésan gagal otomatis. Unggal prosés ngawas lingkunganana, sareng upami pamimpin ujug-ujug eureun ngaréspon, réplika tiasa nyandak alih peranna, sareng Cartridge ngonpigurasikeun peran anu ngajalankeun sasuai.

Tarantool Cartridge: Lua backend sharding dina tilu garis

Anjeun kedah ati-ati di dieu, sabab sering mudik tiasa nyababkeun konflik data nalika réplikasi. Tangtosna, anjeun henteu kedah ngaktipkeun failover otomatis sacara acak. Urang kedah jelas ngartos naon anu kajantenan sareng pastikeun yén réplikasi moal pegat saatos pamimpin dibalikeun sareng makuta dipulangkeun ka anjeunna.

Tina sadaya ieu, anjeun tiasa raos yén peranna sami sareng microservices. Dina rasa, aranjeunna ngan éta, ngan salaku modul jero prosés Tarantool. Tapi aya ogé sababaraha béda dasar. Kahiji, sadaya kalungguhan proyék kudu hirup dina dasar kode sarua. Sareng sadaya prosés Tarantool kedah diluncurkeun tina dasar kode anu sami, supados henteu aya kejutan sapertos nalika urang nyobian ngarencanakeun jadwal, tapi éta henteu aya. Ogé, anjeun teu kudu ngidinan béda dina versi kode, sabab paripolah sistem dina kaayaan kitu hésé pisan pikeun ngaduga jeung debug.

Teu kawas Docker, urang teu bisa ngan nyokot peran "gambar", nyandak ka mesin sejen tur ngajalankeun dinya. Peran kami henteu terasing sapertos wadah Docker. Ogé, urang moal tiasa ngajalankeun dua peran anu sami dina hiji conto. A peran boh aya atanapi henteu; dina rasa, éta singleton a. Jeung katilu, peran kudu sarua dina sakabéh grup réplikasi, sabab disebutkeun eta bakal absurd - data anu sarua, tapi konfigurasi béda.

Pakakas panyebaran

Kuring jangji baris némbongkeun kumaha Cartridge mantuan nyebarkeun aplikasi. Pikeun ngagampangkeun kahirupan batur, kerangka ngarangkep bungkusan RPM:

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

Paket anu dipasang ngandung ampir sadayana anu anjeun peryogikeun: boh aplikasi sareng dependensi anu dipasang. Tarantool ogé bakal sumping dina server salaku kagumantungan pakét RPM, sareng jasa kami siap diluncurkeun. Hal ieu dilakukeun ngaliwatan systemd, tapi mimitina anjeun kudu nulis konfigurasi saeutik. Sahenteuna, tangtukeun URI unggal prosés. Tilu cukup contona.

$ 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

Aya nuansa metot dieu. Gantina nangtukeun ngan port protokol binér, urang tangtukeun sakabéh alamat umum prosés kaasup hostname nu. Ieu diperlukeun ku kituna titik klaster nyaho kumaha nyambungkeun ka silih. Ieu mangrupakeun ide goréng pikeun ngagunakeun 0.0.0.0 salaku alamat advertise_uri kedah alamat IP éksternal, teu meungkeut stop kontak. Tanpa éta, teu aya anu tiasa dianggo, janten Cartridge ngan saukur moal ngantep anjeun ngaluncurkeun titik anu salah advertise_uri.

Ayeuna konfigurasi parantos siap, anjeun tiasa ngamimitian prosés. Kusabab unit systemd biasa henteu ngijinkeun langkung ti hiji prosés pikeun ngamimitian, aplikasi dina Cartridge dipasang ku anu disebut. unit instan anu dianggo sapertos kieu:

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

Dina konfigurasi, kami netepkeun port HTTP dimana Cartridge ngalayanan antarmuka wéb - 8080. Hayu urang angkat sareng tingali:

Tarantool Cartridge: Lua backend sharding dina tilu garis

Kami ningali yén sanaos prosésna jalan, aranjeunna henteu acan dikonpigurasi. Cartridge henteu acan terang saha anu kedah ngayakeun réplikasi sareng saha sareng teu tiasa nyandak kaputusan nyalira, janten ngantosan tindakan urang. Tapi urang teu boga loba pilihan: kahirupan klaster anyar dimimitian ku konfigurasi tina titik munggaran. Teras kami bakal nambihan anu sanés kana kluster, pasihan aranjeunna peran, sareng dina waktos ieu panyebaran tiasa dianggap suksés réngsé.

Hayu urang tuang sagelas inuman paporit Anjeun tur bersantai sanggeus minggu gawé panjang. Aplikasina tiasa dianggo.

Tarantool Cartridge: Lua backend sharding dina tilu garis

hasil

Naon hasilna? Coba éta, paké éta, tinggalkeun tanggapan, jieun tikét dina Github.

rujukan

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

[2] Kumaha urang ngalaksanakeun inti bisnis investasi Alfa-Bank dumasar kana Tarantool

[3] Arsitéktur tagihan generasi anyar: transformasi sareng transisi ka Tarantool

[4] ngojay - protokol konstruksi klaster

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/cartridge

sumber: www.habr.com

Tambahkeun komentar