Compaction — Log-Structured Merge-tree va unga yaqin saqlash tizimlarida diskdagi bir nechta tartiblangan faylni o‘qib, ularning amaldagi yozuvlarini yangi tartiblangan fayllarga birlashtirish jarayonidir. U takroriy versiyalarni kamaytiradi, yaroqsiz tombstonelarni shartlar bajarilganda olib tashlaydi va o‘qish vaqtida tekshiriladigan fayllar sonini nazorat qiladi. Jarayon ma’lumotning mantiqiy mazmunini o‘zgartirmasligi, snapshot va replikatsiya qoidalarini saqlashi kerak.
Birlashtirish mexanizmi
SSTable fayllari kalit bo‘yicha tartiblanganligi sababli compaction ularni bir nechta tartiblangan oqim sifatida o‘qiydi. Merge algoritmi har safar eng kichik navbatdagi kalitni tanlaydi. Bir kalitning bir necha versiyasi uchrasa, tizim ketma-ketlik raqami, vaqt belgisi va snapshotlarning eng eski chegarasiga qarab qaysi versiyalarni saqlashni aniqlaydi.
Natija odatda yangi fayllarga yoziladi. Ular to‘liq sinxronlanib, manifest yoki metadata atomar yangilangandan keyingina eski fayllar o‘qish yo‘lidan chiqariladi. Faol so‘rovlar eski faylga murojaat qilayotgan bo‘lsa, fayl darhol o‘chirilmaydi; havolalar tugagach bo‘shatiladi. Nosozlik yuz bersa, tizim eski yoki yangi to‘plamdan birini izchil tanlashi lozim.
Asosiy strategiyalar
Size-tiered compaction o‘xshash hajmdagi bir nechta faylni kattaroq faylga birlashtiradi. U ketma-ket yozishga qulay va ko‘pincha yozish o‘tkazuvchanligini yaxshi saqlaydi, ammo bir kalit oralig‘i bir nechta katta faylda takrorlanishi mumkin. Bu disk joyi hamda o‘qish kuchayishini oshiradi.
Leveled compaction ma’lumotni darajalarga ajratadi. Odatda yuqoriroq darajadagi fayllar kalit oralig‘i bo‘yicha o‘zaro kesishmaydi. Bir darajadan tanlangan fayl keyingi darajadagi kesishuvchi fayllar bilan qo‘shiladi. Natijada nuqtaviy qidiruv kamroq faylni tekshiradi, lekin bir bayt mantiqiy yozuv bir necha marta qayta yozilishi mumkin.
Universal, time-window va FIFO kabi siyosatlar ham mavjud. Time-window vaqt qatorlarida bir davrga tegishli fayllarni birga qayta ishlashga yordam beradi. FIFO esa ma’lum saqlash muddati yoki hajm chegarasidan chiqqan butun fayllarni o‘chirishi mumkin. To‘g‘ri strategiya ish yukining yozish, o‘qish, yangilash va vaqt bo‘yicha taqsimlanishiga bog‘liq.
Tombstone va snapshotlar
Tombstoneni ko‘rgan compaction uni har doim o‘chira olmaydi. Pastroq qatlamda eski qiymat qolgan bo‘lsa yoki boshqa replika o‘chirish belgisini hali olmagan bo‘lsa, belgini erta yo‘qotish o‘chirilgan ma’lumotning qayta paydo bo‘lishiga olib keladi. Taqsimlangan tizimlar ko‘pincha ta’mirlash va replikatsiya uchun xavfsiz muddat belgilaydi.
Uzoq yashovchi snapshot ham eski versiyalarni ushlab turadi. Snapshotga ko‘rinishi kerak bo‘lgan qiymatni olib tashlash izchillikni buzadi. Shuning uchun compactionning foydasi faqat algoritmga emas, snapshotlarning umri, TTL va replikatsiya holatiga ham bog‘liq.
Resurslar va boshqaruv
Compaction diskdan o‘qiydi, yangi nusxani yozadi, protsessor va keshdan foydalanadi. Juda agressiv ish foydalanuvchi so‘rovlarining kechikishini oshiradi; juda sust ish esa backlog, ko‘p SSTable, disk joyi bosimi va read amplification keltirib chiqaradi. Rejalashtiruvchi odatda tezlikni cheklash, ustuvorlik berish va parallel ishlar sonini boshqaradi.
Kuzatuvda kutilayotgan compaction baytlari, darajalar hajmi, fayllar soni, o‘qilgan va yozilgan baytlar nisbati, ish davomiyligi hamda write stall holatlari muhim. Sozlashda faqat o‘rtacha throughput emas, yuqori percentildagi so‘rov kechikishi va avariya paytidagi tiklanish uchun qoladigan disk zaxirasi ham hisobga olinadi.
Compaction natijasining to‘g‘riligi nazorat summalari, tartib invariantlari va namunaviy o‘qishlar bilan tekshiriladi. Fayl buzilishi aniqlansa, eski kirish fayllarini muddatidan oldin o‘chirmaslik tiklash imkonini saqlaydi.
Bog‘liq tushunchalar
Log-Structured Merge-tree, SSTable, Memtable, Tombstone, Write amplification, Read amplification, Snapshot