BASE vs ACID

All lectures for UZ purposes
Daraja, Dars
Mavjud

6.1 Qisqartmalar jangi: BASE va ACID

Kimyoda pH suv eritmasining nisbiy kislotaliligini o'lchaydi.
pH shkalasi 0 dan (juda kislotali) 14gacha (juda ishqoriy) o'zgaradi;
sof suv 25°C da pH 7 ga ega va neytraldir.

Muhandislar bu metoforani tranzaksiyalar ishonchliligiga ko'ra ma'lumotlar bazalarini taqqoslash uchun oldilar.
Ma'lumotlar bazasi "ishqoriy" ("BASE")ga yaqinlashganda, tranzaksiyalar kamroq ishonchli.

MySQL kabi mashhur relyatsion ma'lumotlar bazalari ACID asosida paydo bo‘ldi. So'nggi o'n yil ichida NoSQL deb nomlangan ma'lumotlar bazalari paydo bo'ldi, ular turli xil ma'lumotlar bazalarini birlashtiradi. Ular ACID bo'lmasa ham yaxshi ishlaydi. Ko'p dasturchilar NoSQL bilan ishlaydi va tranzaksiyalar va ularning ishonchliligi haqida o‘ylashmaydi. Ular to'g'rimi, buni tushunib olaylik.

NoSQL haqida umumiy gapirish noto'g'ri, chunki bu shunchaki yaxshi abstraktsiya. NoSQL ma'lumotlar bazalari bir-biridan ma'lumotlarni saqlash subsistemalari va ma'lumotlar modellarining dizayni bo'yicha farq qiladi: masalan, CouchDB hujjat-orientatsiz, Neo4J graf-orientatsiz. Lekin, tranzaksiyalar kontekstida ular odatda bir jihatga o‘xshaydi: ular atomiklik va izolyatsiya cheklangan versiyalarini taqdim etadi, ya'ni ular ACID kafolatlarni ta'minlamaydi. Nima deyilayotganini tushunish uchun, ular ACID taqdim etmasa, nimani taklif qilayotganini tushunib olaylik? Hech narsa yo'qmi?

Tugri emas. Ular o'zlarini jozibador ko'rinishda sotishlari kerak. Ular o'z qisqartmasini o'ylab topdilar - BASE.

6.2 BASE antogonist sifatida

Bu yerda yana harf tartibini buzib, asosiy atama – consistency bilan boshlayman. Bu atama ACID konsistensiyasi bilan kam umumiylikka ega. Muammo, u juda ko'p kontekstlarda ishlatiladi. Biroq, bu konsistensiya kengroq qo'llanilishi bor va aynan bu tarqatilgan tizimlar haqida gap ketganda nazarda tutiladi.

Yuqorida gapirganimiz relyatsion ma'lumotlar bazalari tranzaksiyalar izolyatsiyasining turli darajalarini taqdim etadi. Eng qattiqlari, bir tranzaksiya boshqa tranzaksiya tomonidan amalga oshirilgan noto'g'ri o'zgarishlarni ko'ra olmasligini kafolatlaydi.

Masalan, agar siz do'kon kassasida tursangiz va shu paytda sizning hisobingizdan kvartplata uchun pul yechilsa, va kvartplata uchun pul o'tkazish tranzaksiyasi muvaffaqiyatsiz bo'lsa va sizning hisobingiz avvalgi holatga qaytsa (pul olinmasa), sizning kassa to'lovi tranzaksiyasi bu harakatlarni sezmaydi. Bu tranzaksiyalar izolyatsiyasi talablariga muvofiq, noto‘g‘ri tranzaksiyaning vaqtinchalik o‘zgarishlari boshqa tranzaksiyalar tomonidan ko‘rilishi mumkin emasligi bilan bog'liq.

Ko'p NoSQL ma'lumotlar bazalari izolyatsiya kafolati berishdan voz kechadi va "yakuniy konsistensiya" (eventual consistency) ni taklif qiladi, bu oxir-oqibat siz haqiqiy ma'lumotlarni olishingiz mumkinligini anglatadi, lekin tranzaksiyangiz noto'g'ri qiymatlarni o'qish ehtimoli bor - ya'ni vaqtinchalik, qisman yangilangan yoki eskirgan. Ma'lumotlar o'qish paytida, "teng kelishgan holda" (lazily at read time) kelishgan bo'lishi mumkin.

NoSQL real vaqt rejimida tahlil qilish uchun yaratilgan, va ko'proq tezlikka erishish uchun, ular konsistensiyani qurbon qildi. Eric Brewer, aynan BASE atamasini o'ylab topgan odam, "CAP teoremasi"ni formula qildi, unga ko'ra:

Tarqatilgan hisoblashlarni amalga oshirishda uchta xususiyatdan faqat ikkitasini ta'minlash mumkin:

  • ma'lumotlarni kelishishi (consistency) — turli tugunlardagi (instances) ma'lumotlar bir-biriga zid emas;
  • mavjudlik (availability) — tarqatilgan tizimga har qanday so'rov noto'g'ri javob bilan tugallanadi, lekin tizimning barcha tugunlari bir xil javoblar ko'rsatadi kafolatga ega emas;
  • bo'linishga/taqsimlanishga chidamlilik (partition tolerance) — Tugunlar orasida aloqa bo'lmasa ham, ular mustaqil ishlashda davom etadilar.

CAP teoremasini oddiygina tushuntirish kerak bo'lsa, mana u:

Ba'zi nuqtai nazarlar CAP teoremasi ishlamaydi yoki u yetarlicha aniq tuzilmagan, deb hisoblaydi. Shunga qaramay, NoSQL ma'lumotlar bazalari ko'pincha CAP teoremasi doirasida konsistensiyadan voz kechadi. Bu ma'lumotlar klasterning bir necha nusxalarida yangilangan, ammo o'zgarishlar hali barcha nusxalarda sinxronizatsiya qilinmaganligini anglatadi. Masalan, DynamoDB sizning o'zgarishlaringiz durable bo'lib qolgan va siz HTTP 200 olgansiz, deb bildira oladi, ammo o'zgarishlar faqat 10 soniyadan keyin ko'rinadi. Dasturchilarning kundalik hayotidan yana bir misol — bu domen nomlari tizimi (DNS), http(s) manzillarini IP-manzillarga aylantiradi.

Yangilangan DNS yozuvi kesh intervali sozlamalariga ko'ra serverlarda tarqatiladi, shuning uchun yangilanishlar tezda sezilmaydi. Shu bilan, vaqtinchalik kelishmovchilik (yakunida kelishishga olib keluvchi) MySQL kabi relyatsion ma'lumotlar bazalarining klasterida ham yuzaga kelishi mumkin, chunki bu konsistensiya ACID bilan bog'liq emas. Shuning uchun bir necha nusxadagi klasterda SQL va NoSQL haqiqiy farq qilmaydi, deyish noto'g'ri bo'ladi.

Bundan tashqari, yakuniy kelishilayotganlik yozuvlar so'rovlariga javob bermaslikka sabab bo'ladi: barcha ma'lumotlar yoziladi, ammo oxir-oqibat qabul qilingan qiymat so'nggi yozuv navbatida qabul qilingan qiymat emas.

NoSQL ma'lumotlar bazalari, ACID kafolatlarini taqdim etmasdan, "yumshoq holat" ("soft state") ni yakuniy kelishuv modeli natijasida oladi. Bu tizim holati hech qanday kirish ma'lumotlarisiz o'zgarishi mumkinligini anglatadi. Biroq, ulkan mavjudlikni ta'minlashga intiladi, "asosiy mavjudlik" deb ataladi. Ushbu uchta tushuncha - "asosiy mavjudlik" ("basically available"), "yumshoq holat" ("soft state") va "yakuniy kelishuv" ("eventual consistency") - BASE qisqartmasini tashkil qiladi. Ammo, bu ko'proq bo'sh marketing o'rash, ACIDga nisbatan, va dasturchilarni chalg'itadi. Shuning uchun izolyatsiya tushunchasiga qaytgan ma'qul.

6.3 BASE ma'lumotlar bazalari umuman ACID mezonlariga amal qilmaydimi?

ACID ma'lumotlar bazasi va non-ACID ma'lumotlar bazalari o'rtasidagi asosiy farq bu izolyatsiyadan voz kechishdir. Buni tushunish muhim. Ammo dokumentatsiyani o'qish va ularni Hermitage loyihasi bolalari kabi sinash kerak. Ma'lumotlar bazasi yaratuvchisi o'z bolasi ACIDmi yoki BASE, CAPmi yoki esa yo'qligini qanday atashidan qat'iy nazar, ma'lumotlar bazasi nima taqdim etadi shu muhim.

Agar ma'lumotlar bazasi yaratuvchilari u ACID kafolatlarini taqdim etadi, deb da'vo qilsalar, ehtimol bu asoslar bor. Ammo buni o'zingiz sinab ko'rganingiz yaxshi, bu haqiqatga qanchalik mos va nima darajada. Agar ular ularning ma'lumotlar bazasi bunday kafolatlar bermaydi deb da'vo qilsalar, bu turli narsalarni anglatishi mumkin.

  • Ma'lumotlar bazasi atomikligini kafolatlamaydi. Ammo ba'zi NoSQL ma'lumotlar bazalari atomik operatsiyalar uchun alohida API taqdim etadi (masalan, DynamoDB).
  • Ma'lumotlar bazasi izolyatsiyani kafolatlamaydi. Bu, masalan, ma'lumotlar yozuvda kelib tushganidan boshqa tartibda yozilishi mumkinligini anglatishi mumkin.

Turli ma'lumotlar bazalarini durability kafolati bo'yicha solishtirish uchun ma'lumotlar saqlash va qidirish uchun qanday strukturalar ishlatilishini bilish kerak. Ulardan ba'zilari ma'lumotlarni tezroq yozishga imkon beradi, boshqalari esa tezroq o'qishga. Ammo ma'lum bir ma'lumotlar strukturalari durability ni yuqori yoki past qiladi, deb aytib bo'lmaydi.

6.4 Turli ma'lumotlar bazalari ma'lumotlarni qanday indekslaydi va bu qanday qilib durabilityga ta'sir qiladi, va yana ko'p narsalar

Ma'lumotlarni saqlash va qidirish uchun ikkita asosiy yondashuv mavjud.

Ma'lumotlarni saqlash uchun fayl oxiriga operatsiyalar qo'shiladi, chunki barcha CRUD operatsiyalari jurnalga yoziladi. Tezkor qidiruv uchun indeks ishlatiladi - bu ma'lumotlar haqida metama'lumotlarni saqlaydigan struktura. Eng oddiy indeks bu xesh-jadval, u kalit va qiymatni bog'laydi. Qiymatlar - bu diskda saqlanadigan fayl-jurnalda ma'lumotlarning ofsetlari. Ushbu ma'lumotlar strukturasiga LSM-darbozlari deyiladi va xotirada saqlanadi, ma'lumotlar esa diskda saqlanadi.

Ehtimol, siz o'zingizdan so'radingiz: agar biz jurnalda harakatlarni yozsak, u juda katta bo'lmaydimi? Ha, shuning uchun har bir kalit uchun faqat eng dolzarb qiymatni qoldirish yoki o'chirish uchun siqish ("compaction") texnikasi o'ylab topilgan. Agar diska tartiblangan bir necha jurnallarni ishlatsak, SSTable ("sorted string table") deb ataladigan ma'lumotlar strukturasini yaratamiz, bu unumdorlikni oshiradi. Agar biz xotirada ma'lumotlarni tartibga solishga harakat qilsak, MemTable deb ataladigan jadvalni olamiz. Ammo eng oxirgi yozilgan ma'lumotlar (MemTableda bo'lgan, lekin hali diskka yozilmagan) fatal nosozlikda yo'qoladi. Mana bu LSM-darbozlari asosidagi ma'lumotlar bazasidagi durability muammosi.

Indeksatsiyaning boshqa yondashuvi B-darbozlari ("B-trees") asosida yotadi. B-darbozlarda ma'lumotlar diska belgilangan o‘lchamdagi bloklarda yoziladi. Ushbu ma'lumotlar bloklari 4 KB o‘lchamiga ega, va kalit-qiymat juftlari, kalit bo'yicha tartiblangan. Har bir B-darbozi tuguni, sahifa diapazonlariga linklar bilan massivni ifodalaydi. Massivda maksimal linklar soni filial koeffitsienti deb ataladi. Har bir sahifa diapazoni boshqa B-darbozi tuguni, boshqa sahifa diapazonlariga linklar bilan.

Oxir-oqibat, barg darajasida alohida sahifalarni topasiz. Bu g'oya past darajadagi dasturlash tillarida ko'rsatkichlarga o'xshaydi, faqat bu sahifa linklari xotirada emas, balki diskda saqlanadi. INSERTs va DELETEs amalga oshganda, ba'zi tugunlar filial koeffitsientiga moslashish uchun ikki bo'linishga bo'linishi mumkin. Agar ma'lumotlar bazasi biror sabablarga ko'ra jarayonning o'rtasida nosoz bo'lsa, ma'lumotlar butunligi buzilishi mumkin.

Buni oldini olish uchun, B-darbozlariga ega ma'lumotlar bazalari har bir tranzaksiyani qayd etadigan oldinda yozish jurnali ("write-ahead log", yoki WAL) ni olib boradi. Ushbu WAL B-darbozi holatini buzilish holatida qayta tiklash uchun ishlatiladi. Shuning uchun, B-darbozlariga ega ma'lumotlar bazalari durability bo'yicha yaxshiroq, deb aytish mumkin. Ammo, LSM asosidagi ma'lumotlar bazalari ham WAL kabi o'xshash funktsiyali faylni yuritishi mumkin. Shu sababli tanlangan ma'lumotlar bazasining ishlash mexanizmlarini diqqat bilan o'rganish kerak.

B-darbozlari haqida aytish mumkinki, ular tranzaksiyalarga mos keladi: har bir kalit indeksta faqat bitta joyda uchraydi, jurnal qilinadigan saqlash tizimlarida esa bir xil kalitning bir necha nusxalari turli segmentlarda bo'lishi mumkin (masalan, navbatdagi qisqartirilgan qadar).

Indeks dizayni ma'lumotlar bazasining samaradorligiga ta'sir qiladi. Diskka yozish LSM-ga o‘xshash tarzda ketma-ket amalga oshiriladi, B-darbozlarida esa bir qancha ko'plab tasodifiy kirishlarni chaqiradi. Bu LSM yozishni B-darbozlarga nisbatan tezroq qiladi, ayniqsa magnit qattiq diskda (HDD). O'qish esa LSM-da sekinroq bajariladi, chunki bir nechta ma'lumotlar strukturalari va SS-jadvallarni ko'rib chiqish kerak. Baza LSM bilan oddiy so'rov qilinganda, biz birinchi kalitni MemTableda qidiramiz, va keyin har bir SSTableni ketma-ket ko'rib chiqamiz. Agar kalit mavjud bo'lmasa, oxirida bilib olamiz.

LSM-darbozlari quyidagilarda ishlatiladi:

  • LevelDB
  • RocksDB
  • Cassandra
  • HBase

Bu hammasini shu qadar batafsil tushuntiraman, chunki ma'lumotlar bazasini tanlashda nimalarga e'tibor qaratish kerakligini tushunishlaringiz uchun: masalan, ma'lumotlarni ko'proq yozish yoki o'qish kerakmi. Shuningdek, ma'lumotlar modellaridagi farqlarni ko'rib chiqish lozim (graf-modellar ma'lumotlarni kezish imkonini beradimi? ma'lumotlarning turli birliklari o'rtasida qandaydir munosabat bormi? yozish yoki o'qishda turli sxemalarni ishlatish kerakmi?) va ma'lumotlarning ishonchliligi. Diskka yozuvchi har qanday ma'lumotlar bazasi yaxshi durability kafolatini taqdim etishi mumkin, lekin har bir bazani alohida tahlil qilish kerak.

6.5 In-memory DBlar qanday ishlaydi

Bu orada, diskka yozuvchi ma'lumotlar bazalaridan tashqari, xotira ma'lumotlar bazalari mavjud, ba'zida "in-memory" deb ataladi. Ular asosan RAM bilan ishlaydi va yuqori yozish va o'qish tezligi evaziga kamroq durability taklif etadi. Ko'p ilovalar uchun foydali bo'lishi mumkin, chunki javob vaqtiga ahamiyat bor. Misol tariqasida, bu qidirish so‘rovlari yoki katta hajmdagi ma’lumotlarni tezkor tahlil qilish uchun ishlatilishi mumkin.

Narsa shundaki, RAM uzoq vaqt diskdan qimmatroq edi, ammo kechani arzonlashib qoldi. Bu RAMdan ma'lumotlarni tez o'qish va yozish tufayli yangi turdagi ma'lumotlar bazalarining paydo bo'lishiga olib keldi. Savol: bu ma'lumotlar bazalarida ma'lumotlarning saqlanishi qanday? Dasturchilar ishonchni ta'minlash uchun turli mexanizmlarni taklif qiladilar.

  • Saqlash xotirasini, batareyalar bilan ishlaydigan xotira.
  • O'zgartirishlar jurnallarini diskka yozish (masalan, yuqorida aytib o'tilgan WAL kabi), lekin o'zlari ma'lumotlar emas.
  • Formatlar jurnallari kabi diskka yozib qo'yish (bu boshqa imkoniyatlardan foydalanmasdan holda kafolat bermaydi, lekin ishonchlilikni yaxshilaydi);
  • Xotira holatini boshqa mashinalarga ko'paytirish.

Masalan, Redis ma'lumotlar bazasi, odatda xabarlar qatori yoki kesh bo'lib foydalaniladi va ACIDdan uzoq davomiylikni ta'minlamaydi: u muvaffaqiyatli bajarilgan buyruq diskda saqlanishiga kafolat bermaydi, chunki Redis ma'lumotlarni diskka (agar bu yoqilgan bo'lsa) asenkron, vaqti-vaqti bilan saqlaydi.

Biroq, barcha ilovalar uchun bu muhim emas. Masalan, EtherPad - birgalikda foydalanish uchun onlayn-muharrir - 1-2 soniyada bir marta flush qilgan. Bu bir nechta harflar yoki so'zlarni yo'qotishiga olib kelishi mumkin, lekin bu tanqidiy emas. Redis yaxshi, chunki u disklar yordamida amalga oshirish qiyin bo'lgan ma'lumotlar modelini taklif qiladi. U shuningdek o'z navbatlari orqali tranzaksiyalarni bajarishga imkon beradi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION