---
title: 'Felaket Kurtarma Tatbikatı'
source: 'https://academia.sh/tr/kurslar/dayaniklilik-kaliplari/felaket-kurtarma-tatbikati'
course: 'Dayanıklılık ve Güvenilirlik'
language: tr
updated: '2026-08-17T18:11:01+00:00'
license: 'CC BY-SA 4.0'
---

# Felaket Kurtarma Tatbikatı

Kurtarma planının denetimli bir arıza denemesiyle sınanması: plandaki adım sürelerinin tatbikatta ölçülenle karşılaştırılması, planda hiç yazmayan adımın ortaya çıkması, kurtarma süresi hedefinin plana göre tutup tatbikata göre kırılması ve devralma penceresinde yarıda kalan iş akışlarının iki teslim politikasında bıraktığı yinelenen yan etki ile yarım kalan işin sayılması.

Bu konu beş derste bir kurtarma düzeni kurdu: devralma eşiği ve geri dönüş politikası, sağlık
ucunun içeriği ve aralığı, kurtarma süresi ile veri kaybı hedefleri, alan ve bölge yerleşimi,
damgalar ve coğrafi kopyalar. Her dersin sayıları bir modelden ya da aritmetikten çıktı ve hepsi
aynı şeyi varsaydı: **plan yazıldığı gibi çalışacak.**

Bu varsayım sınanmadıkça bir tahmindir. **Felaket kurtarma tatbikatı**, planı denetimli bir arıza
denemesiyle sınamaktır: belirli bir birim, seçilmiş bir zamanda, bilinerek devre dışı bırakılır ve
kurtarmanın gerçekte nasıl işlediği ölçülür. Bir tatbikatın kapsamı üç şeyle tanımlanır — hangi
birim (kopya, alan, bölge, damga), hangi arıza kipi (durma, yavaşlama, bölünme) ve ne kadar süre.
Kapsam yazılmadan yapılan bir deneme, ölçtüğü şeyi de söyleyemez.

## Plan ile Ölçülenin Farkı

Bir kurtarma planı adımların listesidir ve her adıma bir süre biçilmiştir. Tatbikatın birinci
çıktısı bu sürelerin karşılaştırmasıdır. Aşağıdaki hesapta ölçülen değerler uydurulmadı: önceki
derslerin parametrelerinden geliyor. Algılama süresi birinci dersin seçtiği eşiktir, ısınma süresi
ikinci dersin arıza takvimindeki ısınma penceresidir.

**KU8 — yönlendirme kaydının yaşam süresi 3 tur.** Gerekçe: yeni etkin kopyaya yönlendirme,
eskisinin kaydı geçersiz olana kadar tamamlanmaz. **KU9 — kuyruk tüketicisinin yeniden bağlanması
2 tur.** İkisi de varsayımdır ve K01'in tablosuna eklenmez.

```js
// tatbikat/plan.mjs — kurtarma planindaki adim sureleri ile tatbikatta olculenin karsilastirilmasi.
// Olculen degerler onceki derslerin parametrelerinden gelir; tur soyut bir adimdir.
const ESIK = 3;          // 01. ders: secilen tetikleme esigi
const TERFI = 1;         // 01. ders: terfi turu
const YASAM = 3;         // KU8 (varsayim): yonlendirme kaydinin yasam suresi (tur)
const ISINMA = 8;        // 02. ders takvimi: bir kopyanin isinma suresi (tur)
const KUYRUK = 2;        // KU9 (varsayim): kuyruk tuketicisinin yeniden baglanmasi (tur)
const DOGRULAMA = 2;     // planda yazili dogrulama adimi
const TUR_SN = 2;        // KU1 (varsayim): bir tur 2 saniye
const TEPE_UC = 513.89;  // K01: tepe uctaki istek/s
const PLANLI = 15.0;     // K01: aylik butcenin planli isler payi (dakika)
const b = (x, n = 2) => x.toFixed(n);

const ADIM = [
  ["algilama", 1, ESIK], ["terfi", 1, TERFI], ["yonlendirme", 1, YASAM],
  ["onbellek-isinma", 0, ISINMA], ["kuyruk-baglanma", 1, KUYRUK], ["dogrulama", 2, DOGRULAMA],
];
console.log(`${"adim".padEnd(17)}${"planlanan".padStart(11)}${"tatbikatta".padStart(12)}${"sapma".padStart(8)}`);
let p = 0, o = 0;
for (const [ad, plan, olculen] of ADIM) {
  p += plan; o += olculen;
  const d = olculen - plan;
  console.log(`${ad.padEnd(17)}${(plan + " tur").padStart(11)}${(olculen + " tur").padStart(12)}` +
    `${((d >= 0 ? "+" : "") + d).padStart(8)}`);
}
console.log(`${"toplam".padEnd(17)}${(p + " tur").padStart(11)}${(o + " tur").padStart(12)}` +
  `${("+" + (o - p)).padStart(8)}`);
console.log(`plan/olculen orani ${b(o / p)} kat`);

console.log(`\nplan ${p * TUR_SN} sn, tatbikatta olculen ${o * TUR_SN} sn (KU1: tur = ${TUR_SN} sn)`);
for (const hedef of [30, 60]) {
  const pl = p * TUR_SN <= hedef ? "gecer" : "kirilir", ol = o * TUR_SN <= hedef ? "gecer" : "kirilir";
  console.log(`  kurtarma suresi hedefi ${hedef} sn: plana gore ${pl}, tatbikata gore ${ol}`);
}
console.log(`  tatbikat penceresinde dusen uc istegi = ${b(o * TUR_SN * TEPE_UC)} (tepe yukte)`);
console.log(`\ntatbikatin kendi bedeli (bir tatbikat = ${b((o * TUR_SN) / 60)} dk):`);
console.log(`${"siklik".padEnd(14)}${"aylik tatbikat".padStart(16)}${"aylik dakika".padStart(14)}` +
  `${"planli payin".padStart(14)}${"aylik butcenin".padStart(16)}`);
for (const [ad, ayda] of [["haftada 1", 4], ["ayda 1", 1], ["uc ayda 1", 1 / 3]]) {
  const dk = (ayda * o * TUR_SN) / 60;
  console.log(`${ad.padEnd(14)}${b(ayda).padStart(16)}${b(dk).padStart(14)}` +
    `${("%" + b((100 * dk) / PLANLI)).padStart(14)}${("%" + b((100 * dk) / 43.2)).padStart(16)}`);
}
console.log(`plandaki 6 adimin ${ADIM.filter(([, pl, ol]) => ol !== pl).length}'i saptigi olculdu; ` +
  `biri (onbellek-isinma) planda hic yoktu`);
```

```
adim               planlanan  tatbikatta   sapma
algilama               1 tur       3 tur      +2
terfi                  1 tur       1 tur      +0
yonlendirme            1 tur       3 tur      +2
onbellek-isinma        0 tur       8 tur      +8
kuyruk-baglanma        1 tur       2 tur      +1
dogrulama              2 tur       2 tur      +0
toplam                 6 tur      19 tur     +13
plan/olculen orani 3.17 kat

plan 12 sn, tatbikatta olculen 38 sn (KU1: tur = 2 sn)
  kurtarma suresi hedefi 30 sn: plana gore gecer, tatbikata gore kirilir
  kurtarma suresi hedefi 60 sn: plana gore gecer, tatbikata gore gecer
  tatbikat penceresinde dusen uc istegi = 19527.82 (tepe yukte)

tatbikatin kendi bedeli (bir tatbikat = 0.63 dk):
siklik          aylik tatbikat  aylik dakika  planli payin  aylik butcenin
haftada 1                 4.00          2.53        %16.89           %5.86
ayda 1                    1.00          0.63         %4.22           %1.47
uc ayda 1                 0.33          0.21         %1.41           %0.49
plandaki 6 adimin 4'i saptigi olculdu; biri (onbellek-isinma) planda hic yoktu
```

Toplam satırı dersin ilk sonucudur: plan 6 tur diyordu, tatbikat 19 tur ölçtü — 3,17 kat. Bu oran
koşumdan bağımsız türetilmiş bir niceliktir; tur saniyeye çevrilmese de aynı kalır.

Sapma tek bir yerden gelmiyor. Algılama ve yönlendirme adımları planda birer tur yazılmış, oysa
birincisi seçilen eşiğe, ikincisi yönlendirme kaydının yaşam süresine bağlıdır — ikisi de başka
derslerde **verilmiş** kararlardır ve plan onları okumamıştır. En büyük sapma ise planda hiç
olmayan bir adımdan geliyor: önbelleğin ısınması. Yeni etkin kopya ayaktadır, yazma kabul eder ve
sağlık denetimini geçer, ama okumaları soğuk önbellekle karşılar. **Planın en pahalı hatası yanlış
tahmin değil, eksik adımdır.**

Sonuç eşiğe çarpıyor. Otuz saniyelik bir kurtarma süresi hedefi plana bakıldığında rahatça
tutuluyor (12 saniye), tatbikata bakıldığında kırılıyor (38 saniye). Altmış saniyelik hedef her iki
okumada da geçiyor. Bir hedefin tutulup tutulmadığı plandan okunamaz; tatbikat, hedefi bir iddia
olmaktan çıkarıp ölçülmüş bir sayıya bağlayan tek adımdır.

## Kapsam ve Sıklık

Tatbikatın kapsamı bir merdivendir ve her basamak farklı bir şey sınar. En alt basamak plan
adımlarının kâğıt üzerinde gözden geçirilmesidir; bu, eksik adımı bulabilir ama süreyi ölçemez —
yukarıdaki tabloda önbellek ısınmasının planda hiç olmaması bu yolla yakalanabilirdi, sekiz turluk
süresi yakalanamazdı. Orta basamak tek bir bileşenin devre dışı bırakılmasıdır; devralma eşiğini ve
sağlık ucunun içeriğini sınar. Üst basamak bir alanın ya da bölgenin bütününün kaybıdır ve önceki
iki dersin yerleşim kararlarını sınayan tek denemedir; yalnız burada boşta duran kapasitenin gerçek
yükü taşıyıp taşımadığı görülür.

Sıklık tablosu bedeli sıklığa bağlıyor. Haftada bir tatbikat ayda 2,53 dakika tutar — planlı işler
payının yüzde 16,89'u ve aylık bütçenin yüzde 5,86'sı. Ayda bir tatbikat 0,63 dakika, üç ayda bir
0,21 dakika. Seyrek tatbikat ucuzdur ama iki tatbikat arasında biriken değişiklikler planı yeniden
eskitir; ölçülen sapma her seferinde sıfırdan büyür. Bu ders sayıyı verir, seçimi vermez: seçim
plandaki adımların ne sıklıkla değiştiğine bağlıdır.

## Tatbikatın Ortaya Çıkardığı İkinci Sorun

Tatbikatın son adımı doğrulamadır: kurtarma bittikten sonra verinin ve devam eden işlerin durumuna
bakmak. Kurtarma süresi ölçüldü, ama devralma penceresinde **yarıda kalan işlere** ne olduğu
sayılmadı. Aşağıdaki düzenek bir **modeldir**: gün sonu ücretlendirme akışı sekiz adımdır, dördü
yan etkilidir (fatura yazmak, muhasebe kaydı açmak, bildirim göndermek, taşıyıcıya haber vermek) ve
devralma penceresi az önce ölçülen 19 turdur.

```js
// tatbikat/is.mjs — tatbikatin veri dogrulama adimi MODELIDIR: devralma penceresinde yarida
// kalan is akislarinin iki politikada ne biraktigi sayilir. Tur soyut bir adimdir.
const ADIM = [                                  // ucretlendirme is akisinin adimlari
  ["durum-oku", false], ["tarife-uygula", false], ["tutar-hesapla", false],
  ["fatura-yaz", true], ["muhasebe-kaydi", true], ["bildirim-gonder", true],
  ["tasiyici-bildir", true], ["kapat", false],
];
const TUR = 70, IS_TUR = 4, BASLANGIC_SON = 40;  // her turda 4 is baslar, 40. tura kadar
const DEVRALMA = 20, PENCERE = 19;               // 19 tur: plan.mjs'te olculen toplam

function kosum(politika) {
  const isler = [];
  const s = { tamamlanan: 0, yinelenenYanEtki: 0, yarimKalan: 0, yenidenBaslayan: 0, atilan: 0 };
  for (let t = 1; t <= TUR; t += 1) {
    const donuk = t >= DEVRALMA && t < DEVRALMA + PENCERE;
    if (t === DEVRALMA) {
      for (const w of isler) {
        if (w.adim === 0 || w.adim >= ADIM.length) continue;   // baslamamis ya da bitmis
        if (politika === "en-az-bir-kez") {
          s.yenidenBaslayan += 1;
          s.yinelenenYanEtki += ADIM.slice(0, w.adim).filter(([, y]) => y).length;
          w.adim = 0;                                          // is bastan calisacak
        } else {
          s.atilan += 1;
          if (ADIM.slice(0, w.adim).some(([, y]) => y)) s.yarimKalan += 1;
          w.olu = true;
        }
      }
    }
    if (donuk) continue;                                       // pencere boyunca is ilerlemiyor
    for (const w of isler) {
      if (w.olu || w.adim >= ADIM.length) continue;
      w.adim += 1;
      if (w.adim === ADIM.length) s.tamamlanan += 1;
    }
    if (t <= BASLANGIC_SON) for (let i = 0; i < IS_TUR; i += 1) isler.push({ adim: 0, olu: false });
  }
  return { ...s, toplam: isler.length };
}

const s = (x, n) => String(x).padStart(n);
console.log(`${TUR} tur, turda ${IS_TUR} is akisi baslar, her akis ${ADIM.length} adim ` +
  `(${ADIM.filter(([, y]) => y).length} tanesi yan etkili). Devralma ${DEVRALMA}. turda, ` +
  `pencere ${PENCERE} tur.`);
console.log();
console.log("politika       | toplam is | tamamlanan | yeniden baslayan | atilan | yinelenen yan etki | yarim kalan");
console.log("---------------|-----------|------------|------------------|--------|--------------------|------------");
for (const p of ["en-az-bir-kez", "en-cok-bir-kez"]) {
  const r = kosum(p);
  console.log(`${p.padEnd(14)} | ${s(r.toplam, 9)} | ${s(r.tamamlanan, 10)} | ` +
    `${s(r.yenidenBaslayan, 16)} | ${s(r.atilan, 6)} | ${s(r.yinelenenYanEtki, 18)} | ${s(r.yarimKalan, 11)}`);
}
```

```
70 tur, turda 4 is akisi baslar, her akis 8 adim (4 tanesi yan etkili). Devralma 20. turda, pencere 19 tur.

politika       | toplam is | tamamlanan | yeniden baslayan | atilan | yinelenen yan etki | yarim kalan
---------------|-----------|------------|------------------|--------|--------------------|------------
en-az-bir-kez  |        84 |         84 |               28 |      0 |                 40 |           0
en-cok-bir-kez |        84 |         56 |                0 |     28 |                  0 |          16
```

İki satır iki kötü sonucu gösteriyor ve arada üçüncü bir seçenek yok. **En az bir kez** teslimde
işlerin hepsi tamamlanıyor: 84/84. Karşılığında devralma anında yarıda olan 28 iş baştan çalışıyor
ve daha önce yürütülmüş yan etkili adımlar **ikinci kez** yürütülüyor — 40 yinelenen yan etki. Bu,
40 fazladan fatura satırı, muhasebe kaydı ya da taşıyıcı bildirimi demektir.

**En çok bir kez** teslimde yineleme yok, ama tamamlanan iş 84'ten 56'ya iniyor: 28 iş atılıyor ve
bunların 16'sı en az bir yan etkili adımı yürütmüş durumda. Yani 16 gönderi için fatura yazılmış ama
muhasebe kaydı açılmamış, ya da bildirim gönderilmiş ama iş kapanmamıştır. Bu işler ne tamamlandı
ne de geri alındı; sistemde iz bıraktılar ve kimse onları toplamıyor.

Kurtarma penceresinin uzunluğu bu sayıları doğrudan büyütüyor. Pencere 19 tur olduğu için 28 iş
yarıda kaldı; plandaki 6 turluk pencerede bu sayı daha küçük olurdu. **Kurtarma süresini kısaltmak
yalnız kesinti bütçesini korumaz, doğruluk hasarını da küçültür** — iki dersin ölçtüğü iki ayrı
büyüklük aynı yerde buluşuyor.

## İki Günün Sayısı

**Arızasız günün bedeli** tatbikatın kendisidir. Ayda bir yapılan tatbikat 38 saniye, yani 0,63 dakika
tutar ve K01'in planlı işlere ayırdığı 15,0 dakikanın yüzde 4,22'sini harcar. Tepe yükte yapılırsa
19.527,82 uç isteği düşer; bu yüzden tatbikat kapsamı zaman penceresini de içerir. Bedel gerçektir
ve gönüllü ödenir.

**Arızalı günün kazancı** iki tabloyu birlikte okumakla çıkar. Tatbikatsız bir düzende plan 12
saniyelik bir kurtarma süresi vaat ediyordu; gerçek arızada ölçülen 38 saniye olacaktı ve 30
saniyelik hedef ilk arızada kırılacaktı. Tatbikat bu farkı, hedefi kırmadan önce görünür kıldı.
Ayrıca planda hiç olmayan bir adımı ortaya çıkardı ve altı adımın dördünün süresinin yanlış
yazıldığını ölçtü. Aynı tatbikat, kurtarma süresiyle hiç ilgisi olmayan bir hasarı da saydı: 40
yinelenen yan etki ya da 16 yarım kalan iş.

Bu karşılaştırma bu kursun kuralının en açık örneğidir. Tatbikat arızasız günde yalnız bedel öder —
0,63 dakika ve 19.527,82 istek. Kazancı yalnız arıza gerçekleştiğinde görünür ve o gün, bilinmeyen
bir sapmayla karşılaşmamak biçiminde ortaya çıkar.

## Özet

- Tatbikat, kurtarma planını denetimli bir arıza denemesiyle sınamaktır; kapsamı hangi birim, hangi
  arıza kipi ve ne kadar süre sorularıyla tanımlanır.
- Planda 6 tur yazan kurtarma tatbikatta 19 tur ölçüldü (3,17 kat); altı adımın dördünün süresi
  yanlış yazılmıştı ve en büyük sapma planda hiç olmayan önbellek ısınmasından geldi.
- Hedef plandan sınanamaz: 30 saniyelik kurtarma süresi hedefi plana göre geçiyor, tatbikatta
  ölçülen 38 saniyeye göre kırılıyor.
- Tatbikatın bedeli sıklığa bağlıdır: ayda bir tatbikat 0,63 dakika (planlı payın yüzde 4,22'si),
  haftada bir 2,53 dakika (yüzde 16,89); tepe yükte her tatbikat 19.527,82 uç isteği düşürür.
- Doğrulama adımı ikinci bir hasarı ortaya çıkardı: 19 turluk pencerede 28 iş akışı yarıda kaldı;
  en az bir kez teslimde hepsi tamamlandı ama 40 yan etki ikinci kez yürüdü, en çok bir kez
  teslimde yineleme olmadı ama 16 iş yarım kaldı.
- Kurtarma penceresini kısaltmak yalnız kesinti bütçesini korumaz; yarıda kalan iş sayısını da
  küçülterek doğruluk hasarını azaltır.

## Sonraki Adım

Tatbikat kurtarma düzenini doğruladı ve aynı zamanda onun sınırını gösterdi. Devralma tamamlandı,
hedefler ölçüldü, yerleşim sınandı — ama son tablo bu konunun hiçbir kalıbıyla çözülemeyen bir şey
bıraktı. **Aynı iş iki kez çalıştı:** 40 yan etkili adım yeniden yürüdü, çünkü yeni etkin kopya
işin nerede kaldığını bilmiyordu ve baştan başlattı. Aynı sorun yalnız devralmada değil, önceki
konudaki yeniden denemede de doğar; her yeniden gönderilen istek daha önce işlenmiş olabilir.
Öteki uçta **yarım kalan iş akışları geri alınmadı:** 16 iş bir yan etki bırakıp durdu ve onları
toplayacak bir adım tasarlanmadı. Sonraki konu bu iki soruyu ele alır: bir isteğin ikinci kez
işlenmesinin zararsız kılınması ve geri alınamayan adımların dengelenmesi.
