Memtable — Log-Structured Merge-tree asosidagi saqlash tizimida yangi yozuvlar avval joylashtiriladigan, operativ xotirada saqlanuvchi va odatda kalit bo‘yicha tartiblangan ma’lumot tuzilmasidir. U diskka har bir kichik o‘zgarishni darhol tasodifiy yozish o‘rniga, ko‘plab yozuvlarni xotirada jamlab, keyin ularni tartibli fayl ko‘rinishida chiqarishga imkon beradi. Memtable tezkor yozish yo‘lining muhim qismi bo‘lsa-da, mustaqil ravishda bardoshli saqlash vositasi emas.
Yozish yo‘lidagi o‘rni
Mijoz put, update yoki delete amalini yuborganda tizim ko‘pincha avval o‘zgarishni write-ahead logga qayd etadi. Log yozuvi diskda ishonchli tasdiqlangach, o‘zgarish memtablega qo‘shiladi. Shu ketma-ketlik elektr uzilishi yoki jarayon to‘xtashi holatida xotiradagi ma’lumotni logdan qayta tiklash imkonini beradi.
Memtable belgilangan hajmga yetganda odatda o‘zgarmas holatga o‘tkaziladi. Yangi yozuvlar boshqa faol memtablega yo‘naltiriladi, eski tuzilma esa fon jarayoni tomonidan diskdagi tartiblangan SSTable fayliga chiqariladi. Bu amal flush deb ataladi. Flush muvaffaqiyatli tugagach, tegishli log qismlari endi tiklash uchun zarur bo‘lmasa, qayta ishlanishi yoki o‘chirilishi mumkin.
Ichki tuzilma
Memtable kalitlarni tartibli saqlashi kerak, chunki diskka chiqariladigan fayl ham tartiblangan bo‘ladi. Amaliy tizimlar skip list, muvozanatlangan daraxt, radix daraxt yoki maxsus indekslangan massivdan foydalanishi mumkin. Tanlov quyidagi xususiyatlarga ta’sir qiladi:
- bitta yozuvni qo‘shish va topish narxi;
- kalitlar oralig‘ini ketma-ket o‘qish tezligi;
- har bir element uchun xizmat xotirasi;
- parallel oqimlar orasidagi sinxronlash xarajati;
- o‘zgarmas nusxani flush qilish qulayligi.
Bir kalit bir necha marta yangilansa, ayrim tuzilmalar faqat eng yangi qiymatni saqlaydi, boshqalari esa versiyalarni saqlash siyosatiga mos ravishda bir nechta yozuvni tutishi mumkin. O‘chirish ham qiymatni darhol yo‘qotish emas, balki tombstone qo‘shish orqali ifodalanadi.
O‘qish va ko‘rinuvchanlik
O‘qish amali faqat diskdagi SSTable fayllarini tekshirsa, hali flush qilinmagan yangi qiymatlarni ko‘rmaydi. Shu sababli qidiruv avval faol va o‘zgarmas memtablelarni, keyin kesh hamda disk qatlamlarini tekshiradi. Bir kalit turli qatlamlarda uchrasa, ketma-ketlik raqami yoki vaqt belgisi eng yangi ko‘rinadigan versiyani aniqlaydi.
Range scan paytida memtable natijalari diskdagi tartiblangan oqimlar bilan birlashtiriladi. Snapshot ishlatilsa, so‘rov boshlangan vaqtdan keyingi o‘zgarishlar natijaga kiritilmasligi kerak. Demak, xotiradagi tuzilma tezkor bo‘lish bilan birga, tizimning versiyalash va izolyatsiya qoidalariga ham mos ishlaydi.
Xotira chegarasi va bosim
Memtable cheksiz o‘sa olmaydi. Hajm chegarasi juda kichik bo‘lsa, tez-tez flush qilish ko‘p mayda SSTable yaratadi va keyingi compaction ishini oshiradi. Juda katta chegara esa xotira sarfini, tiklash vaqtini va bir martalik flush yukini ko‘paytiradi. Bir vaqtning o‘zida bir nechta ustun oilasi yoki shard faol bo‘lsa, umumiy xotira hisobini alohida nazorat qilish zarur.
Disk flush tezligidan yozish tezligi yuqori bo‘lib qolsa, o‘zgarmas memtablelar navbati ortadi. Tizim bunday vaziyatda yozuvlarni sekinlashtirishi, vaqtincha to‘xtatishi yoki xotira yetishmovchiligiga uchrashi mumkin. Amaliy kuzatuvda faol memtable hajmi, flush davomiyligi, navbatdagi o‘zgarmas tuzilmalar soni, WAL hajmi va yozish kechikishi birgalikda baholanadi.
Memtable o‘lchovi faqat kalit va qiymat baytlaridan iborat bo‘lmasligi mumkin. Daraxt ko‘rsatkichlari, allocator fragmentatsiyasi va versiya metama’lumoti real xotira sarfini oshiradi. Shu bois limitni rezident xotira metrikalari bilan solishtirish zarur.
Bog‘liq tushunchalar
Log-Structured Merge-tree, Write-ahead log, SSTable, Compaction, Flush, Tombstone, Write amplification