---
title: 'Site Güvenilirliği Mühendisliği'
source: 'https://academia.sh/tr/kurslar/devops-temelleri/site-guvenilirligi-muhendisligi'
course: 'DevOps Kültürü ve Temelleri'
language: tr
updated: '2026-08-17T18:09:05+00:00'
license: 'CC BY-SA 4.0'
---

# 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ı.

Ö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.

```js
// 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 };
}
```

```js
// 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.
