SaaS mahsuloti bitta tizimdan ko‘plab mijozlarga xizmat qiladi. Har bir mijoz, ya’ni ijarachi (tenant), faqat o‘z ma’lumotlarini ko‘rishni, boshqalar nima qilayotganidan qat’i nazar barqaror ishlashni va o‘z ma’lumotlari boshqalarga ta’sir qilmasdan tiklanishi yoki o‘chirilishini kutadi. Multi-tenant arxitektura shu va’dalarni haqiqatga aylantiradigan qarorlar majmui.
Bu qarorlarning aksariyati boshida arzon, keyinroq qimmat. Ushbu maqolada asosiy izolyatsiya modellari, ularni mustahkamlaydigan ma’lumotlar bazasi imkoniyatlari, shovqinli qo‘shnilar muammosi, tizimning ko‘pincha unutiladigan qismlari va mahsulot ishga tushgandan keyin yo‘nalishni qanday o‘zgartirish ko‘rib chiqiladi.
Multi-tenancy amalda nimani anglatadi
Ijarachi ma’lumotlarga egalik qiladigan va pul to‘laydigan birlik: odatda kompaniya, ba’zan jamoa yoki ish maydoni (workspace). Bitta ijarachida ko‘plab foydalanuvchilar bo‘ladi, bitta foydalanuvchi esa bir nechta ijarachiga tegishli bo‘lishi mumkin, masalan, bir necha mijozning ish maydonlarida ishlaydigan konsultant.
Izolyatsiyaning uch tomoni bor:
- Ma’lumotlar izolyatsiyasi. Hech bir so‘rov, hisobot, eksport yoki qidiruv boshqa ijarachining yozuvlarini qaytarmaydi.
- Unumdorlik izolyatsiyasi. Bir ijarachining og‘ir yuklamasi boshqalarni sekinlashtirmaydi.
- Operatsion izolyatsiya. Bitta ijarachini alohida zaxiralash, tiklash, migratsiya qilish, ko‘chirish yoki o‘chirish mumkin.
Quyidagi izolyatsiya modellari shu uchtasini xarajat va ekspluatatsiya mehnati bilan muvozanatlaydi.
Ijarachilar ma’lumotlarini ajratishning uch usuli
Ijarachi identifikatoriga ega umumiy sxema
Barcha ijarachilarning qatorlari bir xil jadvallarda saqlanadi va har bir qatorda tenant_id ustuni bo‘ladi. Har bir so‘rov shu ustun bo‘yicha filtrlanadi.
Bu yuritish eng arzon va ko‘plab kichik ijarachilarga masshtablash eng oson model. Bitta migratsiya hammani yangilaydi, barcha ijarachilar bo‘yicha umumiy hisobot tuzish oson. Xavf ham oddiy: bitta unutilgan filtr ma’lumotlarni sizdiradi. Izolyatsiya kod bazasidagi har bir so‘rov to‘g‘ri bo‘lishiga bog‘liq, shuning uchun u ehtiyotkorlik bilan emas, tuzilma bilan ta’minlanishi kerak.
Har bir ijarachi uchun alohida sxema
Har bir ijarachi bitta ma’lumotlar bazasi ichida o‘z sxemasini (jadvallar nomlar fazosini) oladi. So‘rovlar ijarachining sxemasida bajariladi, shuning uchun unutilgan filtr boshqa ijarachining jadvallariga yeta olmaydi.
Izolyatsiya kuchliroq, bitta ijarachini tiklash yoki eksport qilish osonroq. Xarajatlar ijarachilar soni bilan keladi. Migratsiyalar har bir sxema uchun alohida bajarilishi kerak va yarmida to‘xtab qolgan migratsiya ijarachilarni turli versiyalarda qoldiradi. Minglab sxemalar connection pool va ma’lumotlar bazasi katalogiga og‘ir yuk bo‘ladi. Bu model minglab kichik ijarachilarga emas, o‘nlab yoki yuzlab yirik ijarachilarga ega mahsulotlarga ko‘proq mos keladi.
Har bir ijarachi uchun alohida ma’lumotlar bazasi
Har bir ijarachi o‘z ma’lumotlar bazasini, ba’zan o‘z serverini oladi. Bu uchala tomonda eng kuchli izolyatsiyani beradi: alohida unumdorlik, alohida zaxira nusxalar, ijarachi ma’lumotlarini muayyan mintaqada joylashtirish imkoni va mijozning xavfsizlik tekshiruviga aniq javob.
Shu bilan birga, uni yuritish eng qimmat. Har bir bazani yaratish, kuzatish, zaxiralash va migratsiya qilish kerak, shuning uchun bu model faqat puxta avtomatlashtirish bilan ishlaydi. U kam sonli yirik yoki tartibga solinadigan mijozlarga mos keladi va ko‘p mahsulotlar uni umumiy infratuzilma ustidan premium tarif sifatida taklif qiladi.
Xavfsizlik to‘ri sifatida qator darajasidagi xavfsizlik
Umumiy sxema modelida ijarachi filtrini ma’lumotlar bazasining o‘zi majburiy qilishi mumkin. PostgreSQLdagi qator darajasidagi xavfsizlik (row-level security) jadvalga siyosat biriktirish imkonini beradi, shunda sessiya faqat joriy ijarachisiga mos qatorlarni ko‘radi. Joriy ijarachi odatda ilova har bir so‘rov boshida o‘rnatadigan sessiya sozlamasidan o‘qiladi.
Bu unutilgan WHERE shartini ma’lumotlar sizib chiqishidan bo‘sh natijaga aylantiradi. Himoya ishlashi uchun bir necha qoida bor:
- Ilova siyosatlarni chetlab o‘ta olmaydigan rol bilan ulanadi. Jadval egalari va superfoydalanuvchilar sukut bo‘yicha ularni chetlab o‘tadi.
- Ijarachi sozlamasi har bir tranzaksiya uchun o‘rnatiladi va keyin tozalanadi, shunda pooldan olingan ulanish bir ijarachi kontekstini keyingi so‘rovga olib o‘tmaydi.
- Siyosatlar ijarachiga tegishli har bir jadvalni qamraydi va sinov bunday jadvallarning birortasi siyosatsiz qolmaganini tekshiradi.
Qator darajasidagi xavfsizlik yagona emas, ikkinchi himoya chizig‘i. Ma’lumotlarga kirish qatlami baribir har bir so‘rovni ijarachi bo‘yicha cheklashi kerak, shunda biror narsa sizib chiqishi uchun ikkalasi ham ishdan chiqishi kerak bo‘ladi.
Shovqinli qo‘shnilar
Har qanday umumiy modelda ijarachilar bir xil protsessor, xotira, ulanishlar va disk uchun raqobatlashadi. Katta import yoki qimmat hisobotni ishga tushirgan bitta ijarachi mahsulotni hamma uchun sekinlashtirishi mumkin.
Himoya bir necha qatlamdan iborat:
- Har bir ijarachi uchun so‘rovlar chegarasi va kvotalar API chaqiruvlari, fon vazifalari va saqlash hajmi uchun, uning tarifiga bog‘langan holda.
- Adolatli navbatlar fon ishlari uchun, shunda bir ijarachining to‘planib qolgan vazifalari qolganlarni navbatda kutib qoldirmaydi.
- So‘rovlar byudjeti: taymautlar, sahifalash chegaralari va ijarachi identifikatoridan boshlanadigan indekslar.
- Har bir ijarachi bo‘yicha metrikalar, shunda faqat tizim sekinlashganini emas, kim nimadan foydalanayotganini ko‘rasiz.
- Chiqish yo‘li: og‘ir ijarachini kodni o‘zgartirmasdan alohida bazaga yoki alohida resurslar guruhiga ko‘chirish imkoni.