Ders 04 / 27
Sağlama ve Yapılandırma Yönetimi
Bir ortamın otuz dört kalemi iki katmana bölünür — kaynağı yaratan sağlama katmanı ve kaynağın içini ayarlayan yapılandırma katmanı — ve sınırın nereye çizildiği sayılır. Çakışan kalem, hiçbir katmanda olmayan boşluk, çelişen değerde hangi katmanın kazandığı, yeniden sağlamadan sonraki sapma penceresi ve üç ayrı sınır çiziminin bedeli ölçülür.
İçindekiler
Önceki ders iki işi birbirine karıştırdı. İmajın hangi paketleri taşıdığı ve makinenin üzerindeki ayarların ne olduğu bir iştir; makinenin kaç tane olduğu, hangi ağa bağlandığı ve hangi diski taşıdığı başka bir iştir. Acil düzeltmenin kaybolması tam olarak bu iki işin sınırında oldu.
Sağlama kaynağı yaratır: makineyi açar, ağı kurar, diski bağlar, kuyruğu oluşturur. Yapılandırma yönetimi kaynağın içini ayarlar: paket kurar, dosya yazar, servisi başlatır. İkisinin de bir kaydı vardır ve iki kayıt farklı biçimde yazılır. Bu ders bir ortamın kalemlerini iki katmana böler ve sınırın nereye çizildiğini sayar: kaç kalem her iki katmanda da tanımlı, kaç kalem hiçbirinde, çelişen bir kalemde hangi katman kazanıyor, ve sınır kaydığında kaç kalem iki kez uygulanıyor.
Ortam yine bölgesel ölçüm ağının hazırlık ortamıdır ve kurgudur. Kayıt dosyaları gerçekten
diske yazılır; katmanlara bölme, uygulama sırası ve sapma penceresi node ile modellenir.
AT19. Hazırlık ortamı otuz dört kalemle temsil edilir ve her kalemin doğal katmanı
envanterde yazılıdır: kaynak ya da icerik.
AT20. İki katmanın kaydı iki ayrı biçimdedir — sağlama kaydı yapılandırma dilinde bloklar
hâlinde, ayar kaydı yapılandırma ajanının satır biçiminde.
AT21. Bir kalem tek katmanda tanımlıysa o katman onu uygular; iki katmanda da tanımlıysa son
koşan kazanır.
AT22. Olağan sıra sağlama sonra ayardır. Bir yeniden sağlama tetiklendiğinde sıra tersine
döner: ayar önce koşmuştur, sağlama sonra.
AT23. Yapılandırma ajanı otuz dakikada bir koşar; ortamda on dört makine vardır.
AT24. Bir çeyrekte yirmi iki değişiklik olur — yedisi kaynak kalemine, on beşi içerik
kalemine; içerik değişikliklerinin altısı imaja giren kalemlerdedir.
Envanter ve İki Kaydın Biçimi
#!/usr/bin/env bash # Bir ortamin kalem envanteri ve iki katmanin kaydi: saglama (kaynak yaratma), ayar (kaynak ici). set -e cat > envanter.txt <<'SON' ag.olcum-agi.blok kaynak ag.olcum-agi.alt_ag_sayisi kaynak ag.olcum-agi.cikis_yolu kaynak makine.toplayici.sayi kaynak makine.toplayici.boyut kaynak makine.toplayici.disk_gb kaynak makine.toplayici.imaj kaynak makine.dogrulayici.sayi kaynak makine.dogrulayici.boyut kaynak kuyruk.okuma.bolum kaynak kuyruk.okuma.saklama_saat kaynak veri_deposu.olcum.boyut_gb kaynak veri_deposu.olcum.yedek_gun kaynak nesne_deposu.arsiv.sinif kaynak nesne_deposu.arsiv.yasam_gun kaynak guvenlik.toplayici.giris kaynak guvenlik.toplayici.cikis kaynak ad_kaydi.toplayici.ic kaynak makine.toplayici.paket.cozumleyici icerik makine.toplayici.paket.kural_paketi icerik makine.toplayici.ayar.kutuk_duzeyi icerik makine.toplayici.ayar.es_zamanli_isci icerik makine.toplayici.ayar.toplu_is_saati icerik makine.toplayici.dizin.veri icerik makine.toplayici.dizin.kutuk icerik makine.toplayici.servis.otomatik_baslat icerik makine.toplayici.saat_dilimi icerik makine.toplayici.kutuk_dondurme icerik makine.dogrulayici.paket.cozumleyici icerik makine.dogrulayici.ayar.kutuk_duzeyi icerik makine.dogrulayici.servis.otomatik_baslat icerik veri_deposu.olcum.kullanici.rapor icerik veri_deposu.olcum.parametre.baglanti_sayisi icerik nesne_deposu.arsiv.erisim_politikasi icerik SON cat > saglama.alt <<'SON' kaynak ag "olcum-agi" { blok = "10.40.0.0/16" alt_ag_sayisi = 3 } kaynak makine "toplayici" { sayi = 3 boyut = "orta" disk_gb = 40 imaj = "taban-7" } kaynak makine "toplayici" { ayar.kutuk_duzeyi = "ozet" saat_dilimi = "UTC" } kaynak makine "toplayici" { servis.otomatik_baslat = "acik" paket.cozumleyici = "3.4.0" } kaynak makine "dogrulayici" { sayi = 2 boyut = "kucuk" } kaynak kuyruk "okuma" { bolum = 6 saklama_saat = 72 } kaynak veri_deposu "olcum" { boyut_gb = 200 yedek_gun = 14 } kaynak nesne_deposu "arsiv" { sinif = "seyrek" yasam_gun = 365 erisim_politikasi = "hesap-ici" } kaynak guvenlik "toplayici" { giris = "10.40.0.0/16" } SON cat > ayar.kayit <<'SON' makine/toplayici paket.cozumleyici = 3.5.0 makine/toplayici paket.kural_paketi = 9.1.0 makine/toplayici ayar.kutuk_duzeyi = ozet makine/toplayici ayar.es_zamanli_isci = 8 makine/toplayici ayar.toplu_is_saati = 02:30 makine/toplayici dizin.veri = /veri/olcum makine/toplayici dizin.kutuk = /kutuk/toplayici makine/toplayici servis.otomatik_baslat = acik makine/toplayici saat_dilimi = UTC makine/toplayici disk_gb = 40 makine/dogrulayici paket.cozumleyici = 3.5.0 makine/dogrulayici ayar.kutuk_duzeyi = ayrinti makine/dogrulayici servis.otomatik_baslat = acik veri_deposu/olcum kullanici.rapor = salt-okur nesne_deposu/arsiv erisim_politikasi = hesap-ici-artiokuma SON
Envanter ortamda gerçekten var olan kalemleri sayar; kayıtların ne söylediğinden bağımsızdır.
İki kayıt bunun üzerine düşer. Sağlama kaydı bloklar hâlinde yazılır ve bir bloğun içinde hem
kaynağın kabuğuna ait nitelikler (sayi, boyut, disk_gb) hem de kaynağın içine ait olanlar
(paket.cozumleyici, saat_dilimi) bulunabilir. Ayar kaydı satır biçimindedir ve yalnız kaynağın
içine yazar. Sınır ikisinin arasında değil, ikisinin kesişiminde duruyor.
Sınır Nereye Düşüyor
// katman.mjs — envanteri iki katmanin kaydiyla esler; cakismayi ve boslugu sayar. Model. import { readFileSync } from "node:fs"; const BLOK = /^kaynak\s+(\w+)\s+"([\w-]+)"\s*\{(.*)\}$/; export const saglama = new Map(); for (const s of readFileSync("saglama.alt", "utf8").split("\n")) { const m = BLOK.exec(s.trim()); if (m) for (const x of m[3].matchAll(/([\w.]+)\s*=\s*("[^"]*"|[\w./:-]+)/g)) saglama.set(`${m[1]}.${m[2]}.${x[1]}`, x[2].replaceAll('"', "")); } export const ayar = new Map(); // yapilandirma ajaninin kaydi: baska bir bicim for (const s of readFileSync("ayar.kayit", "utf8").split("\n")) { const m = /^(\w+)\/([\w-]+)\s+([\w.]+)\s*=\s*(\S+)$/.exec(s.trim()); if (m) ayar.set(`${m[1]}.${m[2]}.${m[3]}`, m[4]); } export const envanter = readFileSync("envanter.txt", "utf8").trim().split("\n") .map((s) => s.trim().split(/\s+/)).map(([k, dogal]) => ({ k, dogal })); export const bol = (kalem, S, A) => { // her kalem tam bir kutuya duser const g = { yalnizSaglama: [], yalnizAyar: [], cakisma: [], bosluk: [] }; for (const { k } of kalem) { const s = S.has(k), a = A.has(k); g[s && a ? "cakisma" : s ? "yalnizSaglama" : a ? "yalnizAyar" : "bosluk"].push(k); } return g; }; if (process.argv[1].endsWith("katman.mjs")) { // dogrudan kosarsa yazar, ice aktarilirsa yazmaz const g = bol(envanter, saglama, ayar); console.log(`envanter ${envanter.length} kalem saglama kaydi ${saglama.size}` + ` ayar kaydi ${ayar.size}`); console.log(` yalniz saglama ${g.yalnizSaglama.length} yalniz ayar ${g.yalnizAyar.length}` + ` cakisma ${g.cakisma.length} bosluk ${g.bosluk.length}`); console.log(`cakisan ${g.cakisma.length} kalem (iki katmanda da tanimli):`); for (const k of g.cakisma) console.log(` ${k.padEnd(40)} saglama "${saglama.get(k)}" ayar "${ayar.get(k)}"` + ` ${saglama.get(k) === ayar.get(k) ? "ayni" : "CELISKI"}`); console.log(`bosluktaki ${g.bosluk.length} kalem (hicbir katmanda yok):`); for (const k of g.bosluk) console.log(` ${k.padEnd(44)} dogal katman: ${envanter.find((e) => e.k === k).dogal}`); }
envanter 34 kalem saglama kaydi 20 ayar kaydi 15 yalniz saglama 14 yalniz ayar 9 cakisma 6 bosluk 5 cakisan 6 kalem (iki katmanda da tanimli): makine.toplayici.disk_gb saglama "40" ayar "40" ayni makine.toplayici.paket.cozumleyici saglama "3.4.0" ayar "3.5.0" CELISKI makine.toplayici.ayar.kutuk_duzeyi saglama "ozet" ayar "ozet" ayni makine.toplayici.servis.otomatik_baslat saglama "acik" ayar "acik" ayni makine.toplayici.saat_dilimi saglama "UTC" ayar "UTC" ayni nesne_deposu.arsiv.erisim_politikasi saglama "hesap-ici" ayar "hesap-ici-artiokuma" CELISKI bosluktaki 5 kalem (hicbir katmanda yok): ag.olcum-agi.cikis_yolu dogal katman: kaynak guvenlik.toplayici.cikis dogal katman: kaynak ad_kaydi.toplayici.ic dogal katman: kaynak makine.toplayici.kutuk_dondurme dogal katman: icerik veri_deposu.olcum.parametre.baglanti_sayisi dogal katman: icerik
Otuz dört kalem dört kutuya bölündü: on dördü yalnız sağlamada, dokuzu yalnız ayarda, altısı ikisinde birden, beşi hiçbirinde. İki kayıt toplam otuz beş kalem tanımlıyor ama örttükleri kalem sayısı yirmi dokuz — aradaki altı fark çakışmadır ve ikinci kez yazılan tanım hiçbir kalem kazandırmaz.
Çakışan altı kalemin dördü aynı değeri taşıyor. Bu dördü zararsız görünür ve zararsız oldukları tek koşul, birinin değiştiğinde ötekinin de değiştirilmesidir; ikisi ayrı dosyada, ayrı biçimde ve çoğu zaman ayrı kişiler tarafından yazıldığı için bu koşul kendiliğinden sağlanmaz. Kalan iki kalem zaten çelişkili: çözümleyici sürümü bir kayıtta 3.4.0, ötekinde 3.5.0; arşivin erişim politikası bir kayıtta dar, ötekinde geniş.
Çakışmanın nereden doğduğu da okunabilir. Altı kalemin beşi makine kaynağının üzerindedir ve beşinin de bir imaj karşılığı vardır: sağlama katmanı makineyi bir imajdan açtığı için o imajın taşıdığı paket sürümünü, saat dilimini ve servis durumunu dolaylı olarak tanımlamış olur. Ayar katmanı aynı değerleri doğrudan tanımlar. İki kayıt aynı kaleme iki farklı yoldan ulaşıyor ve ikisinin de yazdığından haberi yok; çakışma bir dikkatsizlik değil, imajın kayıtta görünmeyen bir tanım taşımasıdır.
Boşluktaki beş kalem 01’in son satırındaki ölçünün aynısıdır ve burada doğal katmanlarıyla birlikte görünüyor: üçünün doğal katmanı kaynak, ikisinin içerik. Bunlar kayıt yazılmadığı için değil, iki kaydın arasına düştüğü için yazısız kaldı — her katmanın sahibi ötekinin yazdığını varsaydı. Çıkış yolu, güvenlik kuralının çıkış yönü, ad kaydı, kütük döndürme ve bağlantı sayısı: beşi de kimsenin sahiplenmediği kalemler.
Hangi Katman Kazanıyor
// sinir.mjs — uygulama sirasi, yeniden saglama sonrasi sapma penceresi ve uc sinir cizimi. import { saglama, ayar, envanter, bol } from "./katman.mjs"; const g = bol(envanter, saglama, ayar); const celisen = g.cakisma.filter((k) => saglama.get(k) !== ayar.get(k)); console.log(`cakisan kalemde hangi katman kazaniyor (son yazan kazanir)`); for (const [ad, sira] of [["saglama sonra ayar (olagan)", ["saglama", "ayar"]], ["ayar sonra yeniden saglama", ["ayar", "saglama"]]]) { const son = (k) => (sira[1] === "ayar" ? ayar : saglama).get(k); console.log(` ${ad.padEnd(28)} celisen ${celisen.length} kalem -> ` + celisen.map((k) => `${k.split(".").pop()}="${son(k)}"`).join(" ")); } // Yeniden saglama: makine imajdan yeniden dogar, ayar katmaninin yazdigi kalem imaja doner. const MAKINE = 14, AJAN_DK = 30; const makineKalem = [...ayar.keys()].filter((k) => k.startsWith("makine.")); const donen = makineKalem.filter((k) => (saglama.get(k) ?? "varsayilan") !== ayar.get(k)); console.log(`\nyeniden saglama sonrasi sapma penceresi (ajan ${AJAN_DK} dakikada bir kosar)`); console.log(` makinede ayar katmaninin yazdigi kalem ${makineKalem.length}` + ` yeniden saglamadan sonra yanlis degerde ${donen.length}`); console.log(` ${MAKINE} makine icin ${donen.length * MAKINE} kalem` + ` ortalama ${AJAN_DK / 2} dk, en kotu ${AJAN_DK} dk` + ` -> ${donen.length * MAKINE * AJAN_DK / 2} kalem-dakika sapma`); // Uc sinir cizimi. Imaja giren kalem: paket, servis ve saat dilimi. const imajaGirer = (k) => /paket\.|servis\.|saat_dilimi/.test(k); const cizim = { "C1 sinir kaynagin kabugunda": (k) => [saglama.has(k), ayar.has(k)], "C2 sinir imaja kaydirildi": (k) => [saglama.has(k) || (ayar.has(k) && imajaGirer(k)), ayar.has(k) && !imajaGirer(k)], "C3 tek katman (hepsi saglamada)": (k) => [saglama.has(k) || ayar.has(k), false], }; const AGIR = { "C1 sinir kaynagin kabugunda": 0, "C2 sinir imaja kaydirildi": 6, "C3 tek katman (hepsi saglamada)": 15 }; console.log(`\nsinir nereye cizilirse ne oluyor (ceyrekte 22 degisiklik: 7 kaynak, 15 icerik)`); for (const [ad, f] of Object.entries(cizim)) { const S = new Map(), A = new Map(); for (const { k } of envanter) { const [s, a] = f(k); if (s) S.set(k, 1); if (a) A.set(k, 1); } const b = bol(envanter, S, A); console.log(` ${ad.padEnd(32)} saglama ${S.size} ayar ${A.size}` + ` cakisma ${b.cakisma.length} bosluk ${b.bosluk.length}` + ` iki kez uygulanan ${b.cakisma.length} agir yola dusen degisiklik ${AGIR[ad]}`); }
cakisan kalemde hangi katman kazaniyor (son yazan kazanir) saglama sonra ayar (olagan) celisen 2 kalem -> cozumleyici="3.5.0" erisim_politikasi="hesap-ici-artiokuma" ayar sonra yeniden saglama celisen 2 kalem -> cozumleyici="3.4.0" erisim_politikasi="hesap-ici" yeniden saglama sonrasi sapma penceresi (ajan 30 dakikada bir kosar) makinede ayar katmaninin yazdigi kalem 13 yeniden saglamadan sonra yanlis degerde 9 14 makine icin 126 kalem ortalama 15 dk, en kotu 30 dk -> 1890 kalem-dakika sapma sinir nereye cizilirse ne oluyor (ceyrekte 22 degisiklik: 7 kaynak, 15 icerik) C1 sinir kaynagin kabugunda saglama 20 ayar 15 cakisma 6 bosluk 5 iki kez uygulanan 6 agir yola dusen degisiklik 0 C2 sinir imaja kaydirildi saglama 23 ayar 9 cakisma 3 bosluk 5 iki kez uygulanan 3 agir yola dusen degisiklik 6 C3 tek katman (hepsi saglamada) saglama 29 ayar 0 cakisma 0 bosluk 5 iki kez uygulanan 0 agir yola dusen degisiklik 15
Çelişen iki kalemin son değeri koşum sırasına bağlı. Olağan sırada ayar katmanı sonra koştuğu için o kazanır; çözümleyici 3.5.0, erişim politikası geniş olur. Bir yeniden sağlama tetiklendiğinde sağlama katmanı sonra koşar ve aynı iki kalem ters değere döner. Kazanan katman bir karar değil, bir zamanlama sonucudur — ve o zamanlamayı belirleyen şey çoğu zaman kimsenin izlemediği bir olaydır: bir makinenin ölmesi, bir ölçek değişikliği, bir imaj güncellemesi.
İkinci tablo bunun süresini veriyor. Yeniden sağlamadan sonra makinede ayar katmanının yazdığı on üç kalemin dokuzu imajın taşıdığı değere döner; ajan otuz dakikada bir koştuğu için ortalama on beş dakika yanlış değerde kalır. On dört makinede bu 126 kalem ve 1.890 kalem-dakikadır. Bu süre bir kesinti değil, bir sapma penceresidir: ortam koşuyor, ölçüm yapıyor, ama dokuz kalemi kaydın söylediği değerde değil.
Sınır Kaydığında
Son tablo sınırın üç ayrı yere çizilmesini karşılaştırıyor. C1 sınırı kaynağın kabuğunda tutar:
her katman kendi kaydını yazar, çakışma altı, iki kez uygulanan kalem altı, ama hiçbir değişiklik
ağır yola düşmez — on beş içerik değişikliği ajan koşumuyla biter. C2 sınırı imaja kaydırır:
paket, servis ve saat dilimi kalemleri imaja pişirilir, ayar katmanı on beşten dokuza iner, çakışma
altıdan üçe düşer — ama altı değişiklik artık imaj pişirmeyi ve makinelerin yeniden oluşturulmasını
gerektirir. C3 sınırı tümüyle kaldırır: yirmi dokuz kalem tek katmanda, çakışma sıfır, iki kez
uygulanan kalem sıfır — ve on beş içerik değişikliğinin tamamı ağır yola düşer.
Sağlama kaydının kalem sayısı da üç çizimde yirmiden yirmi üçe, oradan yirmi dokuza çıkıyor. Tek katmana inmek kaydı sadeleştirmiyor; iki kaydın toplamını tek dosyaya yığıyor ve o dosyayı okuyan herkesi ilgilendirmeyen kalemlerle karşılaştırıyor.
Üç çizimde de değişmeyen tek sayı boşluktur: beş. Sınırın yerini değiştirmek çakışmayı azaltır ya da artırır, ama hiçbir katmanın sahiplenmediği kalemi kapsama almaz. Boşluk sınırın nerede olduğuyla ilgili değil, envanterin kaydın dışında kalan kısmıyla ilgilidir; onu kapatmanın tek yolu kaleme bir sahip yazmaktır.
Çakışmanın azalması da bedava değil. C1 ile C3 arasında çakışma altıdan sıfıra inerken ağır yola
düşen değişiklik sıfırdan on beşe çıkıyor. İki sayı ters yönde hareket ediyor ve karar bu iki sayı
arasında veriliyor: bir çeyrekte altı çakışmanın gözden kaçırdığı bir tutarsızlık mı, yoksa on beş
yeniden oluşturmanın süresi mi daha pahalı. Sorunun tek bir doğru yanıtı yok, ama iki yanıt da
sayılabilir.
Özet
- Otuz dört kalem iki kayda bölündüğünde 14’ü yalnız sağlamada, 9’u yalnız ayarda, 6’sı ikisinde birden, 5’i hiçbirinde çıktı; 35 tanım yalnız 29 kalemi örtüyor.
- Çakışan 6 kalemin 4’ü aynı değeri taşıyor ve zararsızlıkları iki kaydın birlikte güncellenmesine bağlı; 2’si zaten çelişkili.
- Çelişen kalemde kazanan katman son koşandır: olağan sırada ayar, yeniden sağlamada sağlama; kazanan bir karar değil, zamanlama sonucudur.
- Yeniden sağlamadan sonra makine başına 9 kalem imajın değerine döner ve ajan koşana kadar ortalama 15 dakika yanlış kalır; 14 makinede 1.890 kalem-dakika sapma.
- Sınır üç ayrı yere çizildiğinde çakışma 6, 3 ve 0 oldu; ağır yola düşen değişiklik 0, 6 ve 15’e çıktı; boşluk üç çizimde de 5’te kaldı.
Sonraki Adım
Bu dersin son iki sayısı aynı şeyi iki yerden söylüyor. Yeniden sağlamadan sonra dokuz kalem kaydın söylediği değerde değildi ve on beş dakika öyle kaldı; beş kalem hiçbir kaydın kapsamında olmadığı için her zaman öyle. İkisi de aynı ada sahip: kayıt bir şey diyor, gerçek başka.
Sonraki ders bu konunun kapanışıdır ve bu farkı doğrudan ölçer. Bir sapma tespiti yazılır — kayıt okunur, gerçek durum okunur, kalem kalem fark çıkarılır — ve dört şey sayılır: bir dönem boyunca biriken sapma, tarama sıklığına göre tespit gecikmesi, sapmanın kaynağı, ve düzeltmenin bedeli. Sonuncusu en az öteki üçü kadar önemlidir: bir sapmayı geri almak bazen çalışan bir şeyi bozar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.