İçeriğe geç
academia.sh

Ders 12 / 20

Yedeklilik Bölgeleri

Kopyaların nereye konduğunun ölçülmesi: alan ile bölgenin yerleşim birimi olarak ayrılması, üç yerleşim planının makine, alan ve bölge kaybında ayakta kalan kapasite ve kaybolan yayılmamış yazma üzerinden karşılaştırılması, bir birim kaybına dayanmak için boşta tutulması gereken kapasitenin hesaplanması ve bölgeler arası çoğaltmanın arızasız günde taşıdığı ek yükün sayılması.

İçindekiler

Önceki dersin bütün hesapları tek bir örtük varsayım taşıdı: kurtarılacak bir kopya vardır ve o kopya arızadan etkilenmemiştir. K01 bu varsayımı zaten işaretlemişti — kopya aritmetiği ancak kopyalar bağımsız düştüğünde geçerlidir ve bu yüzden hesaplanan sayı bir üst sınırdır. İki kopya aynı elektrik hattına, aynı ağ anahtarına ya da aynı soğutma birimine bağlıysa bağımsızlık yoktur; biri düştüğünde öteki de düşer.

Bu ders kopyaların nereye konduğunu ölçer. İki yerleşim birimi ayrılır. Alan (availability zone), kendi güç ve ağ yolu olan, bir arızanın komşusuna geçmediği varsayılan bir yerleşim birimidir. Bölge (region), coğrafi olarak ayrı bir alanlar kümesidir; iki bölge arasındaki uzaklık yayılma turunu uzatır.

Bu kursta alan sözcüğü yalnız bu fiziksel yerleşim birimini karşılar. Alan Odaklı Tasarım kursundaki alan (domain) bir bilgi sınırıdır, kayıt alanı (field) bir veri parçasıdır; üçü ayrı kavramlardır ve burada karışmaz. Aynı nedenle bir arızanın dokunduğu bileşen kümesi bu kursta bulaşma kapsamı diye anılır, “etki alanı” diye değil.

Yerleşim Planı Bir Arıza Kipini Seçer

Bir yerleşim planı hangi kopyaların birlikte düşeceğini belirler. Altı kopya tek bir alanda duruyorsa, o alanın kaybı altı kopyayı birden alır ve altı kopyanın hiçbir anlamı kalmaz. Aynı altı kopya üç alana dağıtılırsa bir alanın kaybı ikisini alır. İki bölgeye dağıtılırsa bir bölgenin kaybı üçünü alır.

Aşağıdaki düzenek bir modeldir: gerçek bölge, alan, bulut ortamı ya da kapsayıcı kurulmaz. Kopyalar bölge ve alan etiketi taşıyan nesnelerdir, tur soyut bir adımdır ve yayılma turu uzaklığa göre değişir. Çoğaltmanın mekaniği Veri Katmanı Ölçekleme kursunda kuruldu ve burada tekrarlanmaz; buradaki tek soru bir birim kaybolduğunda hangi yazmanın hiçbir yerde kalmadığıdır.

KU7 — yayılma turları: aynı alan içinde 1, aynı bölgede farklı alan arasında 2, bölgeler arasında 4 tur. Gerekçe: yayılma süresi uzaklıkla artar. Duyarlılığı doğrusaldır; uzak turu iki katına çıkarsa bölge kaybındaki yayılmamış yazma da iki katına çıkar. Bu varsayım K01’in tablosuna eklenmez.

// bolge/model.mjs — yerlesim MODELIDIR: kopyalar bolge ve alan etiketi tasir, yayilma turu
// uzakliga gore degisir. Tur soyut bir adimdir; gercek bolge, alan ya da bulut ortami kurulmaz.
export const TUR = 40, ARIZA_TURU = 20, TUR_YAZMA = 6;
export const YAYILMA = { alan: 1, bolge: 2, uzak: 4 };   // KU7 (varsayim): yayilma turlari

export const PLAN = {
  "tek-alan":  [["b1", "a1"], ["b1", "a1"], ["b1", "a1"], ["b1", "a1"], ["b1", "a1"], ["b1", "a1"]],
  "uc-alan":   [["b1", "a1"], ["b1", "a1"], ["b1", "a2"], ["b1", "a2"], ["b1", "a3"], ["b1", "a3"]],
  "iki-bolge": [["b1", "a1"], ["b1", "a2"], ["b1", "a3"], ["b2", "a1"], ["b2", "a2"], ["b2", "a3"]],
};
export const SENARYO = {
  makine: (y, i) => i === 0,
  alan: (y) => y[0] === "b1" && y[1] === "a1",
  bolge: (y) => y[0] === "b1",
};

const gecikme = (x, y) => (x[0] !== y[0] ? YAYILMA.uzak : x[1] !== y[1] ? YAYILMA.bolge : YAYILMA.alan);

export function kosum(planAdi, senaryoAdi) {
  const yer = PLAN[planAdi], n = yer.length;
  const dusuk = yer.map((y, i) => SENARYO[senaryoAdi](y, i));
  const canli = (i, t) => !(dusuk[i] && t >= ARIZA_TURU);
  const yazmalar = [];
  let sira = 0, s = { kabul: 0, dusen: 0, kayip: 0 };

  for (let t = 1; t <= TUR; t += 1) {
    for (const w of yazmalar) {                       // varan yayilimlar hedefte gorunur oldu
      for (const m of w.ucus) if (m.varir === t) w.sahip.add(m.hedef);
      w.ucus = w.ucus.filter((m) => m.varir > t);
    }
    if (t === ARIZA_TURU) {                            // dusen birim: sahiplik ve ucus kaybi
      for (const w of yazmalar) {
        w.ucus = w.ucus.filter((m) => canli(m.kaynak, t) && canli(m.hedef, t));
        const kalan = [...w.sahip].filter((i) => canli(i, t));
        if (kalan.length === 0 && w.ucus.length === 0) { s.kayip += 1; w.kayboldu = true; }
        w.sahip = new Set(kalan);
      }
    }
    const havuz = yer.map((_, i) => i).filter((i) => canli(i, t));
    for (let k = 0; k < TUR_YAZMA; k += 1) {
      if (havuz.length === 0) { s.dusen += 1; continue; }
      const i = havuz[sira++ % havuz.length];
      s.kabul += 1;
      const w = { sahip: new Set([i]), ucus: [], kayboldu: false };
      for (const j of havuz) if (j !== i) w.ucus.push({ kaynak: i, hedef: j, varir: t + gecikme(yer[i], yer[j]) });
      yazmalar.push(w);
    }
  }
  const ayakta = yer.filter((_, i) => canli(i, TUR)).length;
  return { ...s, ayakta, toplam: n };
}
// bolge/olc.mjs — uc yerlesim plani, uc arizada: ayakta kalan kopya, dusen istek, kayip yazma
import { kosum, PLAN, SENARYO, TUR, ARIZA_TURU, TUR_YAZMA, YAYILMA } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
console.log(`${TUR} tur, tur basina ${TUR_YAZMA} yazma, ariza ${ARIZA_TURU}. turda.`);
console.log(`yayilma turlari: ayni alan ${YAYILMA.alan}, ayni bolge farkli alan ${YAYILMA.bolge}, ` +
  `farkli bolge ${YAYILMA.uzak} (KU7)`);
console.log();
console.log("plan       | ariza  | ayakta kopya | ayakta kapasite | dusen yazma | kayip yayilmamis");
console.log("-----------|--------|--------------|-----------------|-------------|-----------------");
for (const plan of Object.keys(PLAN)) {
  for (const senaryo of Object.keys(SENARYO)) {
    const r = kosum(plan, senaryo);
    console.log(`${plan.padEnd(10)} | ${senaryo.padEnd(6)} | ${s(`${r.ayakta}/${r.toplam}`, 12)} | ` +
      `${s(`%${((100 * r.ayakta) / r.toplam).toFixed(1)}`, 15)} | ${s(r.dusen, 11)} | ${s(r.kayip, 16)}`);
  }
}
40 tur, tur basina 6 yazma, ariza 20. turda.
yayilma turlari: ayni alan 1, ayni bolge farkli alan 2, farkli bolge 4 (KU7)

plan       | ariza  | ayakta kopya | ayakta kapasite | dusen yazma | kayip yayilmamis
-----------|--------|--------------|-----------------|-------------|-----------------
tek-alan   | makine |          5/6 |           %83.3 |           0 |                0
tek-alan   | alan   |          0/6 |            %0.0 |         126 |              114
tek-alan   | bolge  |          0/6 |            %0.0 |         126 |              114
uc-alan    | makine |          5/6 |           %83.3 |           0 |                0
uc-alan    | alan   |          4/6 |           %66.7 |           0 |                2
uc-alan    | bolge  |          0/6 |            %0.0 |         126 |              114
iki-bolge  | makine |          5/6 |           %83.3 |           0 |                1
iki-bolge  | alan   |          5/6 |           %83.3 |           0 |                1
iki-bolge  | bolge  |          3/6 |           %50.0 |           0 |                9

Üç Planın Okunması

Makine satırları üç planda da aynı: bir kopyanın kaybı hiçbir düzende hizmeti durdurmuyor. Kopya sayısı bu arıza kipini zaten karşılıyordu ve yerleşim planı burada bir şey değiştirmiyor.

Alan satırı planları ayırıyor. Tek alan düzeninde alanın kaybı altı kopyayı da alıyor: 126 yazma düşüyor ve 114 yazma hiçbir yerde kalmıyor. Aynı arıza üç alanlı düzende dört kopyayı ayakta bırakıyor, hiçbir yazma düşmüyor ve yalnız 2 yazma kayboluyor. Altı kopyanın altısı da vardı; fark yalnız nereye konduklarındaydı.

Bölge satırı ikinci düzeyi ayırıyor. Üç alanlı düzen alan kaybını karşılıyor ama bölgenin kaybı onu da tamamen alıyor — üç alanın üçü de aynı bölgededir. Yalnız iki bölgeli düzen bölge kaybında ayakta kalıyor: yarım kapasite, sıfır düşen yazma, 9 kaybolan yayılmamış yazma.

Dağıtmanın kendi bedeli son sütunda görünüyor. İki bölgeli düzende tek bir makinenin kaybı bile 1 yazma kaybettiriyor, oysa tek alan düzeninde 0. Sebep yayılma turudur: kopyalar birbirinden uzağa konduğunda bir yazmanın ikinci bir kopyaya ulaşması daha uzun sürer ve o pencerede daha çok yazma tek bir kopyada durur. Yayılmanın uzaması yedekliliğin karşı yüzüdür; aynı sayı bölge kaybında 9’a çıkıyor.

Ne Kadar Kapasite Boşta Durmalı

Ayakta kalan kapasite sütunu bir soruyu açık bırakıyor: yüzde 66,7 kapasite yükü taşımaya yeter mi? Yetmesi için normal günde kapasitenin bir kısmının boşta durması gerekir. Aşağıdaki hesap bu payı alan sayısına göre veriyor ve bölgeler arası çoğaltmanın arızasız günde taşıdığı yükü sayıyor.

// bolge/kapasite.mjs — yedekliligin arizasiz gundeki bedeli: bosta duran kapasite ve bolgeler
// arasi tasinan yazma; model turlarinin K01 olcegine cevrilmesi
const TEPE_UC = 513.89;       // K01: tepe uctaki istek/s
const TEPE_YAZMA = 97.22;     // K01: tepe yazma istek/s
const OLAY_GUN = 2_800_000;   // K01: gunluk durum olayi
const ARTIS_GB = 0.976;       // K01: gunluk veri artisi
const TUR_SN = 2;             // KU1 (varsayim): bir tur 2 saniye
const b = (x, n = 2) => x.toFixed(n);

console.log(`${"alan".padStart(5)}${"alan basina yuk".padStart(17)}${"bir alan dusunce".padStart(18)}` +
  `${"saglanmasi gereken".padStart(20)}${"bosta duran".padStart(13)}${"fazladan pay".padStart(14)}`);
for (const n of [2, 3, 4, 6]) {
  const normal = TEPE_UC / n, kayipta = TEPE_UC / (n - 1), toplam = n * kayipta;
  console.log(`${String(n).padStart(5)}${b(normal).padStart(17)}${b(kayipta).padStart(18)}` +
    `${b(toplam).padStart(20)}${b(toplam - TEPE_UC).padStart(13)}${("%" + b(100 * (toplam / TEPE_UC - 1), 1)).padStart(14)}`);
}

const bayt = (ARTIS_GB * 1e9) / OLAY_GUN;
console.log(`\nolay basina ${b(bayt)} bayt (K01: gunde ${ARTIS_GB} GB / ${OLAY_GUN.toLocaleString("tr-TR")} olay)`);
console.log(`iki bolgeye cogaltma: tepe yukte ${b(TEPE_YAZMA * bayt / 1024)} KB/s ek tasima, ` +
  `gunde ${b(ARTIS_GB * 1000)} MB`);

console.log(`\nkayip yayilmamis yazmanin K01 olcegine cevrilmesi (KU1: tur = ${TUR_SN} sn):`);
for (const [ad, tur, pay] of [["alan kaybi (3 alan)", 1, 3], ["bolge kaybi (2 bolge)", 4, 2]]) {
  console.log(`  ${ad.padEnd(22)} yayilma ${tur} tur = ${tur * TUR_SN} sn, ` +
    `birim basina ${b(TEPE_YAZMA / pay)} yazma/s -> ${b((tur * TUR_SN * TEPE_YAZMA) / pay)} yazma`);
}
console.log(`  oran ${b(((4 * TUR_SN * TEPE_YAZMA) / 2) / ((1 * TUR_SN * TEPE_YAZMA) / 3))}: ` +
  `bolge kaybi ayni ariza suresinde daha cok yayilmamis yazma birakir`);
 alan  alan basina yuk  bir alan dusunce  saglanmasi gereken  bosta duran  fazladan pay
    2           256.94            513.89             1027.78       513.89        %100.0
    3           171.30            256.94              770.84       256.95         %50.0
    4           128.47            171.30              685.19       171.30         %33.3
    6            85.65            102.78              616.67       102.78         %20.0

olay basina 348.57 bayt (K01: gunde 0.976 GB / 2.800.000 olay)
iki bolgeye cogaltma: tepe yukte 33.09 KB/s ek tasima, gunde 976.00 MB

kayip yayilmamis yazmanin K01 olcegine cevrilmesi (KU1: tur = 2 sn):
  alan kaybi (3 alan)    yayilma 1 tur = 2 sn, birim basina 32.41 yazma/s -> 64.81 yazma
  bolge kaybi (2 bolge)  yayilma 4 tur = 8 sn, birim basina 48.61 yazma/s -> 388.88 yazma
  oran 6.00: bolge kaybi ayni ariza suresinde daha cok yayilmamis yazma birakir

Boşta duran kapasite alan sayısıyla hızla azalıyor. İki alanda bir alanın kaybına dayanmak kapasitenin iki katını gerektirir: 513,89 istek/s taşımak için 1027,78 sağlanır ve yarısı boşta durur. Üç alanda fazladan pay yüzde 50’ye, dört alanda yüzde 33,3’e, altı alanda yüzde 20’ye iner. Genel biçimi nn alan için 1/(n1)1/(n-1)’dir. Alan sayısını artırmak yedekliliği ucuzlatır, ve bu, aynı hizmet erişilebilirliğine iki farklı fiyatla ulaşılabileceği anlamına gelir.

Bölgeler arası çoğaltmanın taşıma faturası ise küçük: olay başına 348,57 bayt, tepe yükte 33,09 KB/s, günde 976 MB. Bu akış için bölge yedekliliğinin faturası taşımada değil, kapasitede ve kaybolan yazmadadır. Farklı bir yükte — büyük gövdeli yazmalar taşıyan bir akışta — sıralama tersine dönerdi; sayı akışa bağlıdır, ilkeye değil.

Son blok model turlarını K01 ölçeğine çeviriyor. Üç alanlı düzende bir alanın kaybında yayılmamış yazma 64,81; iki bölgeli düzende bir bölgenin kaybında 388,88. Oran 6,00 ve iki nedenden geliyor: bölgeler arası yayılma dört kat uzun ve bölge başına yazma payı daha büyük. Bölge yedekliliği kesintiyi kaldırır ama veri kaybını büyütür, ve bu tam olarak önceki dersin veri kaybı hedefiyle karşılaştırılacak sayıdır: bir saniyelik çoğaltma gecikmesi 97,22 olay kaybettiriyordu, bölge kaybı 388,88.

İki Günün Sayısı

Arızasız günün bedeli üç kalemdir. Üç alanlı bir yerleşimde kapasitenin yüzde 50’si boşta durur — 256,95 istek/s hiçbir zaman kullanılmaz. İki bölgeli çoğaltma her yazmayı ikinci kez taşır: günde 976 MB ve tepe yükte 33,09 KB/s. Üçüncüsü, yayılmanın uzaması küçük arızalarda bile kayıp üretir: tek makine kaybında iki bölgeli düzen 1 yazma kaybederken tek alan düzeni 0 kaybediyordu.

Arızalı günün kazancı aynı tablonun alan ve bölge satırlarındadır. Tek alan düzeninde bir alanın kaybı 126 yazma düşürüp 114 yazma kaybettirirken, üç alanlı düzende aynı arıza 0 düşen yazma ve 2 kayıp veriyor. Bölge kaybında üç alanlı düzen 126/114 verirken iki bölgeli düzen 0/9 veriyor. Her düzey bir arıza kipini kaldırıyor ve bir üstekini açıkta bırakıyor; yerleşim kararı hangi kipin kaldırılacağını seçmektir.

Özet

  • Alan, kendi güç ve ağ yolu olan bir yerleşim birimidir; bölge, coğrafi olarak ayrı bir alanlar kümesidir. Bu kursta alan yalnız bu anlamdadır; bilgi sınırı olan alan ve kayıt alanı ayrı kavramlardır.
  • Yerleşim planı hangi kopyaların birlikte düşeceğini belirler: altı kopya tek alanda toplanınca alan kaybı 126 yazma düşürüp 114 yazma kaybettiriyor, üç alana dağılınca aynı arıza 0 düşen yazma ve 2 kayıp veriyor.
  • Bölge kaybı yalnız iki bölgeli düzende karşılanıyor: yüzde 50 kapasite, 0 düşen yazma, 9 kaybolan yayılmamış yazma.
  • Dağıtmanın kendi bedeli yayılma turunun uzamasıdır: iki bölgeli düzen tek makine kaybında bile 1 yazma kaybediyor, tek alan düzeni 0.
  • Bir alan kaybına dayanmak için boşta tutulması gereken kapasite 1/(n1)1/(n-1)’dir: iki alanda yüzde 100, üç alanda yüzde 50, altı alanda yüzde 20.
  • K01 ölçeğinde alan kaybı 64,81, bölge kaybı 388,88 yayılmamış yazma bırakıyor (oran 6,00); bölge yedekliliği kesintiyi kaldırırken veri kaybı hedefini zorlar.

Sonraki Adım

Bu ders kopyaları dağıttı ama dağıtılan şey hep aynı bütündü: altı kopya, tek bir hizmet, tek bir veri kümesi. Bir alan ya da bölge kaybında ayakta kalan kapasite yüzde 66,7 ve yüzde 50 çıktı, çünkü kaybedilen birim hizmetin bir kesirini taşıyordu. Bu kesir hesabı bir şeyi varsayıyor: birimler birbirinden bağımsız iş yapabiliyor. Oysa çoğu düzende birimlerin ortak bir noktası kalır — tek bir yönlendirme eşlemesi, tek bir numara dağıtıcısı, tek bir yapılandırma kaynağı — ve o noktanın kaybı bütün birimleri birden alır. Sonraki ders hizmeti kendi kendine yeten yinelenebilir birimlere bölmeyi ele alır: birim içindeki bağların birimi geçmemesi, birim başına düşen yük ve birimler arasında paylaşılan tek kaynağın bulaşma kapsamı.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat