İçeriğe geç
academia.sh

Ders 13 / 27

Kaynak Değiştirme ve İçe Aktarma

Kayıt dışı duran yedi kaynak yönetime alınır ve içe aktarmanın bedeli sayılır: kalem başına kaç alan elle eşleştiriliyor, kaç alan kayıt dışı kalıyor, içe aktarma sonrası ilk plan kaç kalem gereksiz değişiklik gösteriyor. Kaynak değiştirmenin kesintisi ve kısmi içe aktarmada yeniden oluşturmayla kaybolan alan ölçülür.

İçindekiler

Bir önceki ders planı, kayıtta yazılı olan kaynaklar için ölçtü. Ölçüm ağında ise kayıtta hiç yazmayan kaynaklar da var: ilk kurulumda elle açılmış bir nesne deposu, bir DNS bölgesi, iki eski toplayıcı makine, varsayılan bir güvenlik kümesi, eski bir veri deposu ve bir kuyruk. Bu yedi kaynak hiçbir plana girmez, hiçbir sapması görünmez ve hiçbir gözden geçirmeden geçmez. Planlayıcı onları görmez, çünkü planlayıcı yalnız kaydın ve durumun bildiğini karşılaştırır.

Bu dersin işi o yediyi yönetime almaktır. İşlem iki parçadan oluşur ve ikisi de ayrı ayrı ölçülür: kaynağın gerçek kimliğini bir adresle eşleştirmek, ve o kaynağın kayıttaki karşılığını elle yazmak. Birincisi mekaniktir. İkincisi bir kopya işidir, ve kopya işinin hata oranı bu dersin merkez sayısıdır.

Ölçüm bölgesel ölçüm ağı üzerindedir ve kurgudur; koşan şey node ile kurulmuş bir modeldir.

BS43. Sağlayıcıda duran yedi kaynak hiçbir kaydın bilmediği kaynaklardır. BS44. Kayıt elle yazılır; değerler sağlayıcı arayüzünden okunur. Dört noktada tutmuyor: iki değer yanlış okunmuş, bir değer varsayılan sanılmış, bir değer farklı harf biçiminde yazılmıştır. BS45. İçe aktarma, kaynağın gerçek alanlarının tamamını duruma yazar; kayda ise yalnız elle yazılan alanlar girer. İkisi arasındaki fark kayıt dışı kalan alandır. BS46. Planlayıcı ve sağlayıcı önceki dersin kurallarını sürdürür: imaj, boyut ve altag yeniden oluşturma gerektirir, sağlayıcı dizeleri harf ayrımı gözetmeden saklar. BS47. Yeniden oluşturmanın kesintisi makinede 105, veri deposunda 900 saniyedir; her 15 saniyede bir sayaç partisi kaçar. BS48. Yeniden oluşturulan kaynak, kayıtta yazılı olmayan alanlarını kaybeder ve sağlayıcı varsayılanına döner. Sağlayıcının kendi ürettiği hesaplanan alanlar bunun dışındadır.

Yedi Kaynağı Yönetime Almak

// ice.mjs — kayit disi kaynaklarin yonetime alinmasi ve ice aktarma sonrasi ilk planin
// olcumu. Model; gercek bir saglayiciya cagri gitmez.

// BS43: saglayicida duran, hicbir kaydin bilmedigi yedi kaynak. Ilk kurulumda elle acilmislar.
const GERCEK = {
  "nesne_deposu.eski_olcumler": { ad: "eski-olcumler", bolge: "kuzey",
    surum_koruma: "acik", sifreleme: "saglayici" },
  "dns_bolgesi.olcum": { ad: "olcum.ic", ttl: 3600, kayit_sayisi: 41 },
  "makine.eski_toplayici_1": { altag: "altag-01", imaj: "temel-4", boyut: "buyuk",
    etiket: "toplayici-eski-1" },
  "makine.eski_toplayici_2": { altag: "altag-01", imaj: "temel-4", boyut: "buyuk",
    etiket: "toplayici-eski-2" },
  "guvenlik_kumesi.varsayilan": { ag: "ag-01", giris: "10.20.0.0/16", cikis: "0.0.0.0/0" },
  "veri_deposu.eski_sayac": { altag: "altag-01", boyut: "orta", surum: "3.9", yedek: "gunluk" },
  "kuyruk.eski_akis": { altag: "altag-01", saklama: 3, tip: "fifo" },
};

// BS44: kayit elle yazilir; degerler saglayici arayuzunden okunur. Dort noktada tutmuyor.
const ELLE = {
  "nesne_deposu.eski_olcumler": { ad: "eski-olcumler", bolge: "kuzey" },
  "dns_bolgesi.olcum": { ad: "olcum.ic", ttl: 300 },                    // varsayilan sanildi
  "makine.eski_toplayici_1": { altag: "altag-01", imaj: "temel-4-x86", boyut: "buyuk",
    etiket: "toplayici-eski-1" },                                       // yanlis okundu
  "makine.eski_toplayici_2": { altag: "altag-01", imaj: "temel-4", boyut: "buyuk",
    etiket: "toplayici-eski-2" },
  "guvenlik_kumesi.varsayilan": { ag: "ag-01", giris: "10.20.1.0/24" }, // yanlis okundu
  "veri_deposu.eski_sayac": { altag: "altag-01", boyut: "ORTA", surum: "3.9" },  // harf bicimi
  "kuyruk.eski_akis": { altag: "altag-01", saklama: 3, tip: "fifo" },
};

const HESAPLANAN = ["kayit_sayisi"];            // saglayici uretir, kayda yazilmaz
const YENIDEN = ["imaj", "boyut", "altag"];     // BS46: onceki dersin sema kurallari
const KESINTI = { makine: 105, veri_deposu: 900 };  // BS47: yeniden olusturma kesintisi, sn
const NORM = (v) => (typeof v === "string" ? v.toLowerCase() : v);
const K = (v) => JSON.stringify(v);

// BS45: ice aktarma gercegin butun alanlarini duruma yazar; kayda yalniz yazilanlar girer.
const DURUM = structuredClone(GERCEK);

function planla(kayit, taban, { normalle }) {
  const esit = normalle ? (a, b) => K(NORM(a)) === K(NORM(b)) : (a, b) => K(a) === K(b);
  const kalem = new Map();
  for (const [ad, y] of Object.entries(kayit)) {
    const alan = Object.keys(y).filter((k) => !esit(y[k], taban[ad][k]));
    if (alan.length)
      kalem.set(ad, { alan,
        karar: alan.some((k) => YENIDEN.includes(k)) ? "yeniden olustur" : "degistir" });
  }
  return kalem;
}

const yazilan = (ad) => Object.keys(ELLE[ad]).length;
const yonetilebilir = (ad) =>
  Object.keys(GERCEK[ad]).filter((k) => !HESAPLANAN.includes(k)).length;
const kapsanmayan = (ad) => yonetilebilir(ad) - yazilan(ad);
const adresler = Object.keys(GERCEK);

console.log("ice aktarilan kaynaklar");
console.log("adres                        gercek alan  elle yazilan  kapsanmayan  ilk plan");
const PLAN = planla(ELLE, DURUM, { normalle: false });
const UYGULAMA = planla(ELLE, GERCEK, { normalle: true });
for (const ad of adresler)
  console.log(`${ad.padEnd(28)}${String(yonetilebilir(ad)).padStart(11)}` +
    `${String(yazilan(ad)).padStart(14)}${String(kapsanmayan(ad)).padStart(13)}` +
    `  ${PLAN.get(ad) ? `${PLAN.get(ad).karar} (${PLAN.get(ad).alan.join(",")})` : "-"}`);

const top = (f) => adresler.reduce((s, a) => s + f(a), 0);
console.log(`\ntoplam: ${adresler.length} kalem, ${top(yonetilebilir)} yonetilebilir alan, ` +
  `${top(yazilan)} elle yazildi, ${top(kapsanmayan)} alan kayit disi kaldi`);

console.log(`\nice aktarma sonrasi ilk plan: ${PLAN.size} kalem ` +
  `(${[...PLAN.values()].filter((v) => v.karar === "yeniden olustur").length} yeniden olustur)`);
const sahte = [...PLAN.keys()].filter((a) => !UYGULAMA.has(a));
console.log(`  uygulamada gerceklesen: ${UYGULAMA.size} kalem; gerceklesmeyen ${sahte.length}` +
  ` (${sahte.join(", ")})`);
const yenidenler = (m) => [...m].filter(([, v]) => v.karar === "yeniden olustur").map(([a]) => a);
const kesinti = (m) => yenidenler(m).reduce((s, a) => s + (KESINTI[a.split(".")[0]] ?? 0), 0);
console.log(`  yeniden olusturma: planda ${yenidenler(PLAN).length}, uygulamada ` +
  `${yenidenler(UYGULAMA).length}; kesinti planda ${kesinti(PLAN)} sn, uygulamada ` +
  `${kesinti(UYGULAMA)} sn (${(kesinti(UYGULAMA) / 15).toFixed(0)} kacan sayac partisi)`);
const kayip = (m) => yenidenler(m).reduce((s, a) => s + kapsanmayan(a), 0);
console.log(`  yeniden olusturmada varsayilana donecek alan: planda ${kayip(PLAN)}, ` +
  `uygulamada ${kayip(UYGULAMA)}`);

// Duzeltme turu: plan gosterdigi her alani saglayicidan yeniden okuyup kayda gecir.
const DUZELTILMIS = structuredClone(ELLE);
let duzeltilen = 0;
for (const [ad, v] of PLAN)
  for (const k of v.alan) { DUZELTILMIS[ad][k] = GERCEK[ad][k]; duzeltilen++; }
const IKINCI = planla(DUZELTILMIS, DURUM, { normalle: false });
console.log(`\nduzeltme turu: ${duzeltilen} alan yeniden okundu -> ` +
  `ikinci plan ${IKINCI.size} kalem`);

console.log("\nkaydin kapsami: uc secenek");
console.log("secenek              kayda giren (sapmasi gorunur)  yonetilmeyen  " +
  "ilk plan  yeniden olusturmada kayip");
const secenek = [
  ["kayit disi birak", 0, top(yonetilebilir), 0, 0],
  ["kismi ice aktarma", top(yazilan), top(kapsanmayan), PLAN.size, top(kapsanmayan)],
  ["tam ice aktarma", top(yonetilebilir), 0, 0, 0],
];
for (const [ad, ...s] of secenek)
  console.log(ad.padEnd(21) + s.map((x, i) => String(x).padStart([29, 14, 10, 27][i])).join(""));
ice aktarilan kaynaklar
adres                        gercek alan  elle yazilan  kapsanmayan  ilk plan
nesne_deposu.eski_olcumler            4             2            2  -
dns_bolgesi.olcum                     2             2            0  degistir (ttl)
makine.eski_toplayici_1               4             4            0  yeniden olustur (imaj)
makine.eski_toplayici_2               4             4            0  -
guvenlik_kumesi.varsayilan            3             2            1  degistir (giris)
veri_deposu.eski_sayac                4             3            1  yeniden olustur (boyut)
kuyruk.eski_akis                      3             3            0  -

toplam: 7 kalem, 24 yonetilebilir alan, 20 elle yazildi, 4 alan kayit disi kaldi

ice aktarma sonrasi ilk plan: 4 kalem (2 yeniden olustur)
  uygulamada gerceklesen: 3 kalem; gerceklesmeyen 1 (veri_deposu.eski_sayac)
  yeniden olusturma: planda 2, uygulamada 1; kesinti planda 1005 sn, uygulamada 105 sn (7 kacan sayac partisi)
  yeniden olusturmada varsayilana donecek alan: planda 1, uygulamada 0

duzeltme turu: 4 alan yeniden okundu -> ikinci plan 0 kalem

kaydin kapsami: uc secenek
secenek              kayda giren (sapmasi gorunur)  yonetilmeyen  ilk plan  yeniden olusturmada kayip
kayit disi birak                                 0            24         0                          0
kismi ice aktarma                               20             4         4                          4
tam ice aktarma                                 24             0         0                          0

Üst tablo kopya işinin bilançosudur. Yedi kaynağın yirmi dört yönetilebilir alanı var; elle yazılan yirmi. Dört alan hiç yazılmadı: nesne deposunun sürüm koruma ve şifreleme ayarları, güvenlik kümesinin çıkış kuralı, veri deposunun yedek düzeni. Bunlar unutulmadı — kaydı yazan kişi onları sağlayıcı arayüzünde ya görmedi ya da varsayılan sanıp geçti. Kaydın kapsamı burada tam olarak yüzde 83’tür, ve kalan yüzde 17 kaydın hiç bilmediği altyapıdır.

Kapsama oranı kaynaktan kaynağa değişiyor. İki makine ve kuyruk dört alanının dördüyle yazıldı; nesne deposu dördün ikisiyle. Fark, alanların ne kadar göze göründüğüne bağlı: makinenin alt ağı ve imajı arayüzün ilk ekranındadır, nesne deposunun şifreleme ayarı üçüncü sekmesinde. Kaydın kapsamı, kaydı yazan kişinin ne kadar aşağı kaydırdığıyla belirleniyor.

İçe aktarmanın kendisi tek bir şey yapar: sağlayıcıdaki gerçek kimliği kayıttaki bir adrese bağlar ve o kaynağın bütün alanlarını duruma yazar. Yaptığı şeyin ne olmadığı daha önemlidir — kaydı yazmaz. Durum gerçeği birebir bilir, kayıt ise yalnız insanın yazdığını. Bu kursta ilk kez kayıt ile durum aynı andan başlayıp ayrı içeriklerle doğuyor, ve aradaki fark hemen ilk planda görünüyor.

Seçilen adres de bir karardır ve bu konunun daha önceki ölçümüne bağlanır. Yedi kaynak burada kendi adlarıyla adreslendi; bir sıra numarasıyla adreslenselerdi, ilerideki her ekleme ve çıkarma adresleri kaydırır ve içe aktarılmış kaynaklar başka gerçek kaynaklara işaret etmeye başlardı. İçe aktarma, adres kararlılığının bedelinin en yüksek olduğu yerdir: yanlış adres yalnız gereksiz bir yeniden oluşturma değil, yanlış kaynağın yeniden oluşturulması demektir.

İçe Aktarma Sonrası İlk Plan

İçe aktarma bittikten sonra hiçbir şeyin değişmemiş olması beklenir: kaynaklar aynı, durum gerçeğin birebir kopyası. Buna rağmen ilk plan dört kalem gösteriyor, ve bu dört kalemin tamamı kaydın gerçekle tutmamasından geliyor — hiçbiri istenmiş bir değişiklik değil.

Dördünün üçü uygulamada gerçekleşiyor. Gerçekleşmeyen kalem veri deposudur: kayıt boyutu büyük harfle yazdığı için planlayıcı bir fark görüyor, sağlayıcı harf ayrımı yapmadığı için uygulamada hiçbir şey olmuyor. Bu kalem her plan koşumunda yeniden çıkacak ve kimse dokunmadıkça kalıcı gürültü olarak kalacak.

Bu dört kalemin tehlikesi büyüklüklerinde değil, beklentiye ters düşmelerindedir. İçe aktarma sonrası planın boş çıkması beklenir; boş çıkmadığında iki okuma mümkündür — ya kayıt gerçeği yanlış tarif ediyordur, ya da gerçekten bir değişiklik isteniyordur. İkisi planda aynı görünür. Önceki dersin ölçtüğü gözden geçirme yükü burada en kötü hâlindedir: yeni içe aktarılmış bir kaynağın planını okuyan kişinin elinde, kalemin hangi türden olduğunu ayırt edecek hiçbir işaret yoktur. Tek yol, gösterilen her değeri sağlayıcıdan tekrar okumaktır — yani içe aktarmanın kopya işini bir kez daha yapmaktır.

Asıl sayı yeniden oluşturma satırındadır. Plan iki kaynağın yeniden oluşturulacağını söylüyor; uygulamada bir tanesi oluyor. Aradaki fark ölçüm ağı biriminde büyüktür: planın vaat ettiği kesinti 1005 saniye, gerçekleşen 105 saniye. Bin beş saniyenin dokuz yüzü veri deposuna aittir ve o kalem yalnız bir harf biçimi farkından doğmuştu. Kaydı yazan kişi orta yerine ORTA yazdığı için, plan kırk bir günlük sayaç verisini taşıyan bir veri deposunun yeniden oluşturulacağını gösterdi.

Gerçekleşen 105 saniye de bedavaya gelmedi. Eski toplayıcı makinelerden birinin imajı yanlış okunmuştu; plan bunu bir değişiklik sanıp makineyi yeniden oluşturdu, makine 105 saniye hizmet dışı kaldı ve o bölgede yedi sayaç partisi kaçtı. Kaynak hiç değişmemişti; değişen tek şey onun kayıttaki tarifiydi. İçe aktarmanın kesintisi, kaynağın değil kopyanın hatasından geliyor.

Düzeltme turu bu bölümün kapanışıdır. Planın gösterdiği dört alan sağlayıcıdan yeniden okunup kayda geçirildiğinde ikinci plan sıfır kalem çıkıyor. Yani içe aktarma tek adımda bitmiyor: adres bağlandıktan sonra kayıt ile gerçeği oturtmak için en az bir tur daha gerekiyor, ve o turun girdisi planın kendisidir. Plan burada bir uyarı değil, bir düzeltme listesi olarak çalışıyor.

Yeniden Oluşturmada Kaybolan Alan

Kayıt dışı kalan dört alan içe aktarmadan hemen sonra zararsız görünür. Plan onları göstermez, uygulama onlara dokunmaz, kaynak olduğu gibi çalışır. Zararsızlıkları tek bir koşula bağlıdır: kaynağın yeniden oluşturulmaması.

Yeniden oluşturma o koşulu kaldırır. Kaynak yok edilip yeniden yaratıldığında yeni kaynak kayıttan kurulur, ve kayıtta yazmayan her alan sağlayıcı varsayılanına döner. Ölçümde bu, planlanan iki yeniden oluşturmada bir alan, gerçekleşen bir yeniden oluşturmada sıfır alandır — sayı küçük, ama kaybedilecek alan veri deposunun yedek düzenidir. Günlük yedek alan bir veri deposu, kimse istemeden ve hiçbir planda görünmeden yedeksiz kalabilirdi.

Buradaki tehlikenin biçimi dikkate değer. Kayıt dışı alan bir sapma olarak da görünmez, çünkü sapma ancak kayıtla karşılaştırılabilen alanlarda ölçülebilir. Kaydın bilmediği alan, kaydın sapmasını da bilmez. Yedi kaynağın yirmi dört alanının dördü, bu kursun ölçtüğü hiçbir farkın içine girmiyor — ne planda, ne sapma sayısında, ne gözden geçirmede.

Kaydın Kapsamı: Üç Seçenek

Son tablo kararı üç seçenek arasında açıyor ve ilk sütun yanıltıcı olanı ele veriyor. Kaynağı kayıt dışı bırakmak sıfır satır kayıt ister, sıfır kalemlik plan üretir, yeniden oluşturmada sıfır alan kaybettirir. Bütün sütunlar sıfır — ama ilk sütun da sıfırdır: sapması görünen alan yok. Yirmi dört alanın hiçbiri hiçbir zaman karşılaştırılmaz. Kayıt dışı kaynak ucuz değildir, ölçüsüzdür.

Kısmi içe aktarma yirmi alanı görünür kılar, dördünü dışarıda bırakır ve karşılığında dört kalemlik bir ilk plan ile bir düzeltme turu ister. Tam içe aktarma yirmi dört alanı da yazar; ilk planı sıfırdır ve yeniden oluşturmada hiçbir alan kaybolmaz, ama yazılacak alan sayısı yüzde yirmi artar ve o alanların her biri gelecekte bakımı gereken bir satırdır.

Tabloda görünmeyen bir dördüncü seçenek daha var: içe aktarıp sonra yönetimden çıkarmak. Kaynak kayıtta durur ama uygulama ona dokunmaz. Bu seçenek ilk üçünün kötü yanlarını birleştirir — kayıt bakım ister, sapma yine görünmez — ve tek kazancı kaynağın varlığının yazılı olmasıdır. Ölçüm ağında bunun tek meşru kullanımı, yok edilmesi tehlikeli olan eski veri deposudur.

Kursun ölçüsüyle söylenirse: kayıt ne kadar genişse gerçekle arasındaki fark o kadar ölçülebilir olur, ve fark ölçülebilir olduğu ölçüde yönetilebilir. Ölçülemeyen kalem düzelmiyor değil — kimse bozulduğunu bilmiyor. Yedi kaynağın dört alanı bugün doğru; yarın biri değiştirdiğinde bunu gösterecek hiçbir plan yok.

Özet

  • Yedi kayıt dışı kaynağın 24 yönetilebilir alanının 20’si elle yazıldı, 4’ü kayıt dışı kaldı: kapsama yüzde 83. Kapsamayı belirleyen şey, alanın sağlayıcı arayüzünde ne kadar görünür olduğu.
  • İçe aktarma sonrası ilk plan 4 kalem gösterdi ve hiçbiri istenmiş bir değişiklik değildi; 3’ü uygulamada gerçekleşti, 1’i harf biçimi farkından doğduğu için her koşumda yeniden çıkacak.
  • Plan 2 yeniden oluşturma vaat etti, uygulamada 1 oldu: kesinti planda 1005, uygulamada 105 saniye ve 7 kaçan sayaç partisi. Kesintinin sebebi kaynağın değişmesi değil, kopyanın yanlış okunmasıydı.
  • Düzeltme turu 4 alanı sağlayıcıdan yeniden okuyup ikinci planı 0 kaleme indirdi; içe aktarma tek adımda bitmiyor ve düzeltmenin girdisi planın kendisi oluyor.
  • Kayıt dışı kalan 4 alan yalnız kaynak yeniden oluşturulmadığı sürece zararsız; oluşturulduğunda varsayılana döner. Kaybedilecek alanlardan biri veri deposunun yedek düzeniydi.
  • Üç seçenek karşılaştırıldığında kayıt dışı bırakmanın bütün sütunları sıfır çıkıyor — sapması görünen alan sütunu dahil. Kayıt dışı kaynak ucuz değil, ölçüsüzdür.

Sonraki Adım

Bu konu kaydın kendisini ölçtü: sırayı, yinelemeyi, planı, ve şimdi kaydın kapsamını. Dört dersin hepsinde aynı şey bir kez daha ortaya çıktı — plan ile uygulama arasındaki fark ölçüldü, ama planın dayandığı durum hep verilmiş kabul edildi. Oysa durum bir dosyadır: bir yerde durur, biri onu yazar, biri okur. Bu dersteki içe aktarma da doğrudan ona yazdı.

Sonraki konu o dosyayı açar. Ölçülecek şeyler bellidir: durum nerede duruyor ve kim erişebiliyor, içinde ne yazıyor — hassas değerler dahil — ve iki kişi aynı anda uyguladığında ne oluyor. Bu sonuncusu en pahalı sorudur, çünkü iki uygulamanın birbirini ezmesi hiçbir planda görünmez.

İ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