---
title: 'İki Ortamlı Dağıtım'
source: 'https://academia.sh/tr/kurslar/ci-cd/iki-ortamli-dagitim'
course: 'Sürekli Tümleştirme ve Teslimat'
language: tr
updated: '2026-08-17T18:09:03+00:00'
license: 'CC BY-SA 4.0'
---

# İki Ortamlı Dağıtım

Geri almanın tur maliyeti ile iki tam ortamı ayakta tutmanın sürekli bedeli birlikte sayılır: geri alma penceresi taranır, geçiş anında kesilen oturum ve uzun süren iş ölçülür, paylaşılan veri katmanında geri almanın geri almadığı satırlar gösterilir.

Önceki ölçüm bir varsayıma yaslanıyordu: geri alma anında ve bedelsizdir. Kapı "geri al" dediği
anda modelde hiçbir şey olmuyordu. Bu ders o varsayımı kaldırır. Geri almanın bir turu, bir
fiyatı ve bir sınırı vardır — ve fiyatın büyük kısmı geri alma **hiç gerekmediğinde** de ödenir.

İki ortamlı dağıtımın vaadi tek cümledir: yeni sürüm eski sürümün yanında ayağa kalkar, trafik
tek anahtarla çevrilir, bir şey ters giderse anahtar geri çevrilir. Bu vaadin karşılığı, aynı işi
yapan iki tam ortamın bir süre birlikte ayakta durmasıdır. Bu derste kapı **geri alma
kararıdır**: kararın kaç tur sürdüğü, hangi durumda tek tura indiği ve o tek turun neyi
kapsamadığı ölçülür.

- **YS19.** Kurgusal bölgesel ölçüm ağının iş emri servisi on altı kopyayla çalışır; altmış yayın
  ölçülür ve bir dağıtım turu üç dakikadır. Ağ da rakamlar da kurgudur.
- **YS20.** Yayınların yüzde otuzu kusurludur. Kusurun görünme süresi üstel dağılır, ortalaması
  yirmi beş dakikadır. Kusurun hangi ölçütle görüldüğü ayrı bir ölçünün konusudur; burada yalnız
  görünme anı modellenir.
- **YS21.** İkinci ortam anahtar çevrilmeden on iki dakika önce ayağa kalkar ve geri alma
  penceresi boyunca ayakta kalır. Pencere kapandıktan sonra geri alma yeniden yayın demektir:
  beş tur.
- **YS22.** Aşamalı düzen dört fazladan kopyayla elli dakikada beş adım tırmanır; geri alma o ana
  kadar tırmanılan adım kadar tur sürer.
- **YS23.** Geçiş anında üç iş birimi sınıfı vardır ve süreleri üstel dağılır. Oturum
  yapışkanlığının yeni ortama taşınması modellenmiyor; ölçülen şey taşınmadığında kesilenin
  sayısıdır.
- **YS24.** Veri katmanı iki ortam arasında paylaşılır. Yazma hızı dakikada yüz kırk satır, geri
  alma sonrası satırların yüzde otuz beşi güncellenir. Göç sırası ve geriye uyumlu yazma bu
  dersin konusu değildir.

## Ölçüm Düzeneği

Ölçülen şey gerçek bir küme değil, `node` ile kurulan bir modeldir. Model üç ayrı şeyi taşır:
bir yayın dizisinin kaynak bedeli ve geri alma turları, anahtar çevrildiği anda uçuşta olan iş
birimleri, ve paylaşılan veri katmanına yazılan satırlar. Rastgelelik üreteci kendi yazılmıştır,
tohumu görünürdür.

```js
// ikiortam.mjs — iki ortamli dagitimin maliyet ve gecis modeli; gercek kume degil, bir modeldir
export const TOHUM = 20260904;
export const KOPYA = 16, YAYIN = 60, TUR_DK = 3, HAZIRLIK_DK = 12, YENIDEN_TUR = 5;
export const ASAMALI_EK = 4, ASAMALI_SURE = 50, ASAMALI_ADIM = 5;
export const KUSUR_ORT = 25, PENCERE_DK = 30;     // kusurun gorunme suresi ust ustel dagilir

export function uretec(tohum) {                    // dogrusal eslesik uretec, tohum gorunur
  let x = tohum >>> 0;
  return () => { x = (Math.imul(x, 1664525) + 1013904223) >>> 0; return x / 4294967296; };
}
export const ustel = (rnd, ort) => -ort * Math.log(1 - rnd());

// Yayin dizisi: her yayinin kusurlu olup olmadigi ve kusurun kacinci dakikada gorundugu.
export function yayinlar(rnd, bozukOran = 0.30) {
  return Array.from({ length: YAYIN }, (_, i) => ({
    no: i + 1, bozuk: rnd() < bozukOran, gorunme: ustel(rnd, KUSUR_ORT),
  }));
}

// Iki ortamli duzen: eski ortam anahtar cevrildikten sonra pencere boyunca ayakta tutulur.
export function ikiOrtamli(liste, pencere) {
  let kopyaDk = 0, tur = 0, pencereIci = 0, pencereDisi = 0;
  for (const y of liste) {
    kopyaDk += KOPYA * (HAZIRLIK_DK + pencere);    // ikinci ortamin ayakta durdugu sure
    if (!y.bozuk) continue;
    if (y.gorunme <= pencere) { tur += 1; pencereIci += 1; }
    else { tur += YENIDEN_TUR; pencereDisi += 1; }
  }
  const bozuk = liste.filter((y) => y.bozuk).length;
  return { ad: `iki ortamli (pencere ${pencere} dk)`, kopyaDk, pencereIci, pencereDisi,
    ortTur: bozuk ? tur / bozuk : 0, geriDk: bozuk ? tur * TUR_DK / bozuk : 0 };
}

// Asamali duzen: fazladan kopya yayin suresince ayakta; geri alma o ana kadar tirmanilan adim kadar tur.
export function asamali(liste) {
  let kopyaDk = 0, tur = 0;
  for (const y of liste) {
    kopyaDk += ASAMALI_EK * ASAMALI_SURE;
    if (!y.bozuk) continue;
    const adim = Math.min(ASAMALI_ADIM, 1 + Math.floor(y.gorunme / (ASAMALI_SURE / ASAMALI_ADIM)));
    tur += adim;
  }
  const bozuk = liste.filter((y) => y.bozuk).length;
  return { ad: 'asamali (tek ortam)', kopyaDk, pencereIci: 0, pencereDisi: bozuk,
    ortTur: bozuk ? tur / bozuk : 0, geriDk: bozuk ? tur * TUR_DK / bozuk : 0 };
}

// Gecis ani: anahtar cevrildiginde ucusta olan is birimleri. Uc sinif, ust ustel sure.
export const SINIFLAR = [
  { ad: 'kisa istek', hiz: 300, ort: 0.04 },       // hiz: dakikada baslayan birim
  { ad: 'oturum', hiz: 8, ort: 12 },
  { ad: 'uzun suren is', hiz: 0.5, ort: 25 },
];

export function ucustakiler(rnd, sinif, T = 240) {  // T dakikalik isinma, anahtar T aninda
  const acik = [];
  for (let dk = 0; dk < T; dk += 1) {
    for (let k = 0; k < sinif.hiz; k += 1) {
      const bas = dk + rnd(), sure = ustel(rnd, sinif.ort);
      if (bas + sure > T) acik.push({ bas, bitis: bas + sure });
    }
  }
  return acik;
}

// Paylasilan veri katmani: yeni surum yeni bicimde yazar, geri alma kodu geri alir, satiri almaz.
export function veriKatmani(rnd, acikDk, yazmaHizi = 140, gunceleme = 0.35) {
  let yeniBicim = 0, sonraGuncellenen = 0;
  for (let dk = 0; dk < acikDk; dk += 1) {
    for (let k = 0; k < yazmaHizi; k += 1) {
      yeniBicim += 1;
      if (rnd() < gunceleme) sonraGuncellenen += 1;  // geri alma sonrasi eski surumce guncellenen
    }
  }
  return { yeniBicim, kayip: sonraGuncellenen, sessiz: yeniBicim - sonraGuncellenen };
}
```

Modelin ayarı `pencere`: eski ortamın anahtar çevrildikten sonra kaç dakika daha ayakta
tutulacağı. Bu tek sayı hem geri almanın tur maliyetini hem de düzenin sürekli bedelini
belirler, ve ikisini ters yönde belirler.

## Kaynak Bedeli ve Geri Alma Turu

```js
// kosum1.mjs — iki duzenin kaynak bedeli ve geri alma tur maliyeti; geri alma penceresi taranir
import { uretec, yayinlar, ikiOrtamli, asamali, TOHUM, KOPYA, YAYIN, TUR_DK, PENCERE_DK, KUSUR_ORT } from './ikiortam.mjs';

const l = yayinlar(uretec(TOHUM));
const bozuk = l.filter((y) => y.bozuk).length;
console.log(`tohum ${TOHUM} | ${YAYIN} yayin, ${KOPYA} kopya, ${bozuk} yayin kusurlu`);
console.log(`kusurun gorunme suresi ust ustel, ortalama ${KUSUR_ORT} dk | bir tur ${TUR_DK} dk\n`);
console.log('duzen                        kopya-dk  pencere ici  pencere disi  ort tur  ort geri alma');
for (const s of [ikiOrtamli(l, PENCERE_DK), asamali(l)]) {
  console.log(`${s.ad.padEnd(28)} ${String(s.kopyaDk).padEnd(9)} ${String(s.pencereIci).padEnd(12)} ` +
    `${String(s.pencereDisi).padEnd(13)} ${s.ortTur.toFixed(2).padEnd(8)} ${s.geriDk.toFixed(1)} dk`);
}
console.log('\ngeri alma penceresi taranir (iki ortamli duzen):');
console.log('pencere  kopya-dk  tek anahtarla  yeniden yayinla  ort tur  ort geri alma  fazladan kopya-dk');
for (const p of [0, 5, 15, 30, 60, 120, 240]) {
  const s = ikiOrtamli(l, p), a = asamali(l);
  console.log(`${`${p} dk`.padEnd(8)} ${String(s.kopyaDk).padEnd(9)} ${String(s.pencereIci).padEnd(14)} ` +
    `${String(s.pencereDisi).padEnd(16)} ${s.ortTur.toFixed(2).padEnd(8)} ${`${s.geriDk.toFixed(1)} dk`.padEnd(14)} ${s.kopyaDk - a.kopyaDk}`);
}
```

```
tohum 20260904 | 60 yayin, 16 kopya, 18 yayin kusurlu
kusurun gorunme suresi ust ustel, ortalama 25 dk | bir tur 3 dk

duzen                        kopya-dk  pencere ici  pencere disi  ort tur  ort geri alma
iki ortamli (pencere 30 dk)  40320     11           7             2.56     7.7 dk
asamali (tek ortam)          12000     0            18            2.78     8.3 dk

geri alma penceresi taranir (iki ortamli duzen):
pencere  kopya-dk  tek anahtarla  yeniden yayinla  ort tur  ort geri alma  fazladan kopya-dk
0 dk     11520     0              18               5.00     15.0 dk        -480
5 dk     16320     3              15               4.33     13.0 dk        4320
15 dk    25920     8              10               3.22     9.7 dk         13920
30 dk    40320     11             7                2.56     7.7 dk         28320
60 dk    69120     17             1                1.22     3.7 dk         57120
120 dk   126720    18             0                1.00     3.0 dk         114720
240 dk   241920    18             0                1.00     3.0 dk         229920
```

Üst tablo vaadi sınırlıyor. Otuz dakikalık pencerede on sekiz kusurlu yayının yalnız on biri tek
anahtarla geri alındı; yedisi pencere kapandıktan sonra görüldü ve beş turluk yeniden yayın
istedi. Ortalama geri alma turu iki virgül elli altı, aşamalı düzende iki virgül yetmiş sekiz.
İki düzen arasındaki fark bu ayarda yüzde sekiz. Karşılığında iki ortamlı düzen üç kat kaynak
tüketti: kırk bin üç yüz yirmi kopya-dakikaya karşı on iki bin.

"Anında geri alma" cümlesi, pencerenin kusurun görünme süresinden uzun tutulmasıyla sayıya
dönüşüyor. Tarama fiyatı gösteriyor. Altmış dakikalık pencerede on sekiz kusurun on yedisi tek
turda geri alındı, ortalama tur bir virgül yirmi ikiye indi — fazladan elli yedi bin yüz yirmi
kopya-dakika. Yüz yirmi dakikada tamamı tek tura indi, fazladan bedel yüz on dört bin yedi yüz
yirmi kopya-dakika. Kazanılan her tur bir fiyat taşıyor: otuz dakikalık pencerede kırk dört tur
kısaldı ve bunun bedeli tur başına altı yüz kırk üç kopya-dakika oldu.

İlk satır ters yönden aynı şeyi söylüyor. Pencere sıfır olduğunda iki ortamlı düzen aşamalı
düzenden **ucuz** (on bir bin beş yüz yirmiye karşı on iki bin), çünkü ikinci ortam yalnız on iki
dakikalık hazırlık için ayakta. Ama o düzende hiçbir yayın tek anahtarla geri alınamadı; ortalama
tur beşe çıktı. Eski ortamı kapatmakla iki ortamlı dağıtımın tek gerekçesi de kapanıyor.

## Geçiş Anında Kesilen İş

```js
// kosum2.mjs — gecis aninda kesilen durum tasiyan istekler ve paylasilan veri katmani
import { uretec, ucustakiler, veriKatmani, SINIFLAR, TOHUM, KOPYA } from './ikiortam.mjs';

const acik = SINIFLAR.map((s) => ({ s, liste: ucustakiler(uretec(TOHUM + s.hiz), s) }));
console.log('anahtar cevrildigi anda ucusta olan is birimleri:');
for (const { s, liste } of acik) console.log(`  ${s.ad.padEnd(15)} ${String(liste.length).padStart(5)} birim (ortalama sure ${s.ort} dk)`);

console.log('\nbosaltma suresi taranir: sure sonunda hala calisan birim kesilir');
console.log('bosaltma  kisa istek  oturum  uzun suren is  kesilen toplam  iki ortam birlikte');
for (const d of [0, 0.5, 1, 5, 15, 30]) {
  const k = acik.map(({ liste }) => liste.filter((u) => u.bitis > 240 + d).length);
  console.log(`${`${d} dk`.padEnd(9)} ${String(k[0]).padEnd(11)} ${String(k[1]).padEnd(7)} ${String(k[2]).padEnd(14)} ` +
    `${String(k[0] + k[1] + k[2]).padEnd(15)} ${2 * KOPYA * d} kopya-dk`);
}

const v = veriKatmani(uretec(TOHUM + 11), 11);
console.log('\npaylasilan veri katmani: anahtar cevrildi, 11. dakikada geri alindi');
console.log(`  yeni bicimde yazilan satir: ${v.yeniBicim}`);
console.log(`  geri alma turu: 1 (kod) | veri icin geri alinan satir: 0`);
console.log(`  geri alma sonrasi eski surumce guncellenip yeni alani silinen satir: ${v.kayip}`);
console.log(`  yeni alani duran, eski surumun gormedigi satir: ${v.sessiz}`);
```

```
anahtar cevrildigi anda ucusta olan is birimleri:
  kisa istek         10 birim (ortalama sure 0.04 dk)
  oturum             89 birim (ortalama sure 12 dk)
  uzun suren is      24 birim (ortalama sure 25 dk)

bosaltma suresi taranir: sure sonunda hala calisan birim kesilir
bosaltma  kisa istek  oturum  uzun suren is  kesilen toplam  iki ortam birlikte
0 dk      10          89      24             123             0 kopya-dk
0.5 dk    0           88      24             112             16 kopya-dk
1 dk      0           86      24             110             32 kopya-dk
5 dk      0           68      20             88              160 kopya-dk
15 dk     0           31      14             45              480 kopya-dk
30 dk     0           7       5              12              960 kopya-dk

paylasilan veri katmani: anahtar cevrildi, 11. dakikada geri alindi
  yeni bicimde yazilan satir: 1540
  geri alma turu: 1 (kod) | veri icin geri alinan satir: 0
  geri alma sonrasi eski surumce guncellenip yeni alani silinen satir: 491
  yeni alani duran, eski surumun gormedigi satir: 1049
```

Anahtar çevrildiği anda uçuşta yüz yirmi üç iş birimi vardı. Bunların onu kısa istek, seksen
dokuzu oturum, yirmi dördü uzun süren iş. Yarım dakikalık boşaltma kısa isteklerin tamamını
kurtardı — ve oturumların yalnız birini. Bir dakikalık boşaltma seksen dokuzu seksen altıya
indirdi, uzun süren işlerin hiçbirine dokunmadı.

Sebep ölçek farkıdır. Boşaltma süresi kısa isteğin ömrüne göre ayarlanır; oturum on iki, uzun
süren iş yirmi beş dakika yaşar — iki-üç mertebe üstünde. Yüz yirmi üç birimin on ikiye inmesi
otuz dakikalık boşaltma istiyor, ve o otuz dakika boyunca iki sürüm aynı veri katmanına birlikte
yazıyor. Kesintisiz geçişin bedeli yalnız dokuz yüz altmış kopya-dakika değil; iki sürümün aynı
anda yazdığı bir yarım saattir.

Bir hesap daha yapılmalı. Her geçiş seksen dokuz oturum kesiyorsa, **temiz bir sürümün boşuna
geri alınması** iki geçiş demektir: yüz yetmiş sekiz oturum ve kırk sekiz uzun süren iş. Yanlış
geri almanın bedeli, kusurun kendisinin bedelinden büyük olabilir — ve yanlış geri almanın kaç
kez olduğu, geri alma kararının değil ondan önceki kapının ayarına bağlıdır.

## Geri Almanın Geri Almadığı

Son blok tek anahtarın sınırını gösteriyor. Anahtar çevrildi, on birinci dakikada kusur görüldü,
geri alma bir turda tamamlandı. Kod eski sürüme döndü. O on bir dakikada paylaşılan veri
katmanına bin beş yüz kırk satır yeni biçimde yazılmıştı; geri alma bunların **sıfırını** geri
aldı.

İki ayrı zarar var. Dört yüz doksan bir satır, geri almadan sonra eski sürüm tarafından
güncellendi; eski sürüm yeni alanı tanımadığı için o alan yazma sırasında düştü ve bilgi kalıcı
olarak kayboldu. Kalan bin kırk dokuz satır yeni alanını taşımaya devam ediyor; eski sürüm
onları görmüyor, dolayısıyla sessizler — ama yeni sürüm geri geldiğinde bu iki küme arasında
biçim ayrımı olacak.

İki ortamlı dağıtım **kodun** geri alınmasını tek tura indirir. Veri katmanı paylaşıldığında geri
alma kapsamı kodla sınırlıdır ve o sınır tur maliyetinde hiç görünmez: bir turluk geri alma, bin
beş yüz kırk satırlık bir kalıntı bırakabilir.

## Kapının Üç Sayısı

**Tuttuğu:** on sekiz kusurlu yayının hepsi sonunda geri alındı. **Yalnız kendisinin tuttuğu:**
otuz dakikalık pencerede on bir yayının tek turda geri alınması — bu yalnız eski ortam ayaktayken
mümkündür ve toplam kırk dört tur, yani yüz otuz iki dakika kazandırdı. Marjinalin fiyatı tur
başına altı yüz kırk üç kopya-dakikadır.

**Kaçırdığı:** pencere kapandıktan sonra görülen yedi yayın, ve her geri almada veri katmanına
yazılmış satırlar — örnek yayında bin beş yüz kırk satır, dört yüz doksan biri kalıcı kayıp.
**Yanlış tuttuğu:** temiz bir sürümün geri alınması iki geçiş, yüz yetmiş sekiz oturum ve kırk
sekiz uzun süren iş demektir. **Eklediği süre:** yayın başına on iki dakika hazırlık artı pencere
süresi; kesintisiz geçiş için otuz dakikaya kadar boşaltma; toplam kırk bin üç yüz yirmi
kopya-dakika.

## Özet

- Otuz dakikalık pencerede on sekiz kusurlu yayının on biri tek anahtarla, yedisi beş turluk
  yeniden yayınla geri alındı; ortalama tur iki virgül elli altı, aşamalı düzende iki virgül
  yetmiş sekiz.
- Kaynak bedeli üç kat: kırk bin üç yüz yirmi kopya-dakikaya karşı on iki bin. Pencereyi yüz
  yirmi dakikaya çıkarmak tüm yayınları tek tura indiriyor, fazladan bedeli yüz on dört bin yedi
  yüz yirmi kopya-dakika.
- Pencere sıfır olduğunda iki ortamlı düzen aşamalıdan ucuz çıkıyor ama tek anahtarla geri
  alınabilen yayın kalmıyor: eski ortamı kapatmak kalıbın gerekçesini de kapatıyor.
- Geçiş anında yüz yirmi üç iş birimi uçuştaydı. Yarım dakikalık boşaltma kısa isteklerin
  tamamını kurtardı, seksen dokuz oturumun yalnız birini; on ikiye inmek otuz dakikalık boşaltma
  ve iki sürümün yarım saat birlikte yazması demek.
- Paylaşılan veri katmanında bir turluk geri alma bin beş yüz kırk satırın sıfırını geri aldı;
  dört yüz doksan biri eski sürümce güncellenip kalıcı olarak kayboldu.
- Temiz bir sürümün boşuna geri alınması iki geçiş, yüz yetmiş sekiz oturum ve kırk sekiz uzun
  süren iş kesintisi demektir; bu sayı geri alma kapısının değil, ondan önceki kapının ayarına
  bağlıdır.

## Sonraki Adım

Bu dersin bütün ölçümleri tek bir zorunluluğa dayanıyordu: yeni davranışı açmak için yeni sürümü
trafiğe koymak gerekiyor, geri almak için de trafikten çekmek. Yayın ile davranışın açılması aynı
işlem olduğu sürece geri alma hep bir dağıtım işidir — turu, geçiş anı ve veri kalıntısı vardır.
Bu ikisi ayrılabilir. Davranış kodda taşınıp bir kayıtla kapalı tutulursa, açma ve kapama artık
dağıtım değil bir ayar değişikliğidir; geri alma tur maliyeti sıfıra yaklaşır. Sonraki ders bu
ayrımı ölçer: ayrımın kazandırdığı turu, açma kararının kendi kapısını, ve kapalı kalan her
kaydın zamanla biriktirdiği borcu.
