---
title: 'Sağlama ve Yapılandırma Yönetimi'
source: 'https://academia.sh/tr/kurslar/kod-olarak-altyapi/saglama-ve-yapilandirma-yonetimi'
course: 'Kod Olarak Altyapı'
language: tr
updated: '2026-08-17T18:09:06+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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 **kurgu**dur. 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

```bash
#!/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

```js
// 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ışma**dı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

```js
// 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 sonucu**dur — 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 penceresi**dir: 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şluk**tur: 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.
