Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Mail.ru Group-da bizda Tarantool bor - bu Lua-dagi dastur serveri, u ham ma'lumotlar bazasi vazifasini bajaradi (yoki aksincha?). Bu tez va ajoyib, lekin bitta serverning imkoniyatlari hali ham cheksiz emas. Vertikal masshtablash ham davo emas, shuning uchun Tarantool gorizontal masshtablash vositalariga ega - vshard moduli [1]. Bu sizga bir nechta serverlar bo'ylab ma'lumotlarni ajratish imkonini beradi, lekin uni sozlash va biznes mantig'ini biriktirish uchun siz u bilan ishlashingiz kerak.

Yaxshi xabar: biz bir nechta katta suratlarni yig'dik (masalan [2], [3]) va ushbu muammoni hal qilishni sezilarli darajada soddalashtiradigan yana bir ramka yaratildi.

Tarantool kartriji murakkab taqsimlangan tizimlarni ishlab chiqish uchun yangi asosdir. Bu sizga infratuzilma muammolarini hal qilish o'rniga biznes mantig'ini yozishga e'tibor qaratish imkonini beradi. Kesish ostida men sizga ushbu ramka qanday ishlashini va undan foydalangan holda taqsimlangan xizmatlarni qanday yozishni aytib beraman.

Muammo aynan nimada?

Bizda tarantula bor, bizda vshard bor - yana nimani xohlaysiz?

Birinchidan, bu qulaylik masalasi. Vshard konfiguratsiyasi Lua jadvallari orqali sozlangan. Bir nechta Tarantool jarayonlarining taqsimlangan tizimi to'g'ri ishlashi uchun konfiguratsiya hamma joyda bir xil bo'lishi kerak. Hech kim buni qo'lda qilishni xohlamaydi. Shuning uchun, barcha turdagi skriptlar, Ansible va tarqatish tizimlari qo'llaniladi.

Kartrijning o'zi vshard konfiguratsiyasini boshqaradi, u buni uning asosida amalga oshiradi o'zining taqsimlangan konfiguratsiyasi. Bu aslida oddiy YAML fayli bo'lib, uning nusxasi har bir Tarantool misolida saqlanadi. Soddalashtirish shundan iboratki, ramkaning o'zi uning konfiguratsiyasini nazorat qiladi va hamma joyda bir xil bo'lishini ta'minlaydi.

Ikkinchidan, bu yana qulaylik masalasidir. Vshard konfiguratsiyasi biznes mantig'ini rivojlantirishga hech qanday aloqasi yo'q va faqat dasturchini o'z ishidan chalg'itadi. Loyihaning arxitekturasini muhokama qilganda, biz ko'pincha alohida komponentlar va ularning o'zaro ta'siri haqida gapiramiz. Klasterni 3 ta ma'lumot markaziga tarqatish haqida o'ylashga hali erta.

Biz bu muammolarni qayta-qayta hal qildik va bir nuqtada biz dastur bilan ishlashni uning butun hayoti davomida soddalashtirgan yondashuvni ishlab chiqishga muvaffaq bo'ldik: yaratish, ishlab chiqish, sinovdan o'tkazish, CI/CD, texnik xizmat ko'rsatish.

Kartrij har bir Tarantool jarayoni uchun rol tushunchasini taqdim etadi. Rollar - bu ishlab chiquvchiga kod yozishga e'tibor qaratish imkonini beruvchi tushuncha. Loyihada mavjud bo'lgan barcha rollar bitta Tarantool misolida ishga tushirilishi mumkin va bu testlar uchun etarli bo'ladi.

Tarantool kartridjining asosiy xususiyatlari:

  • avtomatlashtirilgan klaster orkestratsiyasi;
  • yangi rollar yordamida ilovaning funksionalligini kengaytirish;
  • ishlab chiqish va joylashtirish uchun dastur shabloni;
  • o'rnatilgan avtomatik parchalanish;
  • Luatest test tizimi bilan integratsiya;
  • WebUI va API yordamida klasterlarni boshqarish;
  • qadoqlash va joylashtirish vositalari.

Salom Dunyo!

Men ramkaning o'zini ko'rsatishni kuta olmayman, shuning uchun biz arxitektura haqidagi hikoyani keyinroq qoldiramiz va oddiy narsadan boshlaymiz. Agar biz Tarantool-ning o'zi allaqachon o'rnatilgan deb hisoblasak, unda faqat qilish kerak

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

Ushbu ikkita buyruq buyruq qatori yordamchi dasturlarini o'rnatadi va shablondan birinchi ilovangizni yaratishga imkon beradi:

$ cartridge create --name myapp

Va biz buni olamiz:

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/

Bu tayyor “Salom, dunyo!” ga ega git ombori. ilova. Keling, bog'liqliklarni (shu jumladan, ramkaning o'zi) o'rnatgan holda, uni darhol ishga tushirishga harakat qilaylik:

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

Shunday qilib, bizda kelajakdagi shard ilovasi uchun ishlaydigan bitta tugun mavjud. Qiziquvchan oddiy odam darhol veb-interfeysni ochib, sichqoncha yordamida bitta tugun klasterini sozlashi va natijadan zavqlanishi mumkin, ammo quvonishga hali erta. Hozircha dastur foydali hech narsa qila olmaydi, shuning uchun men sizga keyinroq joylashtirish haqida aytib beraman, ammo endi kod yozish vaqti keldi.

Ilovalarni ishlab chiqish

Tasavvur qiling-a, biz kuniga bir marta ma'lumotlarni olish, saqlash va hisobot tuzish kerak bo'lgan loyihani ishlab chiqmoqdamiz.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Biz diagramma chizishni boshlaymiz va unga uchta komponentni joylashtiramiz: shlyuz, saqlash va rejalashtiruvchi. Biz yana arxitektura ustida ishlayapmiz. Biz vshardni saqlash sifatida ishlatganimiz uchun biz sxemaga vshard-router va vshard-storage qo'shamiz. Na shlyuz, na rejalashtiruvchi xotiraga to'g'ridan-to'g'ri kira olmaydi; marshrutizator aynan shu maqsadda yaratilgan.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Ushbu diagramma hali ham loyihada nima qurishimizni aniq ko'rsatmaydi, chunki komponentlar mavhum ko'rinadi. Hali ham bu haqiqiy Tarantoolga qanday prognoz qilinishini ko'rishimiz kerak - keling, komponentlarimizni jarayon bo'yicha guruhlaymiz.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Vshard-router va shlyuzni alohida misollarda saqlashning ma'nosi yo'q. Agar bu allaqachon yo'riqnoma mas'uliyati bo'lsa, nega biz tarmoqni yana bir bor kezishimiz kerak? Ular bir xil jarayon doirasida bajarilishi kerak. Ya'ni, shlyuz va vshard.router.cfg ikkalasi ham bir jarayonda ishga tushiriladi va ular mahalliy darajada o'zaro ta'sir qilishlariga imkon beradi.

Dizayn bosqichida uchta komponent bilan ishlash qulay edi, lekin men ishlab chiquvchi sifatida kodni yozish paytida Tarnatool-ning uchta nusxasini ishga tushirish haqida o'ylamoqchi emasman. Men testlarni o'tkazishim va shlyuzni to'g'ri yozganimni tekshirishim kerak. Yoki men hamkasblarimga biror xususiyatni namoyish qilmoqchiman. Nega men uchta nusxani joylashtirish bilan shug'ullanishim kerak? Shunday qilib, rollar tushunchasi paydo bo'ldi. Rol - bu oddiy luash moduli bo'lib, uning hayot aylanishi Kartrij tomonidan boshqariladi. Ushbu misolda ulardan to'rttasi bor - shlyuz, yo'riqnoma, saqlash, rejalashtiruvchi. Boshqa loyihada ko'proq bo'lishi mumkin. Barcha rollarni bitta jarayonda bajarish mumkin va bu etarli bo'ladi.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Va sahnalashtirish yoki ishlab chiqarishga joylashtirish haqida gap ketganda, biz har bir Tarantool jarayoniga apparat imkoniyatlariga qarab o'z rollarini tayinlaymiz:

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Topologiyani boshqarish

Qaysi rollar qayerda ishlayotgani haqidagi ma'lumot biror joyda saqlanishi kerak. Va bu "biror joyda" men yuqorida aytib o'tgan taqsimlangan konfiguratsiyadir. Undagi eng muhim narsa klaster topologiyasi. Mana 3 ta Tarantool jarayonining 5 ta replikatsiya guruhi:

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Biz maʼlumotlarni yoʻqotmoqchi emasmiz, shuning uchun biz ishlaydigan jarayonlar haqidagi maʼlumotlarga ehtiyotkorlik bilan munosabatda boʻlamiz. Ultrium ikki fazali majburiyat yordamida konfiguratsiyani kuzatib boradi. Konfiguratsiyani yangilamoqchi bo'lganimizdan so'ng, u birinchi navbatda barcha nusxalar mavjudligini va yangi konfiguratsiyani qabul qilishga tayyorligini tekshiradi. Shundan so'ng, ikkinchi bosqich konfiguratsiyani qo'llaydi. Shunday qilib, agar bitta nusxa vaqtincha mavjud bo'lmasa ham, hech qanday yomon narsa bo'lmaydi. Konfiguratsiya oddiygina qo'llanilmaydi va siz xatoni oldindan ko'rasiz.

Shuningdek, topologiya bo'limida har bir replikatsiya guruhining etakchisi kabi muhim parametr ko'rsatilgan. Odatda bu yozib olinadigan nusxadir. Qolganlari ko'pincha faqat o'qish uchun mo'ljallangan, ammo istisnolar bo'lishi mumkin. Ba'zida jasur ishlab chiquvchilar to'qnashuvlardan qo'rqmaydilar va ma'lumotlarni bir nechta replikalarga parallel ravishda yozishlari mumkin, ammo ba'zi operatsiyalar mavjud, ular nima bo'lishidan qat'i nazar, ikki marta bajarilmasligi kerak. Buning uchun rahbarning belgisi bor.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Rollarning hayoti

Bunday arxitekturada mavhum rol mavjud bo'lishi uchun ramka ularni qandaydir tarzda boshqarishi kerak. Tabiiyki, nazorat Tarantool jarayonini qayta boshlamasdan sodir bo'ladi. Rollarni boshqarish uchun 4 ta qayta qo'ng'iroq mavjud. Kartrijning o'zi ularni tarqatilgan konfiguratsiyada nima yozilganiga qarab chaqiradi va shu bilan konfiguratsiyani muayyan rollarga qo'llaydi.

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

Har bir rolning vazifasi bor init. Rol yoqilganda yoki Tarantool qayta ishga tushirilganda u bir marta chaqiriladi. U erda, masalan, box.space.create ishga tushirish qulay yoki rejalashtiruvchi ma'lum vaqt oralig'ida ishni bajaradigan ba'zi fon tolasini ishga tushirishi mumkin.

Bitta funktsiya init yetarli bo‘lmasligi mumkin. Ultrium rollarga topologiyani saqlash uchun foydalanadigan taqsimlangan konfiguratsiyadan foydalanish imkonini beradi. Xuddi shu konfiguratsiyada yangi bo'limni e'lon qilishimiz va unda biznes konfiguratsiyasining bir qismini saqlashimiz mumkin. Mening misolimda, bu ma'lumotlar sxemasi yoki rejalashtiruvchi roli uchun jadval sozlamalari bo'lishi mumkin.

Klaster qo'ng'iroqlari validate_config и apply_config har safar taqsimlangan konfiguratsiya o'zgarganda. Konfiguratsiya ikki fazali majburiyat tomonidan qo'llanilganda, klaster har bir rol ushbu yangi konfiguratsiyani qabul qilishga tayyorligini tekshiradi va agar kerak bo'lsa, foydalanuvchiga xato haqida xabar beradi. Agar hamma konfiguratsiya normal ekanligiga rozi bo'lsa, u holda apply_config.

Rollarning ham usuli bor stop, bu rolning chiqishini tozalash uchun kerak. Agar biz ushbu serverda rejalashtiruvchi endi kerak emas desak, u o'zi boshlagan tolalarni to'xtatishi mumkin init.

Rollar bir-biri bilan o'zaro ta'sir qilishi mumkin. Biz Lua-da funktsiya chaqiruvlarini yozishga odatlanganmiz, lekin ma'lum bir jarayon bizga kerakli rolga ega bo'lmasligi mumkin. Tarmoq orqali qo'ng'iroqlarni osonlashtirish uchun biz Tarantool-ga o'rnatilgan standart netbox asosida qurilgan rpc (masofaviy protsedura chaqiruvi) yordamchi modulidan foydalanamiz. Bu, masalan, sizning shlyuzingiz rejalashtiruvchidan ishni bir kun kutmasdan, hoziroq bajarishni so'ramoqchi bo'lsa, foydali bo'lishi mumkin.

Yana bir muhim nuqta - xatolarga chidamlilikni ta'minlash. Kartrij sog'lig'ini kuzatish uchun SWIM protokolidan foydalanadi [4]. Muxtasar qilib aytganda, jarayonlar UDP orqali bir-biri bilan "mish-mishlar" almashadi - har bir jarayon qo'shnilariga so'nggi yangiliklarni aytib beradi va ular javob berishadi. Agar to'satdan javob kelmasa, Tarantool nimadir noto'g'ri ekanligidan shubhalana boshlaydi va bir muncha vaqt o'tgach, u o'limni o'qiy boshlaydi va bu yangilik atrofidagi hammaga ayta boshlaydi.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Ushbu protokolga asoslanib, Kartrij avtomatik ravishda nosozliklarni qayta ishlashni tashkil qiladi. Har bir jarayon o'z muhitini kuzatib boradi va agar rahbar to'satdan javob berishni to'xtatsa, replika o'z rolini o'z zimmasiga olishi mumkin va Kartrij ishlaydigan rollarni mos ravishda sozlaydi.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Bu erda ehtiyot bo'lishingiz kerak, chunki tez-tez oldinga va orqaga o'tish replikatsiya paytida ma'lumotlar to'qnashuviga olib kelishi mumkin. Albatta, tasodifiy avtomatik o'zgartirishni yoqmasligingiz kerak. Biz nima sodir bo'layotganini aniq tushunishimiz kerak va rahbar qayta tiklanganidan va toj unga qaytarilgandan keyin replikatsiya buzilmasligiga ishonch hosil qilishimiz kerak.

Bularning barchasidan siz rollar mikroservislarga o'xshashligini his qilishingiz mumkin. Qaysidir ma'noda, ular Tarantool jarayonlaridagi modullar sifatida. Ammo bir qator asosiy farqlar ham mavjud. Birinchidan, barcha loyiha rollari bir xil kod bazasida yashashi kerak. Va barcha Tarantool jarayonlari bir xil kod bazasidan ishga tushirilishi kerak, shunda biz rejalashtiruvchini ishga tushirishga urinayotganimizda kutilmagan hodisalar bo'lmaydi, lekin u oddiygina mavjud emas. Bundan tashqari, siz kod versiyalarida farqlarga yo'l qo'ymasligingiz kerak, chunki bunday vaziyatda tizimning xatti-harakatlarini oldindan aytish va tuzatish juda qiyin.

Dockerdan farqli o'laroq, biz shunchaki "tasvir" rolini olib, uni boshqa mashinaga o'tkaza olmaymiz va u erda ishga tushira olmaymiz. Bizning rollarimiz Docker konteynerlari kabi izolyatsiya qilingan emas. Bundan tashqari, biz bir misolda ikkita bir xil rolni bajara olmaymiz. Rol bor yoki yo'q; qaysidir ma'noda bu yakkalik. Va uchinchidan, rollar butun replikatsiya guruhida bir xil bo'lishi kerak, chunki aks holda bu bema'ni bo'lar edi - ma'lumotlar bir xil, ammo konfiguratsiya boshqacha.

Joylashtirish vositalari

Men Cartridge ilovalarni joylashtirishga qanday yordam berishini ko'rsatishga va'da berdim. Boshqalar uchun hayotni osonlashtirish uchun ramka RPM paketlarini to'playdi:

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

O'rnatilgan paket sizga kerak bo'lgan deyarli hamma narsani o'z ichiga oladi: dastur ham, o'rnatilgan bog'liqliklar ham. Tarantool ham RPM paketiga bog'liqlik sifatida serverga keladi va bizning xizmatimiz ishga tushirishga tayyor. Bu systemd orqali amalga oshiriladi, lekin avval siz ozgina konfiguratsiya yozishingiz kerak. Hech bo'lmaganda har bir jarayonning URI-ni belgilang. Masalan, uchtasi etarli.

$ 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

Bu erda qiziqarli nuance bor. Faqat ikkilik protokol portini ko'rsatish o'rniga, biz jarayonning butun umumiy manzilini, shu jumladan xost nomini ham belgilaymiz. Bu klaster tugunlari bir-biriga qanday ulanishni bilishi uchun kerak. Advertise_uri manzili sifatida 0.0.0.0 dan foydalanish yomon fikr; u rozetkaga ulanish emas, balki tashqi IP manzil bo'lishi kerak. Busiz, hech narsa ishlamaydi, shuning uchun Kartrij sizga noto'g'ri advertise_uri bilan tugunni ishga tushirishga ruxsat bermaydi.

Endi konfiguratsiya tayyor, siz jarayonlarni boshlashingiz mumkin. Oddiy tizim bloki bir nechta jarayonni ishga tushirishga imkon bermaganligi sababli, Kartrijdagi ilovalar deb ataladigan dastur tomonidan o'rnatiladi. quyidagicha ishlaydigan instantsiyalangan birliklar:

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

Konfiguratsiyada biz Kartrij veb-interfeysga xizmat ko'rsatadigan HTTP portini ko'rsatdik - 8080. Keling, unga o'tamiz va ko'rib chiqamiz:

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

Garchi jarayonlar ishlayotgan bo'lsa-da, ular hali sozlanmaganligini ko'ramiz. Kartrij hali kimni kim bilan takrorlash kerakligini bilmaydi va o'z-o'zidan qaror qabul qila olmaydi, shuning uchun u bizning harakatlarimizni kutmoqda. Ammo bizda ko'p tanlov yo'q: yangi klasterning hayoti birinchi tugunning konfiguratsiyasi bilan boshlanadi. Keyin biz boshqalarni klasterga qo'shamiz, ularga rollarni tayinlaymiz va shu nuqtada joylashtirishni muvaffaqiyatli yakunlangan deb hisoblash mumkin.

Keling, bir stakan sevimli ichimlikni quying va uzoq ish haftasidan keyin dam olaylik. Ilovadan foydalanish mumkin.

Tarantool kartriji: Lua orqa qismini uchta qatorga bo'lish

natijalar

Natijalar qanday? Sinab ko'ring, foydalaning, fikr-mulohaza qoldiring, Github-da chiptalar yarating.

Manbalar

[1] Tarantool » 2.2 » Ma'lumotnoma » Tog' jinslari ma'lumotnomasi » Modul vshard

[2] Tarantool asosida Alfa-Bank investitsiya biznesining asosini qanday amalga oshirdik

[3] Yangi avlod billing arxitekturasi: Tarantool-ga o'tish bilan transformatsiya

[4] SWIM - klaster qurish protokoli

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/kartrij

Manba: www.habr.com

a Izoh qo'shish