---
title: 'Dağıtım Kalıpları'
source: 'https://academia.sh/tr/kurslar/orkestrasyon/dagitim-kaliplari'
course: 'Konteyner Orkestrasyonu'
language: tr
updated: '2026-08-17T18:09:09+00:00'
license: 'CC BY-SA 4.0'
---

# Dağıtım Kalıpları

Aşamalı güncelleme, iki ortamlı geçiş ve kanarya aynı kusurlu sürüm dizisinde koşturulur: kaçan hatanın etkilediği istek, fark etmeden geçen tur, ayakta tutulan tepe kapasite ve geri almanın tur maliyeti sayılır. Kanaryada örneklem büyüklüğü taranır.

Yerleştirme ve ölçekleme kararları sisteme devredildi: hangi düğümün hangi kapsülü alacağına
zamanlayıcı, kaç kopyanın duracağına ölçekleme denetleyicisi karar veriyor. İkisi de ortak bir
varsayıma yaslanır — ortada **çalışan** bir sürüm vardır. Devredilmemiş iki karar kaldı. Yeni bir
sürüm kümeye **nasıl girer**, ve ayağa kalkan bir kopyanın **gerçekten hizmet verip vermediğine**
kim bakar. Bu ders birincisini ölçer.

Yayın mekaniği daha önce ölçüldü: havuz değiştiğinde düşen istek, uçuştaki isteklerin bağlantı
boşaltmayla kurtarılması, sert ve zarif kapanmanın farkı. O ölçümler burada tekrarlanmıyor.
Buranın sorusu bir adım sonrasıdır: yayın sırasında **tek bir istek bile düşmese** kalıplar
birbirinden ayrılır mı? Ayrılır — ama ayrıldıkları yer kesinti değil, **yeni sürümün bozuk olduğu
durumdur**. Her dağıtımın bir miktar kaçan hata ürettiği ölçülmüş bir sonuçtur; bu ders o sonucu
kalıp seçimine bağlar ve üç kalıbı aynı kusurlu sürüm dizisinde koşturur.

Devredilen karar şudur: eski sürümü ne zaman durdurup yeniyi ne kadar trafiğe açacağına insan
değil bir denetleyici karar verir. Denetleyicinin bunun için bilmesi gereken kalemler dörttür:
hangi kopya hangi sürümde, kopya hazır mı, hata oranı ne, eşik aşılınca ne yapılacak. Sonuncusu
tanımlı değilse denetleyici ilerlemeye devam eder — bilmediği için değil, **durması söylenmediği
için**.

- **OI1.** Küme, kurgusal bölgesel ölçüm ağının doğrulayıcı servisini on iki kopyayla çalıştırır;
  tur başına altı yüz istek gelir. Ağ da rakamlar da kurgudur.
- **OI2.** Kusurlu sürüm, kendisine gelen isteğin yüzde altısında hata verir. Kusur ilk istekten
  başlar ve sürüm boyunca sabittir; ısınmayla geçen kusurlar bu modelin dışındadır.
- **OI3.** Gözlemci turun sonunda bakar. Bir turdan kısa gecikmeler, ölçüt toplama gecikmesi ve
  uyarı kanalının kendi gecikmesi modellenmiyor.
- **OI4.** Alarm eşiği yüzde bir buçuktur ve kümenin olağan hata payının üstünde seçilmiştir;
  eşiğin nereden geldiği bu dersin konusu değil.
- **OI5.** Geri alma turları boyunca yeni sürümün payı eşit adımlarla sıfıra iner; geri almanın
  kendisi hata üretmez.
- **OI6.** Ufuk on iki turdur. Bu süre içinde alarm çalmazsa kusur kaçmış sayılır.

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

Ölçülen şey gerçek bir küme değil, `node` ile kurulan bir modeldir. Model üç şeyi taşır: bir
kalıbın tur tur hangi paylaşımı ürettiği, isteklerin bu paya göre dağılması, ve gözlemcinin turun
sonunda ne gördüğü. Rastgelelik üreteci kendi yazılmıştır, tohumu görünürdür.

```js
// kalip.mjs — uc dagitim kalibinin tur tabanli modeli; gercek kume degil, bir modeldir
export const TOHUM = 20260801;
export const HIZMET = 12, TUR_ISTEK = 600, HATA_ORANI = 0.06, ESIK = 0.015, UFUK = 12;

export function uretec(tohum) {                    // dogrusal eslesik uretec, tohum gorunur
  let x = tohum >>> 0;
  return () => { x = (Math.imul(x, 1664525) + 1013904223) >>> 0; return x / 4294967296; };
}

// Her adim: yeni surumde hizmet veren kopya, eski surumde hizmet veren kopya,
// o an ayakta tutulan toplam kopya, alarm bu turda calarsa geri almanin tur maliyeti.
export const asamali = { ad: 'asamali guncelleme', plan: [
  { yeni: 3, eski: 9, ayakta: 15, geri: 1 }, { yeni: 6, eski: 6, ayakta: 15, geri: 2 },
  { yeni: 9, eski: 3, ayakta: 15, geri: 3 }, { yeni: 12, eski: 0, ayakta: 12, geri: 4 } ] };

export const ikiOrtam = { ad: 'iki ortamli gecis', plan: [
  { yeni: 0, eski: 12, ayakta: 24, geri: 0 }, { yeni: 12, eski: 0, ayakta: 24, geri: 1 },
  { yeni: 12, eski: 0, ayakta: 12, geri: 3 } ] };

export const kanarya = (k, gozlem = 3) => ({ ad: `kanarya (ornek ${k})`, plan: [
  ...Array.from({ length: gozlem }, () => ({ yeni: k, eski: 12, ayakta: 12 + k, geri: 1 })),
  { yeni: 12, eski: 0, ayakta: 24, geri: 1 }, { yeni: 12, eski: 0, ayakta: 12, geri: 3 } ] });

export function kostur({ ad, plan }, etiketli = false) {
  const rnd = uretec(TOHUM);
  let i = 0, alarm = 0, kalan = 0, pay = 0, maliyet = 0, tepe = HIZMET;
  let hatali = 0, dokunulan = 0, adim = { yeni: 0, eski: HIZMET, ayakta: HIZMET, geri: 0 };
  for (let tur = 1; tur <= UFUK; tur += 1) {
    if (kalan > 0) { adim = { ...adim, yeni: Math.max(0, adim.yeni - pay), eski: HIZMET }; kalan -= 1; }
    else if (alarm) adim = { yeni: 0, eski: HIZMET, ayakta: HIZMET, geri: 0 };
    else { adim = plan[Math.min(i, plan.length - 1)]; i += 1; }
    tepe = Math.max(tepe, adim.ayakta);
    let hataTur = 0, yeniTur = 0;
    const oran = adim.yeni / (adim.yeni + adim.eski);
    for (let r = 0; r < TUR_ISTEK; r += 1) {
      if (rnd() >= oran) continue;                 // istek eski surume gitti
      yeniTur += 1;
      if (rnd() < HATA_ORANI) hataTur += 1;
    }
    hatali += hataTur; dokunulan += yeniTur;
    if (!alarm) {                                  // gozlemci turun sonunda bakar
      const gorulen = etiketli ? (yeniTur ? hataTur / yeniTur : 0) : hataTur / TUR_ISTEK;
      const yeterli = !etiketli || yeniTur >= 100;
      if (yeterli && gorulen > ESIK) { alarm = tur; maliyet = adim.geri; kalan = maliyet; pay = Math.ceil(adim.yeni / Math.max(1, maliyet)); }
    }
  }
  return { ad, alarm, maliyet, pencere: alarm ? alarm - 1 : UFUK, tepe, hatali, dokunulan };
}
```

Üç kalıbın planı arasındaki bütün fark üç sütunda toplanıyor. Aşamalı güncelleme yeni sürümü
üçerli paylarla açar ve geçiş boyunca üç kopya fazladan ayakta tutar. İki ortamlı geçiş yeni
sürümün tamamını trafiğe açmadan ayağa kaldırır — ilk turda payı sıfırdır, ayakta yirmi dört kopya
vardır — sonra tek adımda çevirir. Kanarya küçük bir örneklemi trafiğe açar, birkaç tur bekler ve
alarm çalmazsa terfi eder.

## Üç Kalıp, Tek Kusurlu Sürüm

```js
// kosum1.mjs — ayni kusurlu surum dizisi uc kalipta kosturulur
import { kostur, asamali, ikiOrtam, kanarya, TOHUM, HIZMET, TUR_ISTEK, HATA_ORANI, ESIK, UFUK } from './kalip.mjs';

console.log(`tohum ${TOHUM} | ${HIZMET} kopya, tur basina ${TUR_ISTEK} istek, ufuk ${UFUK} tur`);
console.log(`kusurlu surum: yeni surume giden istegin %${HATA_ORANI * 100}'si hata veriyor`);
console.log(`gozlemci: kume genelinde hata orani %${ESIK * 100}'i asarsa alarm\n`);
console.log('kalip                  alarm turu  fark etmeden  hatali istek  dokunulan  tepe kopya  geri alma turu');
for (const k of [asamali, ikiOrtam, kanarya(2)]) {
  const s = kostur(k);
  console.log(`${s.ad.padEnd(22)} ${String(s.alarm || '-').padEnd(11)} ${String(s.pencere).padEnd(13)} ` +
    `${String(s.hatali).padEnd(13)} ${String(s.dokunulan).padEnd(10)} ${String(s.tepe).padEnd(11)} ${s.maliyet || '-'}`);
}
```

```
tohum 20260801 | 12 kopya, tur basina 600 istek, ufuk 12 tur
kusurlu surum: yeni surume giden istegin %6'si hata veriyor
gozlemci: kume genelinde hata orani %1.5'i asarsa alarm

kalip                  alarm turu  fark etmeden  hatali istek  dokunulan  tepe kopya  geri alma turu
asamali guncelleme     2           1             33            555        15          2
iki ortamli gecis      2           1             30            600        24          1
kanarya (ornek 2)      4           3             53            851        24          1
```

Üç kalıp da aynı kusuru taşıdı, üçü de fark etti, ama bedelleri farklı yerlerde birikti.

Aşamalı güncelleme ilk turda yeni sürüme dörtte bir pay verdi; bu payda kümenin toplam hata oranı
eşiğin tam üstüne çıkmadı, alarm ikinci turda çaldı. İki ortamlı geçiş ilk turda hiç pay vermedi,
ikinci turda tamamını verdi — alarm da aynı turda çaldı, ama o tek turda **altı yüz isteğin
hepsi** kusurlu sürüme gitti. Aşamalıda aynı sürede beş yüz elli beş istek dokunuldu; fark küçük
görünüyor, çünkü aşamalı da ikinci turda yarı yarıya paylaşıyordu.

Ayrılık asıl iki sütunda. Tepe kapasite: aşamalı on beş kopyayla geçti, iki ortamlı yirmi dört —
yani geçiş anında kümenin yeni sürüm için **bir kat fazladan yer** bulması gerekti. Geri alma
maliyeti tersine döndü: iki ortamlı geçişte geri alma tek turdur, çünkü eski sürüm hâlâ ayaktadır;
aşamalıda ikinci turda yakalanan kusur iki tur geri alma ister, dördüncü turda yakalansaydı dört.
Aşamalı güncelleme ilerledikçe geri alma pahalılaşır; iki ortamlı geçişte pahalılaşma **bir anda**
olur — eski ortam kapatıldığı turda geri alma bir turdan üç tura sıçrar.

Kanarya satırı bu tablonun sürprizidir. İki kopyalık örneklem, üç gözlem turu boyunca kümenin
toplam hata oranını eşiğin altında tuttu: on dört hizmet veren kopyanın ikisi kusurluysa toplam
hata oranı yüzde bir civarındadır, eşik yüzde bir buçuktur. Gözlemci bir şey görmedi, kanarya
terfi etti ve dördüncü turda tamamı açıldı. Kaçan hatanın dokunduğu istek sekiz yüz elli bir —
üç kalıbın en kötüsü. Kanarya, örneklemi yanlış seçildiğinde kusuru yakalayan değil, **yakalamayı
geciktirip sonra tamamına açan** kalıp hâline gelir.

## Örneklem Büyüklüğü

Bu yüzden kanaryanın tek ayarı taranmalı. Aynı model iki gözlemciyle koşturulur: birincisi
kümenin toplam hata oranına bakar, ikincisi istekleri sürüme göre ayırır ve yalnız yeni sürümün
hata oranına bakar. İkincisi ek bir bilgi kalemi ister — her isteğin hangi sürüme gittiği — ve
karar verebilmek için turda yeterli istek görmesi gerekir.

```js
// kosum2.mjs — kanaryada ornek buyuklugu taranir; ikinci gozlemci istekleri surume gore ayirir
import { kostur, kanarya, TUR_ISTEK } from './kalip.mjs';

console.log('ornek  kume genelinde bakan gozlemci          surume gore ayiran gozlemci');
console.log('kopya  alarm  fark etmeden  hatali  dokunulan  alarm  fark etmeden  hatali  dokunulan');
for (const k of [1, 2, 3, 4, 6, 8]) {
  const t = kostur(kanarya(k)), e = kostur(kanarya(k), true);
  const yaz = (s) => `${String(s.alarm || '-').padEnd(6)} ${String(s.pencere).padEnd(13)} ` +
    `${String(s.hatali).padEnd(7)} ${String(s.dokunulan).padEnd(10)}`;
  console.log(`${String(k).padEnd(6)} ${yaz(t)} ${yaz(e)}`);
}
console.log(`\ngozlem turunda kanaryaya dusen istek: ornek k icin ${TUR_ISTEK} x k/(12+k)`);
console.log('surume gore ayiran gozlemci turda en az 100 istek gormeden karar vermiyor');
for (const k of [1, 2, 3, 4, 6, 8]) {
  console.log(`  ornek ${k}: ${Math.round(TUR_ISTEK * k / (12 + k))} istek/tur` +
    ` -> ${TUR_ISTEK * k / (12 + k) >= 100 ? 'karar verebilir' : 'ornek yetersiz'}`);
}
```

```
ornek  kume genelinde bakan gozlemci          surume gore ayiran gozlemci
kopya  alarm  fark etmeden  hatali  dokunulan  alarm  fark etmeden  hatali  dokunulan
1      4      3             42      730        4      3             42      730       
2      4      3             53      851        4      3             53      851       
3      4      3             55      948        1      0             7       107       
4      3      2             24      461        1      0             8       147       
6      1      0             11      191        1      0             11      191       
8      1      0             14      243        1      0             14      243       

gozlem turunda kanaryaya dusen istek: ornek k icin 600 x k/(12+k)
surume gore ayiran gozlemci turda en az 100 istek gormeden karar vermiyor
  ornek 1: 46 istek/tur -> ornek yetersiz
  ornek 2: 86 istek/tur -> ornek yetersiz
  ornek 3: 120 istek/tur -> karar verebilir
  ornek 4: 150 istek/tur -> karar verebilir
  ornek 6: 200 istek/tur -> karar verebilir
  ornek 8: 240 istek/tur -> karar verebilir
```

Sol yarı tek başına okunduğunda kanaryanın kötü bir kalıp olduğu sonucuna götürür. Bir, iki ve üç
kopyalık örneklemlerde alarm dördüncü turda — yani terfiden **sonra** — çaldı; dokunulan istek
örneklem büyüdükçe arttı, çünkü kaçırma süresi aynı kalıp gözlem payı büyüdü. Dört kopyada alarm
üçüncü tura, altı ve sekiz kopyada birinci tura çekildi. Toplam hasarın en düşük olduğu yer sekiz
değil altı: sekiz kopyalık örneklem birinci turda yakalasa da o tek turda iki yüz kırk üç isteğe
dokundu, altı kopyalık örneklem yüz doksan bire.

Sağ yarı, taramanın asıl sonucunu veriyor. Sürüme göre ayıran gözlemci üç ve dört kopyalık
örneklemlerde birinci turda alarm verdi; hatalı istek yediye ve sekize düştü. Bir ve iki kopyada
sağ yarı sol yarıyla aynı kaldı — çünkü o örneklemlerde yeni sürüme turda kırk altı ve seksen altı
istek düşüyor, gözlemcinin karar eşiğinin altında. Küçük örneklemin sorunu ölçütün seyreltilmesi
değil yalnızca; **örneklemin kendisinin küçüklüğü**dür. Etiketli ölçüt seyrelme sorununu çözer,
örneklem sorununu çözmez.

Buradan okunacak ayar üç kopyadır: kusuru birinci turda yakalar, yüz yedi isteğe dokunur, ayakta
tuttuğu fazladan kapasite on beş kopya değil on üçtür. Bedeli, her isteğin sürüm etiketini
taşıması ve gözlemcinin bu etikete göre ayrı seri tutmasıdır — bir bilgi kalemi daha.

## Kalıbın Sakladığı Şey

Üç kalıbın hiçbiri "daha güvenli" değil; üçü de aynı üç niceliği farklı yerlere yığıyor. İki
ortamlı geçiş **geri almayı** ucuzlatır ve bedelini kapasiteyle öder: yirmi dört kopya, yani bir
kat fazla yer, ve o yer geçiş penceresi boyunca boş durur. Aşamalı güncelleme **kapasiteyi**
ucuzlatır ve bedelini geri almayla öder: ilerledikçe geri dönüş uzar. Kanarya **etki alanını**
küçültür ve bedelini gözlem süresiyle öder — üç tur boyunca hiçbir şey ilerlemez.

Sessiz olan şey, üçünün de bir eşiğin doğru ayarlandığını varsaymasıdır. Modelde alarm çalmadığı
her turda denetleyici plandaki bir sonraki adıma geçti; hiçbir kalıp "emin değilim, bekleyeyim"
demedi. Kanaryada iki kopyalık örneklemin terfisi bir arıza değil, **plana uygun davranıştı**:
gözlemci eşiği aşan bir şey görmedi, denetleyici de ilerledi. Devredilen kararın bedeli tam
buradadır — denetleyici hata oranını değil, **gözlemcinin raporladığı sayıyı** bilir. O sayı
seyreltilmişse yanlış karar, yanlış bilgiden değil, **eksik ayrımdan** doğar.

## Özet

- Üç kalıp aynı kusurlu sürümde koşturuldu: aşamalı güncelleme ikinci turda otuz üç hatalı
  istekle, iki ortamlı geçiş ikinci turda otuz hatalı istekle, iki kopyalık kanarya dördüncü turda
  elli üç hatalı istekle yakaladı.
- Tepe kapasite ile geri alma maliyeti ters yönde çalışır: iki ortamlı geçiş yirmi dört kopya
  ister ve tek turda geri alır; aşamalı on beş kopyayla geçer ama geri alma ilerledikçe iki, üç,
  dört tura çıkar.
- İki ortamlı geçişte geri alma penceresi eski ortamın kapatıldığı turda biter; o turdan sonra
  geri alma bir turdan üç tura sıçrar.
- Kanaryada küçük örneklem kusuru kaçırır ve terfi ettirir: iki kopyalık örneklem sekiz yüz elli
  bir isteğe dokunarak üç kalıbın en kötüsü oldu.
- Gözlemcinin ayrımı örneklemden önce gelir: sürüme göre ayıran ölçüt üç kopyalık örneklemde alarmı
  dördüncü turdan birinciye, hatalı isteği elli beşten yediye indirdi; bir ve iki kopyada hiçbir
  şeyi değiştirmedi, çünkü örneklem karar eşiğinin altındaydı.
- Devredilen karar "ilerle ya da dur" kararıdır; denetleyici hata oranını değil gözlemcinin
  raporladığı sayıyı bilir, o sayı seyreltilmişse yanlış karar eksik ayrımdan doğar.

## Sonraki Adım

Bu dersin modeli boyunca bir kopya trafiğe girdiği anda hizmet verebiliyordu. Gerçekte bir süreç
ayağa kalkmakla hazır olmak arasında bir aralık geçirir: bağlantı havuzunu kurar, önbelleğini
ısıtır, bağımlılıklarını yoklar. Denetleyici bu aralığı bilmiyorsa kopyayı erken trafiğe açar; ya
da tersine, yavaş açılan bir kopyayı arızalı sanıp öldürür. Sonraki ders bu aralığı üç ayrı
denetimle ölçer: kopyanın yaşadığını, istek alabildiğini ve hâlâ açılmakta olduğunu ayırt eden
denetimlerin eşiklerini tarar ve yanlış ayarın kaç gereksiz yeniden başlatma, kaç hatalı istek
ürettiğini sayar.
