Ders 05 / 12
Site Güvenilirliği Mühendisliği
Hata bütçesinin bir sayıya bağlanması: 30 günlük dönemde %99,9 hedefin 43,2 dakika bütçe bırakması ve tek bir ağır olayın bunun %208'ini götürmesi, bütçe kuralı olmadan 12 dönemde 630 dakika kesinti ve %99,878 erişilebilirlik ölçülürken kural açıldığında 12 dönemin 8'inde bütçenin tükenip 166 gün dondurmaya karşılık kesintinin yalnız 620 dakikaya inmesi ama öncü sürenin 3,0 günden 12,6 güne çıkması, hedef %99,95'e çekildiğinde 236 donuk gün ve 60 çıkmayan değişiklikle öncü sürenin 49,9 güne taşınması, kesinti süresi yarıya inince kuralın 4 dönemde tükenip erişilebilirliğin %99,939'a çıkması ve öncü sürenin 5,4 günde kalması.
İçindekiler
Önceki ders üç kararın dört ölçütte ölçülen bedelini saydı, ama her karar örtük bir eşiğe göre verildi: ne kadar hata kabul edilebilir, kabul edilemez olduğunda ne durur. O eşik hiçbir yerde yazılı değildi.
Site güvenilirliği mühendisliği, işletme sorumluluğunu bir mühendislik problemi olarak ele alan ve güvenilirlik hedefini önce bir sayıya bağlayan disiplindir. DevOps ile örtüştüğü alan sorumluluk paylaşımıdır — iki yaklaşım da yazan ile işletenin aynı sonuçtan sorumlu olmasını ister. Ayrıştığı yer ölçüttür: hedef önce yazılır, sonra o hedeften bir hata bütçesi türetilir ve teslimat kararları o bütçeye bağlanır. Bu ders bütçeyi bir dakika sayısına bağlar ve kuralın dört ölçütte ölçülen etkisini sayar. Kurtarma mekaniği M19/K05’te ölçüldü; burada kurtarma süresi bir girdi olarak alınır.
Bütçenin Kurulması
Örnek yine kurgu bölgesel ölçüm ağıdır; ağ da dönemler de kurgudur. KA26: dönem 30 gün, yani 43200 dakikadır ve on iki dönem koşulur. KA27: her dönemde yirmi değişiklik eşit aralıklarla akışa girer; parti dörttür ve hazırlık bir gün tutar. KA28: her değişiklik için iki zar koşulsuz atılır — kusurlu olup olmadığı (oran 0,10) ve olay sınıfı (hafif 10 dakika, pay 0,60; orta 30 dakika, pay 0,30; ağır 90 dakika, pay 0,10); tohum 20260805’tir. KA29: kusurlu bir değişiklik yayına çıkarsa üretimde bir olay olur ve olayın kesinti dakikası dönemin bütçesinden düşer. Bütçe dönem başında hedef erişilebilirlikten türetilir: dönem dakikası çarpı bir eksi hedef. KA30: bütçe kuralı açıksa kalan bütçe sıfırın altına düştüğü anda dönem sonuna kadar yeni yayın çıkmaz; kuyruktaki değişiklikler bekler ve bütçe yalnız yeni dönemde yenilenir. KA31: öncü süre değişikliğin akışa girişinden yayınlanmasına kadar geçen gündür, kurtarma süresi olayın kesinti dakikasıdır, erişilebilirlik bir eksi toplam kesintinin toplam döneme oranıdır.
Dönemler, olaylar ve bütçe kuralı süreç içi bir modeldir; gerçek bir kesinti kaydı yoktur.
// butce/donem.mjs — hata butcesinin donem modeli: gercek bir kesinti kaydi yok, gunler ve // dakikalar veri yapisidir. Rastgelelik uretecle yazilir, tohum gorunur. export const DONEM_GUN = 30, DONEM = 12, GUN_DK = 1440, DEG = 20, PARTI = 4, HAZIRLIK = 1; export const KUSUR = 0.10, TOHUM = 20260805; // olay sinifi: kesinti dakikasi ve payi export const SINIF = [["hafif", 10, 0.60], ["orta", 30, 0.30], ["agir", 90, 0.10]]; export function uretec(tohum) { // dogrusal eslesmeli uretec let x = tohum >>> 0; return () => ((x = (x * 1664525 + 1013904223) >>> 0) / 2 ** 32); } export const butceDk = (hedef) => DONEM_GUN * GUN_DK * (1 - hedef); export function kos({ hedef = 0.999, kural = true, kesintiCarpani = 1 } = {}) { const zar = uretec(TOHUM), butce = butceDk(hedef); const D = Array.from({ length: DONEM * DEG }, (_, i) => { const d = Math.floor(i / DEG), k = i % DEG; const kusur = zar() < KUSUR, p = zar(); let esik = 0, dk = 0; for (const [, sure, pay] of SINIF) { esik += pay; if (dk === 0 && p < esik) dk = sure; } return { i, varis: d * DONEM_GUN + Math.floor(k * DONEM_GUN / DEG), kusur, kesinti: dk * kesintiCarpani, durum: "yolda", yayinGun: null }; }); const S = { yayin: 0, bozukYayin: 0, kesinti: 0, olay: 0, donukGun: 0, tukenen: 0, kalanlar: [], kesintiler: [], donemYayin: Array(DONEM).fill(0) }; let aktif = null, kalan = butce, donem = -1, donuk = false; for (let t = 0; t < DONEM * DONEM_GUN; t++) { const d = Math.floor(t / DONEM_GUN); if (d !== donem) { // donem basinda butce yenilenir if (donem >= 0) S.kalanlar.push(kalan); donem = d; kalan = butce; donuk = false; } for (const x of D) if (x.durum === "yolda" && x.varis <= t) x.durum = "kuyrukta"; if (aktif && aktif.bitis === t) { // yayin uretime cikar S.yayin++; S.donemYayin[d]++; const bozuk = aktif.grup.filter((x) => x.kusur); if (bozuk.length) { S.bozukYayin++; for (const x of bozuk) { S.olay++; S.kesinti += x.kesinti; S.kesintiler.push(x.kesinti); kalan -= x.kesinti; } if (kural && kalan < 0 && !donuk) { donuk = true; S.tukenen++; } } for (const x of aktif.grup) { x.durum = "bitti"; x.yayinGun = t; } aktif = null; } if (donuk) { S.donukGun++; continue; } // butce bitti: yeni yayin cikmaz if (aktif) continue; const K = D.filter((x) => x.durum === "kuyrukta"); if (K.length < PARTI) continue; const grup = K.slice(0, PARTI); for (const x of grup) x.durum = "yayinda"; aktif = { grup, bitis: t + HAZIRLIK }; } S.kalanlar.push(kalan); return { D, S, butce }; } export const ort = (a) => (a.length ? (a.reduce((s, v) => s + v, 0) / a.length).toFixed(1) : "-"); export function olc(ayar) { const { D, S, butce } = kos(ayar); const cikan = D.filter((x) => x.yayinGun !== null); const toplamDk = DONEM * DONEM_GUN * GUN_DK; return { D, S, butce, dagitimSikligi: (S.yayin / DONEM).toFixed(1), onculSure: ort(cikan.map((x) => x.yayinGun - x.varis)), geriDonusOrani: (100 * S.bozukYayin / S.yayin).toFixed(0) + "%", kurtarma: ort(S.kesintiler), erisilebilirlik: (100 * (1 - S.kesinti / toplamDk)).toFixed(3) + "%", kesinti: S.kesinti, olay: S.olay, yayin: S.yayin, tukenen: S.tukenen, donukGun: S.donukGun, kalanOrt: ort(S.kalanlar), cikmayan: D.length - cikan.length }; }
// butce/olc.mjs — hata butcesi bir sayiya baglanir; butce kuralinin dort olcutte etkisi. import { DONEM, DONEM_GUN, GUN_DK, SINIF, TOHUM, KUSUR, butceDk, olc } from "./donem.mjs"; const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("")); console.log(`${DONEM} donem x ${DONEM_GUN} gun = ${DONEM * DONEM_GUN * GUN_DK} dakika; ` + `kusur orani ${KUSUR}, tohum ${TOHUM}`); const H = [0.995, 0.999, 0.9995]; const A = [-14, 16, 14, 12, 12]; console.log("\n1. hedef erisilebilirlik donemde kac dakika butce birakir"); yaz(A, "hedef", "butce (dakika)", "hafif olay", "orta olay", "agir olay"); for (const h of H) { const b = butceDk(h); yaz(A, (100 * h).toFixed(2) + "%", b.toFixed(1), ...SINIF.map(([, dk]) => `${(100 * dk / b).toFixed(0)}%`)); } console.log(" (son uc sutun: tek bir olayin butceden dusurdugu pay)"); console.log(" olay siniflari: " + SINIF.map(([ad, dk, p]) => `${ad} ${dk} dk (pay ${p})`).join(", ")); const K = { "%99,9 kural yok": { hedef: 0.999, kural: false }, "%99,9 kural var": { hedef: 0.999, kural: true }, "%99,5 kural var": { hedef: 0.995, kural: true }, "%99,95 kural var": { hedef: 0.9995, kural: true }, "%99,9 kesinti yariya": { hedef: 0.999, kural: true, kesintiCarpani: 0.5 }, }; const R = Object.fromEntries(Object.entries(K).map(([ad, a]) => [ad, olc(a)])); const B = [-22, 12, 12, 12, 12]; console.log("\n2. butce kuralinin dort teslimat olcutunde olculen etkisi"); yaz(B, "kosum", "dagitim", "oncu sure", "geri donus", "kurtarma"); yaz(B, "", "(donem/yayin)", "(gun)", "(yayin)", "(dakika)"); for (const [ad, r] of Object.entries(R)) yaz(B, ad, r.dagitimSikligi, r.onculSure, r.geriDonusOrani, r.kurtarma); const C = [-22, 10, 8, 17, 16, 12]; console.log("\n3. ayni kosumlarda butcenin durumu"); yaz(C, "kosum", "kesinti", "olay", "erisilebilirlik", "tukenen donem", "donuk gun"); for (const [ad, r] of Object.entries(R)) yaz(C, ad, r.kesinti, r.olay, r.erisilebilirlik, `${r.tukenen}/${DONEM}`, r.donukGun); const E = [-22, 8, 18, 21, 13]; console.log("\n4. yayin ve kuyruk"); yaz(E, "kosum", "yayin", "ort. kalan butce", "cikmayan degisiklik", "hedef tuttu"); for (const [ad, r] of Object.entries(R)) { const h = K[ad].hedef; yaz(E, ad, r.yayin, r.kalanOrt, r.cikmayan, +r.erisilebilirlik.replace("%", "") >= 100 * h ? "evet" : "hayir"); }
12 donem x 30 gun = 518400 dakika; kusur orani 0.1, tohum 20260805
1. hedef erisilebilirlik donemde kac dakika butce birakir
hedef butce (dakika) hafif olay orta olay agir olay
99.50% 216.0 5% 14% 42%
99.90% 43.2 23% 69% 208%
99.95% 21.6 46% 139% 417%
(son uc sutun: tek bir olayin butceden dusurdugu pay)
olay siniflari: hafif 10 dk (pay 0.6), orta 30 dk (pay 0.3), agir 90 dk (pay 0.1)
2. butce kuralinin dort teslimat olcutunde olculen etkisi
kosum dagitim oncu sure geri donus kurtarma
(donem/yayin) (gun) (yayin) (dakika)
%99,9 kural yok 5.0 3.0 35% 23.3
%99,9 kural var 4.8 12.6 34% 23.8
%99,5 kural var 5.0 3.0 35% 23.3
%99,95 kural var 3.8 49.9 29% 27.5
%99,9 kesinti yariya 5.0 5.4 35% 11.7
3. ayni kosumlarda butcenin durumu
kosum kesinti olay erisilebilirlik tukenen donem donuk gun
%99,9 kural yok 630 27 99.878% 0/12 0
%99,9 kural var 620 26 99.880% 8/12 166
%99,5 kural var 630 27 99.878% 0/12 0
%99,95 kural var 440 16 99.915% 9/12 236
%99,9 kesinti yariya 315 27 99.939% 4/12 65
4. yayin ve kuyruk
kosum yayin ort. kalan butce cikmayan degisiklik hedef tuttu
%99,9 kural yok 60 -9.3 0 hayir
%99,9 kural var 58 -8.5 8 hayir
%99,5 kural var 60 163.5 0 evet
%99,95 kural var 45 -15.1 60 hayir
%99,9 kesinti yariya 60 17.0 0 evet
Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır.
Bir Olay Bütçenin Ne Kadarını Götürür
Birinci tablo hedefi doğrudan dakikaya çevirir. Otuz günlük dönemde %99,5 hedef 216,0 dakika, %99,9 hedef 43,2 dakika, %99,95 hedef 21,6 dakika bırakır. Sağdaki üç sütun tek bir olayın bu bütçeden düşürdüğü paydır ve karar burada başlar: %99,5 hedefte ağır bir olay bütçenin %42’sini götürür, %99,9 hedefte %208’ini, %99,95 hedefte %417’sini. Bir hedef, dönemde kaç ağır olaya dayanabildiğiyle okunur: %99,5 hedef ikiye dayanır, %99,9 hedef birine bile dayanmaz.
Aynı ilişki ters yönden de geçerlidir. Ölçülen ortalama kesinti 23,3 dakikadır; %99,9 bütçesi 43,2 dakikadır. Yani bütçe iki olaydan sonra biter ve dönemde ortalama 2,3 olay çıkmaktadır. Hata bütçesi, kurtarma süresinin dönem toplamı için konmuş bir tavandır.
Kural Neyi Durdurur
İkinci ve üçüncü tablolar aynı olay dizisini kural kapalı ve açıkken karşılaştırır. Kural kapalıyken on iki dönemde 27 olay, 630 dakika kesinti ve %99,878 erişilebilirlik ölçülür — hedefin altı. Kural açıldığında bütçe on iki dönemin sekizinde tükenir ve 166 gün dondurma uygulanır. Karşılığı şudur: kesinti 630’dan 620 dakikaya, olay 27’den 26’ya iner ve erişilebilirlik %99,878’den %99,880’e çıkar. Hedef yine tutmaz.
Neden bu kadar az? Dördüncü tablo söyler: yayın sayısı 60’tan yalnız 58’e iner. Dondurma değişikliği yok etmez, erteler; donmuş dönem bitince kuyruk boşalır ve aynı kusurlar aynı sırayla üretime çıkar. Bedel öncü süredir: 3,0 günden 12,6 güne çıkar, dağıtım sıklığı 5,0’dan 4,8’e iner ve sekiz değişiklik on iki dönem içinde hiç çıkamaz. Bütçe kuralı bir önleme aracı değil, bir durdurma aracıdır; olaydan önce değil, olaydan sonra çalışır.
Zamanlama da bunu doğrular. Bütçe ortalama olarak iki olaydan sonra tükenir; o ana kadar dönemin beş yayınının çoğu çıkmıştır. Dondurmanın engellediği yayınlar dönemin son günlerine ait olanlardır ve onlar da bir sonraki dönemin ilk günlerinde çıkar. On iki dönemin toplamında engellenen yayın sayısı ikidir — 166 gün dondurmaya karşılık. Geri dönüş oranının %35’ten %34’e inmesi de aynı nedenledir: kural yayının içeriğine dokunmaz, yalnız zamanına dokunur. Aynı şey kurtarma süresi için de geçerlidir; 23,3 dakikadan 23,8 dakikaya çıkması, ertelenen yayınların sınıf dağılımının biraz kaymasından başka bir şey değildir.
Hedefin Sıkılığı ve Bütçenin Kaynağı
%99,5 hedefte kural hiç çalışmaz: bütçe on iki dönemin hiçbirinde tükenmez, dönem sonu ortalama kalan 163,5 dakikadır ve ölçülen bütün sayılar kural yokmuş gibidir. Gevşek hedefe bağlanan kural ölçülemez; yazılı olması davranışı değiştirmez.
%99,95 hedefte tersi olur. Bütçe on iki dönemin dokuzunda tükenir, 236 gün donar, yayın 60’tan 45’e iner ve altmış değişiklik hiç çıkamaz. Öncü süre 3,0 günden 49,9 güne fırlar. Kesinti 630’dan 440 dakikaya iner ve erişilebilirlik %99,915 olur — yine hedefin altı. Sıkı hedef akışı durdurur ve yine de hedefi tutturmaz.
Beşinci koşum bütçenin gerçek kaynağını gösterir. Hedef %99,9’da bırakılıp kesinti süresi yarıya indirildiğinde bütçe yalnız dört dönemde tükenir, dondurma 65 güne iner, yayın 60’ta ve öncü süre 5,4 günde kalır; erişilebilirlik %99,939’a çıkar ve hedef tutar. Kurtarma süresi 23,3 dakikadan 11,7 dakikaya inmiştir. Bütçeyi dondurma değil, kurtarma süresi belirler.
Farkın Saklandığı Yer
Bu derste fark hedef ile kesinti dağılımı arasında saklıdır ve sayısı şudur: aynı 27 olay üç hedefte üç ayrı bütçe tüketimi verir — 216,0 dakikada hiç tükenmeyen, 43,2 dakikada sekiz dönemde tükenen, 21,6 dakikada dokuz dönemde tükenen. Bildirilmiş kısım hedefin kendisidir; bildirilmemiş kısım olay sınıflarının dağılımıdır. Ağır olayın payı yalnız 0,10’dur ama toplam 630 dakikanın büyük bölümünü o taşır ve bütçeyi tüketen odur.
Sinyalin kime kaç adımda ulaştığı da bu kuralla değişir. Bütçe kuralı yokken kalan bütçe hiç okunmaz; kuralla birlikte her olay aynı gün bütçeden düşer ve tükenme anı yayın kararını aynı gün durdurur. Dört ölçütte ölçülen etki de bir arada okunur: kural açıldığında dağıtım sıklığı 5,0’dan 4,8’e, öncü süre 3,0’dan 12,6 güne gider; geri dönüş oranı %35’ten %34’e, kurtarma süresi 23,3’ten 23,8 dakikaya — yani ikisi neredeyse hiç oynamaz.
Özet
- Hata bütçesi hedeften türetilir: 30 günlük dönemde %99,5 hedef 216,0, %99,9 hedef 43,2, %99,95 hedef 21,6 dakika bırakır; tek bir ağır olay (90 dakika) bunların sırasıyla %42’sini, %208’ini ve %417’sini götürür.
- Kural kapalıyken 12 dönemde 27 olay, 630 dakika kesinti ve %99,878 erişilebilirlik ölçülür.
- Kural açıldığında bütçe 8 dönemde tükenir ve 166 gün dondurulur, ama yayın 60’tan 58’e indiği için kesinti yalnız 620 dakikaya iner; bedel öncü süredir (3,0 → 12,6 gün) ve 8 değişiklik hiç çıkamaz.
- Hedef %99,5’e gevşetilirse kural hiç çalışmaz (0/12 tükenme, ortalama kalan 163,5 dakika); %99,95’e sıkılırsa 9/12 dönem tükenir, 236 gün donar, 60 değişiklik çıkamaz ve öncü süre 49,9 güne çıkar — hedef yine tutmaz.
- Kesinti süresi yarıya inince bütçe yalnız 4 dönemde tükenir, öncü süre 5,4 günde kalır ve erişilebilirlik %99,939 ile hedefi tutar: bütçeyi kurtarma süresi belirler.
Sonraki Adım
Bütçe kuralı olayı olduktan sonra gördü ve ondan sonra durdurdu; ölçülen etkinin küçük olmasının nedeni buydu. Sinyalin ne kadar geç geldiği her derste bir yerde çıktı ama hiç doğrudan sayılmadı. Sonraki ders döngünün kendisini ele alır: kaç ayrı geri bildirim döngüsü var, her birinin uzunluğu ne, hangi hata sınıfını kapsıyor ve bir hata sınıfını daha erken bir döngüye taşımanın maliyeti ile kaçırdığı nedir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.