Ders 11 / 20
Kurtarma Hedefleri
Kurtarma süresi hedefi ile veri kaybı hedefinin ayrı iki eşik olarak tanımlanması: veri kaybı hedefinin yedekleme aralığı ve çoğaltma gecikmesiyle kayıp olay sayısına çevrilmesi, kurtarma süresi hedefinin K01'in aylık arıza payına kaç arıza sığdırdığının hesaplanması ve veri kaybını sıfıra indirmenin arızasız günde ödediği bedelin sayılması.
İçindekiler
Önceki iki ders bir arızanın ne kadar sürede fark edildiğini ve ne kadar sürede devredildiğini saydı: eşik, aralık, terfi ve geri dönüş turları. Ölçülen şey hep aynı büyüklüktü, hizmetin geri gelme süresi. Ama birinci dersin yarı düşük penceresinde kaybolan 3.888,80 yazma başka bir büyüklüktür ve bu iki ders onu ölçemedi: sistem geri geldiğinde verinin ne kadarı geride kalmıştır?
Bu ders iki eşiği adlandırır ve birbirinden ayırır. Kurtarma süresi hedefi (recovery time objective), bir arızanın başlangıcından hizmetin geri gelmesine kadar geçmesine izin verilen en uzun süredir. Veri kaybı hedefi (recovery point objective), kurtarma sonrasında kabul edilen en fazla veri kaybıdır ve zaman cinsinden yazılır: “en fazla bir dakikalık yazma”.
İkisi de eşiktir. Sistem Tasarımına Giriş kursundaki kurtarma süresi bir ölçümdür —
gerçekleşen bir arızanın ne kadar sürdüğü; buradaki hedef ise izin verilen üst sınırdır ve tasarım
kararı olarak önceden konur. Aynı ayrım hizmet erişilebilirliğinde de vardır: ölçülen yüzde ile
hedeflenen yüzde ayrı sayılardır ve biri ötekini doğrulamaz.
İki Eşik Ayrı Mekanizmayla Tutulur
Kurtarma süresi hedefi devralma ile tutulur: algılama, terfi ve yönlendirme turlarının toplamı hedefin altında kalmalıdır. Veri kaybı hedefi ise veri kopyalama ile tutulur: kurtarılan kopyanın verisi arıza anına ne kadar yakın olduğunu belirler. Bir sistem hızlı devralıp çok veri kaybedebilir, ya da hiç veri kaybetmeyip yavaş kurtarabilir. Bu yüzden bir kurtarma iddiası ancak iki sayıyla birlikte anlam taşır: “sekiz saniyede devralındı” cümlesi, “ve kaç olay kayboldu” cümlesi olmadan eksiktir.
Veri kaybı hedefini sayıya çeviren iki girdi vardır. Yedekleme aralığı: en kötü durumda arıza, bir sonraki yedeklemeden hemen önce olur ve bir aralık dolusu yazma kaybolur. Çoğaltma gecikmesi: eşzamansız çoğaltmada, kaynaktan çıkmış ama hedefe varmamış yazmalar kaybolur. Çoğaltmanın mekaniği Veri Katmanı Ölçekleme kursunda kuruldu ve burada tekrarlanmaz; gecikme burada yalnız bir girdidir.
// hedef/kayip.mjs — veri kaybi hedefinin yedekleme araligi ve cogaltma gecikmesiyle sayiya // baglanmasi. Hepsi aritmetiktir; girdileri K01'in hesaplari ve bu dersin varsayimlaridir. const GUN = 86_400; const OLAY_GUN = 2_800_000; // K01: gunluk durum olayi (V3 x V4 = 400.000 x 7) const OLAY_SN = OLAY_GUN / GUN; // ortalama yazma hizi const TEPE = 97.22; // K01: tepe yazma istek/s const OLAY_GONDERI = 7; // K01: gonderi basina durum olayi const ARTIS_GB = 0.976; // K01: gunluk veri artisi (976 MB) const TAM_GB = 712.48; // K01: saklanan veri const b = (x, n = 2) => x.toFixed(n); console.log(`ortalama yazma ${b(OLAY_SN)} olay/s, tepe ${TEPE} olay/s`); console.log(`${"yedekleme araligi".padStart(18)}${"en kotu kayip".padStart(15)}` + `${"kayip olay (ort)".padStart(18)}${"kayip olay (tepe)".padStart(19)}${"kayip gonderi".padStart(15)}`); for (const [ad, sn] of [["24 sa", 86_400], ["6 sa", 21_600], ["1 sa", 3600], ["15 dk", 900], ["5 dk", 300], ["1 dk", 60]]) { const ort = OLAY_SN * sn, tepe = TEPE * sn; console.log(`${ad.padStart(18)}${(sn + " sn").padStart(15)}` + `${Math.round(ort).toLocaleString("tr-TR").padStart(18)}` + `${Math.round(tepe).toLocaleString("tr-TR").padStart(19)}` + `${Math.round(ort / OLAY_GONDERI).toLocaleString("tr-TR").padStart(15)}`); } console.log(`\n${"cogaltma gecikmesi".padStart(19)}${"veri kaybi hedefi".padStart(19)}` + `${"kayip olay (tepe)".padStart(19)}${"kayip gonderi".padStart(15)}`); for (const L of [0, 0.5, 1, 5, 10]) { console.log(`${(b(L, 1) + " sn").padStart(19)}${(b(L, 1) + " sn").padStart(19)}` + `${b(TEPE * L).padStart(19)}${b((TEPE * L) / OLAY_GONDERI).padStart(15)}`); } console.log(`\n${"yedekleme araligi".padStart(18)}${"gunde yedek".padStart(13)}` + `${"30 gunde yedek".padStart(16)}${"30 gunde artimli GB".padStart(21)}${"tam yedek GB (haftalik)".padStart(24)}`); for (const [ad, sn] of [["24 sa", 86_400], ["1 sa", 3600], ["5 dk", 300]]) { const gunde = GUN / sn; console.log(`${ad.padStart(18)}${b(gunde, 0).padStart(13)}${b(gunde * 30, 0).padStart(16)}` + `${b(ARTIS_GB * 30).padStart(21)}${b(TAM_GB * 5).padStart(24)}`); } console.log(`saklanan yedek verisi aralikla degismiyor: degisen tek sey yedek islemi sayisi`);
ortalama yazma 32.41 olay/s, tepe 97.22 olay/s
yedekleme araligi en kotu kayip kayip olay (ort) kayip olay (tepe) kayip gonderi
24 sa 86400 sn 2.800.000 8.399.808 400.000
6 sa 21600 sn 700.000 2.099.952 100.000
1 sa 3600 sn 116.667 349.992 16.667
15 dk 900 sn 29.167 87.498 4.167
5 dk 300 sn 9.722 29.166 1.389
1 dk 60 sn 1.944 5.833 278
cogaltma gecikmesi veri kaybi hedefi kayip olay (tepe) kayip gonderi
0.0 sn 0.0 sn 0.00 0.00
0.5 sn 0.5 sn 48.61 6.94
1.0 sn 1.0 sn 97.22 13.89
5.0 sn 5.0 sn 486.10 69.44
10.0 sn 10.0 sn 972.20 138.89
yedekleme araligi gunde yedek 30 gunde yedek 30 gunde artimli GB tam yedek GB (haftalik)
24 sa 1 30 29.28 3562.40
1 sa 24 720 29.28 3562.40
5 dk 288 8640 29.28 3562.40
saklanan yedek verisi aralikla degismiyor: degisen tek sey yedek islemi sayisi
Yedekleme Tek Başına Bir Hedef Tutamaz
Birinci tablo bir mertebe farkı gösteriyor. Günlük yedeklemeyle en kötü durumda 2.800.000 durum olayı, yani bir günlük gönderi trafiğinin tamamı kaybolur; saatlik yedeklemeyle 116.667 olay ve 16.667 gönderi. Beş dakikaya inildiğinde bile 9.722 olay kaybolur. Bu sayılar bir eksikliği değil bir tanımı yansıtıyor: yedekleme belirli anların kopyasıdır ve iki an arasındaki her şey kopyanın dışındadır.
İkinci tablo aynı büyüklüğü çoğaltma tarafında veriyor ve karşılaştırma sert: bir saniyelik gecikmede tepe yükte 97,22 olay kaybolur. Beş dakikalık yedekleme aralığının kaybı, bir saniyelik çoğaltma gecikmesinin kaybının 300 katıdır. Sürekli yazma alan bir akışta anlamlı bir veri kaybı hedefi yedeklemeyle değil çoğaltmayla tutulur; yedeklemenin işi başka bir arıza kipini karşılamaktır — verinin yanlış içerikle üzerine yazılması, ki bu durumda çoğaltma hatayı sadakatle kopyalar.
Üçüncü tablo yedekleme aralığını sıkmanın bedelinin nerede olmadığını gösteriyor. Artımlı yedeklemede otuz günde saklanan veri üç aralıkta da 29,28 GB’dir, çünkü saklanan şey değişimin kendisidir ve değişim hacmi aralıktan bağımsızdır. Haftalık tam yedeklerin 3562,40 GB’ı da sabittir. Değişen tek sayı yedek işlemi sayısıdır: günde 1’den 288’e. Aralığı sıkmanın faturası depolamada değil, işlem sayısında ve her işlemin gerektirdiği eşgüdümdedir.
Kurtarma Süresi Hedefi Bütçeye Bakar
Kurtarma süresi hedefi tek başına seçilemez, çünkü hedef ile aylık kesinti bütçesi aynı kaynağı paylaşır. K01 bütçeyi kurdu: yüzde 99,9 hedefi aylık 43,2 dakika, bunun 15,0 dakikası planlı işlere, kalan 28,2 dakikası arızaya. Yüzde aritmetiği burada tekrarlanmaz; bu üç sayı girdidir.
// hedef/butce.mjs — kurtarma suresi hedefinin K01'in aylik kesinti butcesiyle karsilastirilmasi // ve veri kaybi hedefini sifira indirmenin arizasiz gundeki bedeli const ARIZA_PAYI = 28.2; // K01: aylik butcenin ariza payi (dakika) const AYLIK = 43.2; // K01: %99,9 icin aylik kesinti butcesi (dakika) const TEPE_UC = 513.89; // K01: tepe uctaki istek/s const TEPE_YAZMA = 97.22; // K01: tepe yazma istek/s const OLAY_GUN = 2_800_000; // K01: gunluk durum olayi const b = (x, n = 2) => x.toFixed(n); console.log(`${"kurtarma suresi hedefi".padStart(23)}${"ariza payina sigan".padStart(20)}` + `${"bir arizanin butce payi".padStart(25)}${"pencerede dusen uc istegi".padStart(27)}`); for (const [ad, dk] of [["8 sn (devralma)", 8 / 60], ["5 dk", 5], ["10 dk", 10], ["30 dk", 30], ["60 dk", 60]]) { console.log(`${ad.padStart(23)}${b(ARIZA_PAYI / dk).padStart(20)}` + `${("%" + b((100 * dk) / AYLIK)).padStart(25)}` + `${Math.round(dk * 60 * TEPE_UC).toLocaleString("tr-TR").padStart(27)}`); } console.log(`K01'in kurtarma suresi varsayimi 10 dk idi ve ariza payina 2,82 ariza sigiyordu`); console.log(`\nveri kaybi hedefini sifira indirmenin bedeli (senkron onay):`); console.log(` her yazma bir ek onay turu bekler -> gunde ${OLAY_GUN.toLocaleString("tr-TR")} ek tur`); const PENCERE = 8; // 01. ders: esik 3 ile devralma penceresi (saniye) const DURMA_AY = 2; // KU2 (varsayim): ayda 2 gercek durma, kopya basina const GERILIK = 1; // KU6 (varsayim): eszamansiz cogaltma gerikligi 1 saniye const senkron = DURMA_AY * PENCERE * TEPE_YAZMA; const eszamansiz = DURMA_AY * GERILIK * TEPE_YAZMA; console.log(` yazma yolu iki kopyaya birden baglanir: yedek kopyanin ${PENCERE} sn'lik penceresinde`); console.log(` ayda ${b(senkron)} yazma gorunur bicimde duser (tasiyici yeniden gonderebilir)`); console.log(` eszamansiz duzende ayda ${b(eszamansiz)} olay sessizce kaybolur (geri getirilemez)`); console.log(` oran ${b(senkron / eszamansiz)}: senkron secim daha cok istegi reddeder, daha az veri kaybeder`);
kurtarma suresi hedefi ariza payina sigan bir arizanin butce payi pencerede dusen uc istegi
8 sn (devralma) 211.50 %0.31 4.111
5 dk 5.64 %11.57 154.167
10 dk 2.82 %23.15 308.334
30 dk 0.94 %69.44 925.002
60 dk 0.47 %138.89 1.850.004
K01'in kurtarma suresi varsayimi 10 dk idi ve ariza payina 2,82 ariza sigiyordu
veri kaybi hedefini sifira indirmenin bedeli (senkron onay):
her yazma bir ek onay turu bekler -> gunde 2.800.000 ek tur
yazma yolu iki kopyaya birden baglanir: yedek kopyanin 8 sn'lik penceresinde
ayda 1555.52 yazma gorunur bicimde duser (tasiyici yeniden gonderebilir)
eszamansiz duzende ayda 194.44 olay sessizce kaybolur (geri getirilemez)
oran 8.00: senkron secim daha cok istegi reddeder, daha az veri kaybeder
Tablo hedefin bütçeyle nasıl konuştuğunu gösteriyor. On dakikalık bir kurtarma süresi hedefi arıza payına 2,82 arıza sığdırıyor — K01’in vardığı sayı budur ve burada yeniden hesaplanmıyor, yalnız öteki hedeflerin yanına konuyor. Otuz dakikalık bir hedef 0,94 arıza demektir: tek bir arıza aylık bütçenin yüzde 69,44’ünü yer ve ikincisi hedefi kırar. Altmış dakikada bir arıza bütçenin yüzde 138,89’unu tutar, yani hedef tek arızayla zaten kırılmıştır. Bir kurtarma süresi hedefi erişilebilirlik hedefinden bağımsız seçilemez; ikisi aynı bütçeye bağlıdır.
Üstteki satır önceki iki dersin kazancını bu ölçeğe koyuyor. Devralmayla ölçülen sekiz saniyelik pencere arıza payına 211,50 arıza sığdırıyor ve tek bir arıza bütçenin yüzde 0,31’ini tutuyor. Otomatik devralma bu yüzden bir hız iyileştirmesi değil, hedefin karşılanabilir hâle gelmesidir: elle kurtarma varsayımıyla ayda üç arıza hedefi kırarken, devralmayla iki yüz arıza sığıyor.
İki Günün Sayısı
Veri kaybı hedefini sıfıra indirmenin yolu senkron onaydır: yazma, ikinci kopya onaylamadan kabul edilmiş sayılmaz. Arızasız günün bedeli iki kalemdir. Birincisi her yazmanın bir ek onay turu beklemesidir — günde 2.800.000 ek tur, hiçbir arıza olmadan. İkincisi ve daha keskini yazma yolunun iki kopyaya birden bağlanmasıdır: artık yedek kopyanın arızası da yazmayı durdurur. Yedek kopyanın sekiz saniyelik penceresi ayda iki kez yaşanırsa 1.555,52 yazma reddedilir.
Arızalı günün kazancı aynı bloğun son iki satırındadır. Eşzamansız düzende bir saniyelik gerikliğe karşılık ayda 194,44 durum olayı sessizce kaybolur ve geri getirilemez. Senkron düzen bu sayıyı sıfırlar. Oran 8,00: senkron seçim, kaybolan her bir olay yerine sekiz isteği açıkça reddeder. Bu değişim gönderi takip servisinde savunulabilir, çünkü reddedilen bir durum bildirimini taşıyıcı yeniden gönderebilir, kaybolan bir durum bildirimini kimse geri getiremez. K01’in iki kalıbı ayırdığı yer de burasıydı: aynı arıza kesinti olarak da ödenebilir, kaybolan veri olarak da.
Karar akış başına verilir. Takip sorgusu okumadır ve veri kaybı hedefi onu ilgilendirmez. Durum olayı için sıfır veri kaybı hedefi savunulabilir. Gün sonu ücretlendirmesi ise dört saatlik bir pencerede çalışır ve yeniden başlatılabilir; onun için kurtarma süresi hedefi de veri kaybı hedefi de gevşektir — yeter ki girdi olan durum olayları eksiksiz olsun.
Özet
- Kurtarma süresi hedefi ile veri kaybı hedefi ayrı eşiklerdir ve ayrı mekanizmalarla tutulur:
birincisi devralmayla, ikincisi veri kopyalamayla; bir kurtarma iddiası iki sayı olmadan eksiktir.
İkisi de eşiktir, ölçüm değildir: K01’in
kurtarma süresigerçekleşen bir arızanın süresidir, buradaki hedef izin verilen üst sınırdır. - Yedekleme aralığı veri kaybını doğrudan belirler: günlük yedekle en kötü durumda 2.800.000 olay, saatlikle 116.667, beş dakikalıkla 9.722 olay kaybolur.
- Bir saniyelik çoğaltma gecikmesinin kaybı 97,22 olaydır — beş dakikalık yedekleme aralığının 300’de biri; sürekli yazma alan bir akışta veri kaybı hedefi çoğaltmayla tutulur.
- Yedekleme aralığını sıkmanın faturası depolamada değildir: otuz günde saklanan artımlı veri üç aralıkta da 29,28 GB; değişen tek sayı günde 1’den 288’e çıkan yedek işlemi sayısıdır.
- Kurtarma süresi hedefi bütçeye bağlıdır: 30 dakikalık hedef arıza payına 0,94 arıza sığdırır (bir arıza bütçenin yüzde 69,44’ü), devralmayla ölçülen 8 saniyelik pencere 211,50 arıza sığdırır.
- Veri kaybını sıfırlamanın arızasız gündeki bedeli günde 2.800.000 ek onay turu ve ayda 1.555,52 reddedilen yazmadır; karşılığında ayda 194,44 kalıcı kayıp ortadan kalkar (oran 8,00).
Sonraki Adım
Bu dersin bütün hesapları tek bir örtük varsayım taşıdı: kurtarılacak bir kopya vardır ve o kopya arızadan etkilenmemiştir. İki kopya aynı rafta, aynı elektrik hattında ya da aynı ağ anahtarının arkasındaysa varsayım tutmaz — K01’in kopya aritmetiğinin bir üst sınır olmasının nedeni buydu ve orada “kopyaların bağımsız düştüğü” varsayımı açıkça işaretlenmişti. Sonraki ders kopyaların nereye konduğunu ele alır: yerleşim biriminin tanımı, bir birimin kaybında ayakta kalan kapasite, birimler arası çoğaltmanın kaybettiği yayılmamış yazma ve yedekliliği bir düzey yukarı taşımanın arızasız günde ne kadar tuttuğu.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.