Ders 18 / 19
CAP ve PACELC
Ödünleşimin doğru ifade edilmesi: aynı çoğaltma kümesinin aynı bölünmede dört ayarla koşturulup reddedilen yazma, geri alınan yazma, yanıtsız okuma ve bayat okuma sayılarının karşılaştırılması, tek bir ayarın yazma yolunda tutarlılığı okuma yolunda erişilebilirliği seçebildiğinin gösterilmesi, bölünme hiç olmadığında da bir seçim yapıldığının bekleme turu ve eskilik penceresiyle ölçülmesi ve küme boyundan gelen yapısal sınırın ayardan gelen karardan ayrılması.
İçindekiler
Önceki ders güçlü tutarlılığın bedelini yazma başına 10 turluk onay olarak ölçtü ve o sayının küme sağlamken de ödendiğini not düşerek bitti. Bu ders o notu açar. Ele alacağı ikinci konu ise bir ifade yanlışıdır: dağıtık depolardan söz edilirken bir deponun “CP” ya da “AP” olduğu, sanki bu bir ürün özelliğiymiş gibi söylenir.
CAP teoreminin üç harfi ve PACELC’in iki dalı Sistem Tasarımına Giriş kursunda tanımlandı; aynı bölünme senaryosu iki politikayla koşturuldu, bayat yanıt ve reddedilen istek sayıldı, bölünme dışındaki gecikme ödünleşimi ölçüldü ve teoremin yaygın yanlış okunuşları ayırt edildi. Tanımlar ve o tartışma burada tekrarlanmaz. Buradaki iş, aynı ölçüm düzenini bir depo ayarına uygulayıp etiketin nereye ait olduğunu saymaktır.
Etiket Ürünün Değil Ayarın Özelliğidir
Önceki üç ders bir şeyi tekrar tekrar gösterdi: yazma ilgisi, okuma ilgisi ve okuma yönü istek başına verilebilen ayarlardır. Bir depo bu ayarların hepsini destekliyorsa, o depoya tek bir sınıf adı vermek bir kategori hatasıdır. Sınıf, deponun değil, koşan isteğin özelliğidir.
Bunun sınanması doğrudandır: aynı küme, aynı bölünme, aynı kod, yalnız ayar değişir. Sınıf adı değişiyorsa etiket ayara aittir.
Düzenek
NS23 — bölünme 16 tur sürer ve kümeyi ikiye ayırır: şube tarafında iki üye, merkez tarafında üç üye kalır. Gerekçe: şube merkeze tek bir bağla bağlıdır ve o bağ koptuğunda şubedeki iki üye yalnız kalır. NS24 — çoğunlukla teması kesilen birincil kendini bir zaman aşımından sonra indirir; bu süre 3 ya da 12 turdur. Gerekçe: bir birincilin çoğunluk temasını yitirdikten sonra ne kadar yazma kabul etmeyi sürdüreceği bir ayardır. İkinci varsayımın etkisi doğrusaldır ve tabloda iki değerle gösterilir.
// cap/model.mjs — bolunme MODELIDIR: tur soyut bir adimdir, uye uzakligi ve bolunme penceresi // tur cinsinden parametrelerdir, gercek ag kurulmaz. Bes uyeli tek bir cogaltma kumesi ikiye // ayrilir: sube tarafinda u0 (o anki birincil) ve u1, merkez tarafinda u2, u3, u4. Sube // istemcisi merkez tarafina hic ulasamaz. AYNI KUME, AYNI KOD; degisen tek sey ayardir. export const GECIKME = [0, 3, 5, 6, 8], UYE = 5, COGUNLUK = 3; export const TUR = 40, BOL = [11, 26], ALGILAMA = 2, SECIM = 2; const SIRALI = GECIKME.slice(1).slice().sort((a, b) => a - b); export const onaySuresi = (w) => (w <= 1 ? 0 : 2 * SIRALI[w - 2]); export function kosum({ w, okuma, indirme = 3, bolunme = true }) { const b0 = bolunme ? BOL[0] : TUR + 1, b1 = bolunme ? BOL[1] : TUR + 1; const iner = b0 + indirme; // cogunlukla temasi kesilen birincil kendini indirir const yeni = b0 + ALGILAMA + SECIM; // merkez tarafi kendi birincilini secer const onay = onaySuresi(w); const yaziTuru = [0]; // sira -> yazildigi tur (sube tarafi) let sira = 0, subeKabul = 0, subeRed = 0, merkezKabul = 0, gecici = []; let yanit = 0, bayat = 0, yanitsiz = 0, eskilik = 0, bekleme = 0; for (let t = 1; t <= TUR; t += 1) { const bolundu = t >= b0 && t <= b1; // sube yazmasi: her turda bir odunc kaydi, her zaman kendi tarafindaki birincile gider const birincilVar = bolundu === false || t < iner; const wSaglanir = bolundu === false || w <= 1; // azinlik tarafinda cogunluk toplanamaz if (birincilVar && wSaglanir) { sira += 1; yaziTuru[sira] = t; subeKabul += 1; bekleme += onay; if (bolundu) gecici.push(sira); // azinlikta kabul edildi: birlesmede geri alinir } else subeRed += 1; if (bolundu && t >= yeni) merkezKabul += 1; // merkez tarafi kendi birincilini secip yazmayi surdurur // sube okumasi: yerel ilgi kendi tarafindaki ikincilden yanitlanir; cogunluk ilgisi // azinlik tarafinda dogrulanamaz, bu yuzden yanit verilmez if (okuma === "cogunluk" && bolundu) { yanitsiz += 1; continue; } const gorulen = okuma === "cogunluk" ? yaziTuru.findLastIndex((x) => x + onaySuresi(COGUNLUK) <= t) : yaziTuru.findLastIndex((x) => x + GECIKME[1] <= t); yanit += 1; if (gorulen < sira) { bayat += 1; if (gorulen >= 1) eskilik = Math.max(eskilik, t - yaziTuru[gorulen]); // henuz kayit yoksa sayilmaz } } return { subeKabul, subeRed, geriAlinan: gecici.length, merkezKabul, yanit, bayat, yanitsiz, eskilik, bekleme, onay }; }
// cap/olc.mjs — ayni kume, ayni bolunme, dort ayar; sonra ayni dort ayar bolunme YOKKEN import { kosum, onaySuresi, GECIKME, BOL, TUR, COGUNLUK } from "./model.mjs"; const s = (x, n) => String(x).padStart(n); const AYAR = [ ["w=cogunluk · cogunluk", { w: COGUNLUK, okuma: "cogunluk" }], ["w=1 · yerel (indirme 3)", { w: 1, okuma: "yerel", indirme: 3 }], ["w=1 · yerel (indirme 12)", { w: 1, okuma: "yerel", indirme: 12 }], ["w=cogunluk · yerel", { w: COGUNLUK, okuma: "yerel" }], ]; const pencere = BOL[1] - BOL[0] + 1; console.log(`${TUR} tur, uye uzakligi ${GECIKME.join("/")}. Bag ${BOL[0]}-${BOL[1]}. turlarda kesik`); console.log(`(${pencere} tur): sube tarafinda u0 ve u1, merkez tarafinda u2, u3, u4.`); console.log("Her turda bir odunc yazmasi ve bir katalog okumasi sube tarafina gelir.\n"); console.log("ayar | sube yazma kabul | red | geri alinan | merkez yazma | okuma yanit | bayat | yanitsiz"); console.log("--------------------------|------------------|-----|-------------|--------------|-------------|-------|---------"); for (const [ad, p] of AYAR) { const r = kosum(p); console.log(`${ad.padEnd(25)} | ${s(r.subeKabul, 16)} | ${s(r.subeRed, 3)} | ${s(r.geriAlinan, 11)} | ` + `${s(r.merkezKabul, 12)} | ${s(r.yanit, 11)} | ${s(r.bayat, 5)} | ${s(r.yanitsiz, 8)}`); } console.log("\nayni dort ayar, bolunme HIC olmadan:"); console.log("ayar | onay turu | toplam bekleme | eskilik penceresi | bayat okuma | yanitsiz"); console.log("--------------------------|-----------|----------------|-------------------|-------------|---------"); for (const [ad, p] of AYAR) { const r = kosum({ ...p, bolunme: false }); console.log(`${ad.padEnd(25)} | ${s(r.onay, 9)} | ${s(r.bekleme, 14)} | ${s(r.eskilik + " tur", 17)} | ` + `${s(`${r.bayat}/${r.yanit}`, 11)} | ${s(r.yanitsiz, 8)}`); } console.log("\nkosumdan bagimsiz: azinlik tarafinda kalan uye sayisi 2, cogunluk esigi " + `${COGUNLUK};`); console.log("2 < 3 oldugu icin o taraf hicbir ayarda cogunluk toplayamaz — bu bir ayar sonucu degil,"); console.log(`kume boyunun sonucudur. Cogunluk onay turu ${onaySuresi(COGUNLUK)}, yerel onay turu ${onaySuresi(1)}.`);
40 tur, uye uzakligi 0/3/5/6/8. Bag 11-26. turlarda kesik (16 tur): sube tarafinda u0 ve u1, merkez tarafinda u2, u3, u4. Her turda bir odunc yazmasi ve bir katalog okumasi sube tarafina gelir. ayar | sube yazma kabul | red | geri alinan | merkez yazma | okuma yanit | bayat | yanitsiz --------------------------|------------------|-----|-------------|--------------|-------------|-------|--------- w=cogunluk · cogunluk | 24 | 16 | 0 | 12 | 24 | 24 | 16 w=1 · yerel (indirme 3) | 27 | 13 | 3 | 12 | 40 | 29 | 0 w=1 · yerel (indirme 12) | 36 | 4 | 12 | 12 | 40 | 38 | 0 w=cogunluk · yerel | 24 | 16 | 0 | 12 | 40 | 26 | 0 ayni dort ayar, bolunme HIC olmadan: ayar | onay turu | toplam bekleme | eskilik penceresi | bayat okuma | yanitsiz --------------------------|-----------|----------------|-------------------|-------------|--------- w=cogunluk · cogunluk | 10 | 400 | 10 tur | 40/40 | 0 w=1 · yerel (indirme 3) | 0 | 0 | 3 tur | 40/40 | 0 w=1 · yerel (indirme 12) | 0 | 0 | 3 tur | 40/40 | 0 w=cogunluk · yerel | 10 | 400 | 3 tur | 40/40 | 0 kosumdan bagimsiz: azinlik tarafinda kalan uye sayisi 2, cogunluk esigi 3; 2 < 3 oldugu icin o taraf hicbir ayarda cogunluk toplayamaz — bu bir ayar sonucu degil, kume boyunun sonucudur. Cogunluk onay turu 10, yerel onay turu 0.
Aynı Küme, Dört Ayar, Dört Davranış
Birinci tablo bu dersin savını tek başına taşıyor. Dört satır aynı kümeyi, aynı 16 turluk bölünmeyi ve aynı kodu kullanıyor; ayrılan tek şey ayardır ve dört farklı davranış çıkıyor.
Birinci satır tutarlılığı seçiyor: şube tarafındaki 16 yazma reddedildi, 16 okuma yanıtsız kaldı ve geri alınan yazma 0. İkinci satır erişilebilirliği seçiyor: hiçbir okuma yanıtsız kalmadı, şube 3 yazma daha kabul etti — ve o 3 yazma birleşmede geri alındı.
İki satır arasındaki ilişki tam bir eşitliktir ve tesadüf değildir: azınlık tarafında kazanılan her kabul, geri alınan bir yazmadır. 27 − 24 = 3 ve üçüncü satırda 36 − 24 = 12. İndirme zaman aşımını 3 turdan 12 tura çıkarmak 9 yazma daha kabul ettirdi ve tam olarak 9 yazma daha geri aldırdı. Erişilebilirlik burada bir ödünleşim değil, bir takastır; kur birebirdir ve ayarın kendisi kuru belirlemez, yalnız işlem hacmini belirler.
Dördüncü satır etiket tartışmasını bitiriyor. w=çoğunluk ile yerel okuma bileşiminde yazma
yolu birinci satırla aynı davranıyor — 16 red, 0 geri alınan — okuma yolu ise ikinci satırla aynı
davranıyor: 40 yanıt, 0 yanıtsız. Tek bir depo, tek bir küme, tek bir ayar; yazmada tutarlılık,
okumada hizmet erişilebilirliği. Bu satıra tek harfli bir sınıf adı verilemez. Sınıf, işlemin
gittiği yola aittir.
merkez yazma sütunu dört satırda da 12’dir ve bir yanlış anlamayı daha kapatıyor. Bölünme
sırasında depo durmadı; merkez tarafı çoğunluğu topladı, kendi birincilini seçti ve yazmaya
devam etti. Reddedilen 16 yazma, deponun değil, azınlık tarafındaki istemcinin gördüğü şeydir.
Bir sınıf adı verilirken kimin gözünden bakıldığı da söylenmelidir.
Bölünme Yokken de Bir Seçim Yapılıyor
İkinci tablo bağın hiç kesilmediği koşumu veriyor ve dört satır orada da ayrışıyor.
w=çoğunluk içeren iki ayar 40 turda toplam 400 tur bekledi; w=1 içeren iki ayar 0 tur. Bu 400
tur bölünmeyle ilgili değildir — bağ sapasağlamken, her yazmada, çoğunluğun onayının dönmesi için
harcandı. Aynı biçimde eskilik penceresi çoğunluk okumasında 10, yerel okumada 3 turdur ve bu fark
da bölünme olmadan ölçüldü.
Dördüncü satır burada da karışık kalıyor: yazma yolunda 400 tur bekleme, okuma yolunda 3 turluk eskilik penceresi. Yani ayar, bölünme dalında olduğu gibi bölünme dışı dalda da tek bir harfe sığmıyor.
| Ayar | Bölünmede (P dalı) | Bölünme dışında (E dalı) | Ölçülen |
|---|---|---|---|
w=çoğunluk · çoğunluk |
tutarlılık | tutarlılık | 16 red, 16 yanıtsız; 400 bekleme turu, 10 turluk eskilik |
w=1 · yerel, indirme 3 |
erişilebilirlik | gecikme | 0 yanıtsız, 3 geri alınan; 0 bekleme, 3 turluk eskilik |
w=1 · yerel, indirme 12 |
erişilebilirlik | gecikme | 0 yanıtsız, 12 geri alınan; 0 bekleme, 3 turluk eskilik |
w=çoğunluk · yerel |
yazmada tutarlılık, okumada erişilebilirlik | yazmada tutarlılık, okumada gecikme | 16 red ama 0 yanıtsız; 400 bekleme, 3 turluk eskilik |
Kütüphane işletiminde bu tablo doğrudan bir yapılandırmaya çevrilir. Ödünç verme yazması birinci satırın ayarını alır: bağ koptuğunda şube ödünç veremez, ama hiçbir ödünç kaydı sonradan yok sayılmaz. Katalog araması dördüncü satırın okuma tarafını alır: bağ kopsa da arama yanıt verir ve üç turluk bir eskilik kabul edilir. İki karar aynı kümede, aynı derlem üzerinde, ayrı isteklerle verilir.
Yapısal Olan ve Ayara Bağlı Olan
Her şey ayar değildir ve bu ayrımı görmemek ikinci bir ifade yanlışıdır. Son bloktaki satır koşumdan bağımsızdır: azınlık tarafında iki üye kalıyor, çoğunluk eşiği üçtür ve 2 < 3 olduğu için o taraf hiçbir ayarda çoğunluk toplayamaz. Bu bir politika sonucu değil, küme boyunun ve bölünmenin nereden geçtiğinin sonucudur. Ayarla değiştirilemeyecek olan budur; ayarla değiştirilebilecek olan, o tarafın ne kadar süre yazma kabul etmeyi sürdüreceğidir.
Aynı ayrım birinci dersin sonucuyla örtüşüyor: orada iki üyesi düşen üç üyeli kümede seçim hiç başlamamıştı ve kalan üyenin elindeki verinin güncelliği bunu değiştirmemişti. Yapısal sınırlar ayar tablosunun üstündedir; ayar tablosu ancak o sınırın izin verdiği alanda karar üretir.
Özet
- Aynı küme, aynı 16 turluk bölünme ve aynı kod dört ayarda dört farklı davranış üretti; sınıf adı deponun değil, ayarın ve işlemin gittiği yolun özelliğidir.
- Azınlık tarafında kazanılan her kabul, geri alınan bir yazmadır: indirme zaman aşımı 3 turdan 12 tura çıkınca kabul 27’den 36’ya, geri alınan 3’ten 12’ye çıktı — fark her iki sütunda da 9.
w=çoğunlukileyerelokuma bileşimi yazma yolunda tutarlılığı (16 red, 0 geri alınan), okuma yolunda hizmet erişilebilirliğini (40 yanıt, 0 yanıtsız) seçti; bu satıra tek harfli bir sınıf verilemez.- Bölünme sırasında merkez tarafı dört ayarda da 12 yazma kabul etti: depo durmadı, duran şey azınlık tarafındaki istemcinin gördüğü hizmettir.
- Bölünme hiç olmadığında da bir seçim ödendi:
w=çoğunlukiçeren ayarlar 40 turda 400 tur bekledi, çoğunluk okumasının eskilik penceresi 10 tur, yerel okumanınki 3 tur çıktı. - Ayarla değiştirilemeyen bir sınır var: azınlık tarafında iki üye kalırken çoğunluk eşiği üçtür ve 2 < 3 olduğu için o taraf hiçbir ayarda çoğunluk toplayamaz.
Sonraki Adım
Bu konu boyunca kümenin verdiği her karar bir ayarla ölçüldü: kaç üyenin onay vereceği, okumanın nereye gideceği, bir birincilin çoğunluk temasını yitirdikten sonra ne kadar yazma kabul edeceği. Ölçülen her şeyin ortak bir varsayımı vardı ve hiç dile getirilmedi: isteği gönderenin bunu yapma yetkisi olduğu. Modelde kümeye ulaşan her yazma bir ödünç kaydı yazdı, her okuma bir yanıt aldı; isteğin kimden geldiği hiç sorulmadı. Gerçek bir kurulumda bu soru ilk sorulandır ve yanıtı yine bir yapılandırmadır — üstelik varsayılan değerleri en tehlikeli olanıdır. Sonraki ders deponun kimlik doğrulama, rol kapsamı ve şifreleme ayarlarını ele alır: yetkinin kapalı olduğu bir kurulumun neye açık olduğu, bir rolün kapsamının derlem düzeyine indirilmesinin ne getirdiği, aktarım ve durağan şifrelemenin hangi maliyeti eklediği.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.