Ders 12 / 22
Kalıcılık Seçimi
Dört kalıcılık düzeninin aynı çökme senaryosunda karşılaştırılması: kurtarmanın kaç adım sürdüğü ve hangi düzenin eksik durum kurduğu, kayıp penceresi, diske yazılan bayt ile eşzamanlama sayısı olarak sürekli maliyet ve iki yolun birlikte kullanıldığında anlık görüntünün işinin dayanıklılıktan kurtarma süresine kayması.
İçindekiler
İki kalıcılık biçimi de ölçüldü ve ikisi de kendi başına eksik kaldı. Anlık görüntü kayıp penceresini kapatamıyor: aralık ne olursa olsun son görüntüden sonraki yazmalar korumasız. Ekleme günlüğü ise kayıp penceresini yazma başına ayarlıyor, ama dosyası aynı durum için üç kattan fazla yer tutuyor ve kurtarma bütün geçmişi yeniden oynatmak zorunda kalıyor.
Bu ders seçimi yapar. Seçim üç ölçü üzerinden verilir ve üçü de aynı koşumda sayılır:
Kurtarma adımı. Süreç yeniden başladığında hizmete hazır olmak için kaç kayıt uygulanır. Süre değil adım sayılır; adım ortamdan bağımsızdır.
Kayıp penceresi. Çökme anında kaç yazma yiter.
Sürekli maliyet. Depo normal çalışırken kalıcılığın diske yazdığı bayt, yaptığı eşzamanlama ve bütün girişleri tarayan tam geçiş sayısı.
Dört Düzen, Tek Çökme
KB5. Çökme, 55.000. yazmadan hemen sonra olur. Anlık görüntü 20.000 yazmada bir alınır, yani son tamamlanmış görüntü 40.000. yazmaya aittir. Günlük saniyede bir eşzamanlanır ve koşum boyunca bir kez yeniden yazılır. Her tamamlanan görüntü bir eşzamanlama yapar.
Koşum dört düzeni de gerçekten kurar: dosyalar diske yazılır, kurtarma o dosyalardan okunur ve kurulan durum, 55.000. yazmadaki doğru durumla giriş giriş karşılaştırılır.
// secim.mjs — dört kalıcılık düzeninin kurtarması, kayıp penceresi ve sürekli maliyeti import { writeFileSync, readFileSync, statSync } from 'node:fs'; function uretec(t0) { let a = t0 >>> 0; return () => { a = (a + 0x6d2b79f5) >>> 0; let t = a; t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } const r = uretec(20260731), YUK = []; for (let i = 0; i < 60000; i++) { const u = Math.floor(r() * 20000); YUK.push(['odunc:u' + String(u).padStart(5, '0'), `sube=${1 + (u % 8)};gun=${[7, 14, 28][i % 3]};yenileme=${i % 4}`]); } const durumu = (n) => { const m = new Map(); for (let i = 0; i < n; i++) m.set(YUK[i][0], YUK[i][1]); return m; }; const yaz = (m) => { let s = ''; for (const [a, d] of m) s += a + '\t' + d + '\n'; return s; }; const GORUNTU = 20000, COKME = 55000; // görüntü aralığı ve çökme anı writeFileSync('g40.txt', yaz(durumu(40000))); // son tamamlanmış görüntü writeFileSync('tam.log', YUK.slice(0, COKME).map(([a, d]) => `Y\t${a}\t${d}\n`).join('')); writeFileSync('kuyruk.log', YUK.slice(40000, COKME).map(([a, d]) => `Y\t${a}\t${d}\n`).join('')); const dogru = durumu(COKME); function kurtar(dosyalar) { // dosyaları sırayla oynatıp durumu kurar const m = new Map(); let adim = 0, bayt = 0; for (const f of dosyalar) { bayt += statSync(f).size; for (const s of readFileSync(f, 'utf8').split('\n')) { if (s === '') continue; const p = s.split('\t'); m.set(p[p.length - 2], p[p.length - 1]); adim++; } } let fark = 0; for (const [a, d] of dogru) if (m.get(a) !== d) fark++; return { bayt, adim, giris: m.size, fark }; } const duzen = [ // ad, kaynak, görüntü, günlük, yeniden yazım, kayıp ['kalıcılık kapalı', [], 0, 0, 0, 60000], ['yalnız görüntü', ['g40.txt'], 1, 0, 0, GORUNTU], ['yalnız günlük', ['tam.log'], 0, 1, 1, 3000], ['görüntü + günlük', ['g40.txt', 'kuyruk.log'], 1, 1, 0, 3000], ]; console.log('çökme anı: 55000. yazma | görüntü aralığı: 20000 yazma | eşzamanlama: saniyede bir'); console.log('düzen okunan bayt kurtarma adımı kurulan giriş eksik giriş'); for (const [ad, dosyalar] of duzen) { const k = kurtar(dosyalar); console.log(ad.padEnd(18), String(k.bayt).padStart(11), String(k.adim).padStart(15), String(k.giris).padStart(14), String(k.fark).padStart(12)); } let goruntuBayt = 0; // 60000 yazmalık koşumun sürekli maliyeti for (let n = GORUNTU; n <= 60000; n += GORUNTU) goruntuBayt += Buffer.byteLength(yaz(durumu(n))); const gunlukBayt = Buffer.byteLength(YUK.map(([a, d]) => `Y\t${a}\t${d}\n`).join('')); const yenidenYazim = Buffer.byteLength(yaz(durumu(60000))); console.log('\n60000 yazmalık koşumun sürekli maliyeti'); console.log('düzen diske yazılan eşzamanlama tam tarama en kötü kayıp'); for (const [ad, , goruntu, gunluk, yeniden, kayip] of duzen) { const bayt = goruntu * goruntuBayt + gunluk * gunlukBayt + yeniden * yenidenYazim; console.log(ad.padEnd(18), String(bayt).padStart(13), String(goruntu * 3 + gunluk * 20).padStart(12), String(goruntu * 3 + yeniden).padStart(11), String(kayip).padStart(14)); } console.log('\nbirlikte kullanımda görüntü aralığının kurtarmaya etkisi (aynı çökme anı)'); console.log('görüntü aralığı görüntü adımı günlük adımı toplam adım görüntü diski'); for (const aralik of [5000, 20000, 60000]) { const son = Math.floor(COKME / aralik) * aralik; let disk = 0; for (let n = aralik; n <= 60000; n += aralik) disk += Buffer.byteLength(yaz(durumu(n))); const g = son ? durumu(son).size : 0; console.log(String(aralik).padStart(15), String(g).padStart(14), String(COKME - son).padStart(13), String(g + COKME - son).padStart(12), String(disk).padStart(14)); }
çökme anı: 55000. yazma | görüntü aralığı: 20000 yazma | eşzamanlama: saniyede bir
düzen okunan bayt kurtarma adımı kurulan giriş eksik giriş
kalıcılık kapalı 0 0 0 18763
yalnız görüntü 652842 17330 17330 9816
yalnız günlük 2181666 55000 18763 0
görüntü + günlük 1247842 32330 18763 0
60000 yazmalık koşumun sürekli maliyeti
düzen diske yazılan eşzamanlama tam tarama en kötü kayıp
kalıcılık kapalı 0 0 0 60000
yalnız görüntü 1849117 3 3 20000
yalnız günlük 3097260 20 1 3000
görüntü + günlük 4229117 23 3 3000
birlikte kullanımda görüntü aralığının kurtarmaya etkisi (aynı çökme anı)
görüntü aralığı görüntü adımı günlük adımı toplam adım görüntü diski
5000 18763 0 18763 6535929
20000 17330 15000 32330 1849117
60000 0 55000 55000 717260
Kurtarmanın Okunması
İlk tablonun en anlamlı sütunu sonuncusudur. Doğru durum 18.763 giriştir; eksik giriş, kurtarma bittiğinde bu girişlerden kaçının ya hiç bulunmadığını ya da yanlış değer taşıdığını sayar.
Kalıcılığın kapalı olduğu düzen sıfır adımda kurtarır ve 18.763 girişin hepsini eksik kurar. Sıfır kurtarma adımı bir başarı değildir; kurtarılacak bir şey olmadığının başka türlü yazılışıdır.
Asıl uyarı ikinci satırdadır. Yalnız görüntüyle kurtarma 17.330 giriş kurar — bu, doğru sayının yüzde 92’sidir ve depo yüzeyden bakıldığında dolu görünür. Buna karşın girişlerin 9.816’sı, yani yarısından fazlası ya yoktur ya da eski değerdedir. Kütüphanenin bakış açısından bu, yarısı geçen haftaya ait bir ödünç tablosuyla açılmak demektir; ödünç sayıları tutmaz, iade tarihleri geçmişi gösterir ve hatanın hangi kayıtta olduğu dışarıdan anlaşılmaz. Eksik durumla açılmak, hiç açılmamaktan daha zor fark edilir.
Yalnız günlük ve birlikte kullanım aynı sonucu verir: sıfır eksik giriş. Aralarındaki fark maliyettedir. Günlük tek başına 55.000 adım uygular ve 2.181.666 bayt okur; birlikte kullanım aynı durumu 32.330 adımda ve 1.247.842 bayt okuyarak kurar. Kurtarma işi yüzde 41 azalır, çünkü ilk 40.000 yazmanın hepsini tek tek oynatmak yerine onların sonucu okunur.
Sürekli Maliyet
İkinci tablo aynı düzenlerin çalışma sırasındaki bedelini verir. Yalnız görüntü 1.849.117 bayt yazar ve üç eşzamanlama yapar; en ucuz korumalı düzendir ve en kötü durumda 20.000 yazma kaybeder. Yalnız günlük 3.097.260 bayt yazar, yirmi eşzamanlama yapar ve kaybı 3.000 yazmaya indirir.
Birlikte kullanım en pahalı satırdır: 4.229.117 bayt, yirmi üç eşzamanlama. Bu sayının günlüğün ve görüntünün toplamı olması beklenir, ama tam toplam değildir — birlikte kullanımda günlüğün ayrıca yeniden yazılmasına gerek kalmaz, çünkü her tamamlanan görüntüden sonra günlük kırpılabilir. Görüntü, günlüğün budayıcısı hâline gelir.
Tam tarama sütunu sessiz bir maliyeti sayar. Önceki derste ölçülen tarama bedeli — duraklatma ya da kopyalama — her tam geçişte yeniden ödenir. Yalnız günlük düzeni bu geçişi koşum boyunca bir kez yapar, görüntü içeren düzenler üç kez.
Birlikte Kullanımda Görüntünün İşi
Üçüncü tablo, birlikte kullanımın asıl kararını gösterir. Kayıp penceresi artık görüntünün işi değildir; onu günlük tutar ve üç satırda da 3.000 yazmadır. Değişen tek şey kurtarma adımıdır.
Görüntü aralığı 60.000 yazma olduğunda, yani çökmeden önce hiç görüntü tamamlanmadığında, kurtarma 55.000 adıma çıkar ve görüntü diski 717.260 bayta iner. Aralık 20.000 olduğunda kurtarma 32.330 adıma, aralık 5.000 olduğunda 18.763 adıma iner — bu, mümkün olan en düşük değerdir, çünkü giriş sayısının altına inilemez. Bedeli görüntü diskidir: 717.260 bayttan 6.535.929 bayta, dokuz katına çıkar.
Bu, dersin kararıdır. Anlık görüntü ile ekleme günlüğü birlikte kullanıldığında görüntünün işi dayanıklılık değil kurtarma süresidir. Aralık, “ne kadar veri kaybetmeyi göze alıyorum” sorusuna göre değil, “yeniden başlamanın ne kadar sürmesine izin veriyorum” sorusuna göre ayarlanır.
Karar
Kütüphanenin verisi tek bir düzen istemez; her veri kendi bedelini taşır.
| Veri | Düzen | Gerekçe |
|---|---|---|
| Katalog önbelleği | kalıcılık kapalı | Kaynağından yeniden üretilebilir; kurtarma adımı sıfır, kayıp önemsiz |
| Oturum kayıtları | yalnız görüntü | Yeniden oturum açmak ucuz; 20.000 yazmalık pencere kabul edilir, sürekli maliyet en düşük |
| Ödünç sayaçları, bekleme listesi | görüntü + günlük | Eksik durumla açılmak kabul edilemez; kurtarma 32.330 adım, pencere 3.000 yazma |
| Gecikme cezası kayıtları | görüntü + günlük, her yazmada eşzamanlama | Kaybedilen kayıt paraya karşılık gelir; pencere sıfıra iner, bedeli yazma başına eşzamanlamadır |
Tabloda eksik kalan tek düzen “yalnız günlük”tür ve bunun nedeni ölçümde görünür: aynı dayanıklılığı verirken kurtarması birlikte kullanımın 1,7 katı adım sürer, üstelik günlüğün büyümesini durdurmak için yine tam tarama gerekir. Günlüğü tek başına kullanmak, görüntünün maliyetinden kaçmaz; onu yalnız erteler.
Özet
- Kurtarma üç ölçüyle değerlendirilir: uygulanan kayıt sayısı, kayıp penceresi ve çalışma sırasındaki sürekli maliyet.
- Yalnız görüntüyle kurtarma doğru girişlerin yüzde 92’sini kurdu ama 9.816’sını eksik ya da eski bıraktı; eksik durumla açılmak, hiç açılmamaktan daha zor fark edilir.
- Aynı doğru durumu günlük 55.000 adımda, görüntü ile günlük birlikte 32.330 adımda kurdu; okunan bayt 2.181.666’dan 1.247.842’ye indi.
- Birlikte kullanım en pahalı sürekli maliyeti taşır (4.229.117 bayt, 23 eşzamanlama), ama görüntü günlüğü kırptığı için ayrıca yeniden yazım gerektirmez.
- Birlikte kullanımda görüntü aralığı kayıp penceresini değil kurtarma adımını ayarlar: 5.000’lik aralık kurtarmayı 18.763 adıma indirdi, görüntü diskini dokuz katına çıkardı.
Sonraki Adım
Kalıcılık kararı verildiğinde depo, çökmeden sonra kendine gelmeyi öğrenmiş olur. Çökmeden önce gelen bir sınır ise henüz ele alınmadı: bellek biter. Bu konudaki bütün ölçümler deponun büyümesine izin verdi; 19.040 giriş 1.593.100 bayt tuttu ve kimse durdurmadı. Sonraki ders bellek sınırına ulaşıldığında hangi anahtarın atılacağı sorusunu ele alır. Aynı ödünç erişim izinde dört politika — en az kullanılan, en az sık kullanılan, rastgele ve süreye göre — isabet oranı ve tutulan bayt düzleminde karşılaştırılır; politikanın girişlere eklediği üstverinin kendisi de sayıya girer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.