---
title: 'Saklama ve Maliyet'
source: 'https://academia.sh/tr/kurslar/devops-gozlemlenebilirlik/saklama-ve-maliyet'
course: 'Gözlemlenebilirlik ve İşletim'
language: tr
updated: '2026-08-17T18:09:06+00:00'
license: 'CC BY-SA 4.0'
---

# Saklama ve Maliyet

Üç saklama basamağı taranır ve her basamakta yanıtlanabilen soru sayısı ile bayt birlikte sayılır: soru başına maliyet basamak basamak çıkarılır, bir basamağın marjinal bedeli bin katı fark eder ve en ucuz basamağın hangi soruları hangi nedenle kaybettiği adıyla yazılır.

Buraya kadarki beş ölçümde saklama süresi hep sabit tutuldu. Ölçüt hattı otuz gün, günlük hattı
bir saat üzerinden fiyatlandı ve her ders tek bir ayrıntı düzeyinde ölçüldü. Gerçek bir hat böyle
işlemez: veri yaşlandıkça çözünürlüğü düşürülür, etiketleri seyreltilir, satırları atılır ve
sonunda özete iner.

Bu ders o basamakları tarar. Ölçü değişmez — her basamakta **yanıtlanabilen soru sayısı** ile
**bayt** birlikte sayılır ve soru başına maliyet basamak basamak çıkarılır. Sonunda iki sayı yan
yana durur: bir basamağı eklemenin marjinal bedeli ve o basamağın kapattığı sorunun adı.

Sayılar **bölgesel ölçüm ağının** hattındandır ve **kurgudur**; ölçülen şey `node` ile kurulmuş
bir **modeldir** ve girdileri bu konunun önceki derslerinden gelir.

**OG31.** Üç basamağın yaş aralığı, çözünürlüğü, düşürdüğü etiketler ve tuttuğu günlük satır
türleri kurgudur ve önceden yazılıdır.
**OG32.** Ölçüt seri sayısı ikinci dersin gerçekleşen kümesinden alınır: 6.888 seri. Özet
basamağında `ornek` etiketi servis düzeyine toplanır, `dilim` etiketi tümüyle düşürülür.
**OG33.** Günlük hacmi dördüncü dersin akışından türer: taban 232 satır/saniye, gecelik iş 540.000
satır; hata satırı kırpma sınırındaki 512 bayttır.
**OG34.** Her sorunun ufku ikinci dersten, çözünürlük gereksinimi üçüncü dersten, gereken günlük
satır türü dördüncü ve beşinci derslerden gelir.
**OG35.** Bir basamak bir soruyu yanıtlar sayılır: yaş aralığı sorunun ufkunu kapsıyorsa,
çözünürlüğü yeterliyse, gereken etiketi düşürmemişse ve gereken satır türünü tutuyorsa.
**OG36.** S12 hiçbir basamakta yanıtlanmaz; gerektirdiği veri hiçbir basamağın içeriğinde yoktur.

## Üç Basamak ve Ayrım Ölçütleri

```js
// basamak.mjs — saklama basamaklari, her basamakta yanitlanan soru ve soru basina maliyet.
export const OLCUT = {              // olcut: [ornek tabani, servis tabani, oteki etiket carpani, dilim]
  "istek-sayisi": [29, 4, 4 * 5, 1], "istek-suresi": [29, 4, 4, 12], "kuyruk-boyu": [29, 4, 4 * 3, 1],
  "islenen-okuma": [20, 2, 4 * 11 * 5, 1], "is-adimi-suresi": [6, 3, 4 * 6, 1], "is-islenen-kayit": [6, 3, 4, 1],
};
export const seri = (ozet) => Object.values(OLCUT).reduce((t, [a, b, c, d]) =>
  t + (ozet ? b : a) * c * (ozet ? 1 : d), 0);       // ozette ornek servise, dilim tumuyle dusurulur

export const GUNLUK_SATIR = { istek: 232 * 0.86 * 86400, hata: 232 * 0.02 * 86400,
  "is-adimi": 232 * 0.12 * 86400 + 540000 };         // gunde satir; gecelik is 540.000 satir
export const SATIR_BAYT = { istek: 180, hata: 512, "is-adimi": 240 };

// basamak: [ad, bas gun, bit gun, cozunurluk sn, ozet mi, tuttugu gunluk satir turleri]
export const BASAMAK = [["ham", 0, 7, 15, false, ["istek", "hata", "is-adimi"]],
  ["seyreltilmis", 7, 90, 300, false, ["hata", "is-adimi"]],
  ["ozet", 90, 395, 3600, true, []]];

// soru: [kimlik, ufuk gun, gereken cozunurluk sn, gereken etiketler, gereken satir turu]
export const SORU = [["S1", 1, 300, ["servis"], null], ["S2", 1, 15, ["dilim"], null],
  ["S3", 1, 3600, ["ortam", "sonuc"], null], ["S4", 30, 3600, ["surum"], null],
  ["S5", 7, null, [], "is-adimi"], ["S6", 7, null, [], "is-adimi"],
  ["S7", 365, 3600, ["bolge", "sonuc"], null], ["S8", 7, 300, ["ornek"], null],
  ["S9", 7, 300, ["ornek"], "is-adimi"], ["S10", 1, null, [], "hata"],
  ["S11", 1, 300, ["kuyruk"], null], ["S12", 1, null, [], "izleme"]];

export const DUSEN = ["ornek", "dilim"];             // ozet basamaginda dusurulen etiketler
export const uygun = (b, s, yasSay = true) => {      // basamak soruyu yanitliyor mu
  const [, bas, bit, coz, ozet, turler] = b, [, ufuk, gerCoz, gerEt, gerTur] = s;
  if (yasSay && !(bas <= ufuk && ufuk <= bit)) return false;
  if (gerCoz !== null && coz > gerCoz) return false;
  if (ozet && gerEt.some((e) => DUSEN.includes(e))) return false;
  return gerTur === null || turler.includes(gerTur);
};
export const gb = (b) => (b / 1024 ** 3).toFixed(2);
```

Bir basamağı tanımlayan dört ölçüt vardır ve dördü de bir soruyu kapatabilir: **yaş aralığı**
(sorunun ufkunu kapsıyor mu), **çözünürlük** (üçüncü dersteki sorgu penceresi ölçümü), **düşürülen
etiket** (ikinci dersteki etiket merdiveni) ve **tutulan satır türü** (dördüncü dersteki katman
kaybı). Basamak tasarımı bu dört kaleme aynı anda karar vermektir.

## Basamak Basamak Bayt ve Soru

```js
// maliyet.mjs — basamak basamak bayt, yanitlanan soru ve soru basina maliyet.
import { OLCUT, seri, GUNLUK_SATIR, SATIR_BAYT, BASAMAK, SORU, DUSEN, uygun, gb } from "./basamak.mjs";

const olcutBayt = (b) => {
  const [, bas, bit, coz, ozet] = b;
  return seri(ozet) * Math.floor(86400 / coz) * (bit - bas) * 16 + seri(ozet) * 120;
};
const gunlukBayt = (b) => (b[2] - b[1]) * b[5].reduce((t, tur) => t + GUNLUK_SATIR[tur] * SATIR_BAYT[tur], 0);

console.log(`olcut serisi: ham/seyreltilmis ${seri(false).toLocaleString("tr-TR")},` +
  ` ozet ${seri(true).toLocaleString("tr-TR")} (dusurulen etiket: ${DUSEN.join(", ")})`);
console.log("\nbasamak       gun      cozunurluk  olcut GB  gunluk GB  toplam GB  yas araliginda  ayrinti duzeyi  GB/soru");
const satirlar = [];
for (const b of BASAMAK) {
  const o = olcutBayt(b), g = gunlukBayt(b), t = o + g;
  const yas = SORU.filter((s) => uygun(b, s)), ayr = SORU.filter((s) => uygun(b, s, false));
  satirlar.push([b, t, yas, ayr]);
  console.log(`${b[0].padEnd(14)}${`${b[1]}-${b[2]}`.padEnd(9)}${`${b[3]} sn`.padStart(10)}` +
    `${gb(o).padStart(10)}${gb(g).padStart(11)}${gb(t).padStart(11)}${`${yas.length}/12`.padStart(16)}` +
    `${`${ayr.length}/12`.padStart(16)}${gb(t / (yas.length || 1)).padStart(9)}`);
}

console.log("\nbirikimli (basamaklar ust uste konunca)");
console.log("basamaklar                toplam GB   yanitlanan   GB/soru   marjinal GB/yeni soru   yeni acilan");
let toplam = 0, once = [];
for (let i = 0; i < satirlar.length; i++) {
  const ekle = satirlar[i][1], ad = BASAMAK.slice(0, i + 1).map((b) => b[0]).join(" + ");
  toplam += ekle;
  const y = [...new Set(satirlar.slice(0, i + 1).flatMap(([, , yas]) => yas))];
  const yeni = y.filter((s) => !once.includes(s));
  console.log(`${ad.padEnd(26)}${gb(toplam).padStart(9)}${`${y.length}/12`.padStart(13)}` +
    `${gb(toplam / y.length).padStart(10)}${(yeni.length ? gb(ekle / yeni.length) : "-").padStart(24)}   ` +
    (yeni.map(([k]) => k).join(" ") || "-"));
  once = y;
}

const ucuz = satirlar[satirlar.length - 1];
const kayip = SORU.filter((s) => !ucuz[3].includes(s) && s[0] !== "S12");
console.log(`\nen ucuz basamak: ${ucuz[0][0]}, ${gb(ucuz[1])} GB, ayrinti duzeyiyle ${ucuz[3].length}/12 soru` +
  `, soru basina ${gb(ucuz[1] / ucuz[3].length)} GB`);
console.log("kaybettigi sorular ve nedeni");
for (const s of kayip) {
  const neden = [ucuz[0][3] > (s[2] ?? Infinity) && `cozunurluk ${ucuz[0][3]} sn`,
    s[3].some((e) => DUSEN.includes(e)) && `${s[3].filter((e) => DUSEN.includes(e)).join("/")} etiketi dusuruldu`,
    s[4] && !ucuz[0][5].includes(s[4]) && `${s[4]} satirlari tutulmuyor`].filter(Boolean);
  console.log(`  ${s[0].padEnd(4)} ${neden.join("; ")}`);
}
```

```
olcut serisi: ham/seyreltilmis 6.888, ozet 668 (dusurulen etiket: ornek, dilim)

basamak       gun      cozunurluk  olcut GB  gunluk GB  toplam GB  yas araliginda  ayrinti duzeyi  GB/soru
ham           0-7           15 sn      4.14      26.18      30.31            9/12           11/12     3.37
seyreltilmis  7-90         300 sn      2.45      70.51      72.96            5/12           10/12    14.59
ozet          90-395      3600 sn      0.07       0.00       0.07            1/12            3/12     0.07

birikimli (basamaklar ust uste konunca)
basamaklar                toplam GB   yanitlanan   GB/soru   marjinal GB/yeni soru   yeni acilan
ham                           30.31         9/12      3.37                    3.37   S1 S2 S3 S5 S6 S8 S9 S10 S11
ham + seyreltilmis           103.28        10/12     10.33                   72.96   S4
ham + seyreltilmis + ozet    103.35        11/12      9.40                    0.07   S7

en ucuz basamak: ozet, 0.07 GB, ayrinti duzeyiyle 3/12 soru, soru basina 0.02 GB
kaybettigi sorular ve nedeni
  S1   cozunurluk 3600 sn
  S2   cozunurluk 3600 sn; dilim etiketi dusuruldu
  S5   is-adimi satirlari tutulmuyor
  S6   is-adimi satirlari tutulmuyor
  S8   cozunurluk 3600 sn; ornek etiketi dusuruldu
  S9   cozunurluk 3600 sn; ornek etiketi dusuruldu; is-adimi satirlari tutulmuyor
  S10  hata satirlari tutulmuyor
  S11  cozunurluk 3600 sn
```

İki sütun ayrı şeyleri ölçer ve ayrımı görmek bu tablonun anahtarıdır. **Yaş aralığında**
sütunu, o basamağın kapsadığı yaş penceresine ufku düşen soruları sayar; **ayrıntı düzeyi**
sütunu, yaş hiç gözetilmeseydi o basamağın ayrıntısıyla kaç sorunun yanıtlanabileceğini. Ham
basamak ayrıntı düzeyiyle on bir soruyu taşır ama yalnız dokuzunu yanıtlar, çünkü sürüm
karşılaştırması ile mevsimsel bölge karşılaştırmasının ufku yedi günün dışındadır. Ayrıntıyı
tutmak yetmez; ayrıntının yeterince eski veriyle birlikte durması gerekir.

Bayt dağılımı da beklenenden farklıdır. Ham basamağın 30,31 gigabaytının 26,18'i günlüktür, ölçüt
yalnız 4,14. Seyreltilmiş basamakta istek satırları atılmasına rağmen günlük hâlâ 70,51 gigabayt
tutar — çünkü seksen üç günlük bir pencerede hata ve iş adımı satırları da birikir. Özet basamak
her iki tarafta da neredeyse bedavadır: üç yüz beş günlük saklama 0,07 gigabayta iner.

## Marjinal Maliyetin Tersine Dönmesi

Birikimli tablo kararı taşıyan sayıyı verir. Ham basamak dokuz soruyu 30,31 gigabayta açar — soru
başına 3,37. Seyreltilmiş basamak eklendiğinde toplam 103,28 gigabayta çıkar ve yanıtlanan soru
dokuzdan **ona** çıkar: yetmiş üç gigabayt, tek bir soru. Marjinal maliyet 72,96 gigabayt/sorudur,
ham basamağın yirmi bir katı.

Özet basamak eklendiğinde toplam 103,35 gigabayt olur ve yanıtlanan soru on birdir. Marjinal
maliyet **0,07 gigabayt/sorudur** — seyreltilmiş basamağın bin katı ucuz. Aradaki oran bu dersin
en keskin sayısıdır: iki basamak da tam olarak bir soru açar ve biri ötekinden bin kat pahalıdır.

Farkın nedeni basamağın uzunluğu değil, **ne tuttuğudur**. Seyreltilmiş basamak seksen üç gün
boyunca günlük satırı ve tam etiketli seriyi tutar; açtığı tek soru ise yalnız `surum` etiketiyle
saatlik çözünürlük ister. Yani otuz günlük sürüm karşılaştırması için tutulan verinin neredeyse
tamamı o soru tarafından kullanılmaz. Aynı soru, özet basamağın ayrıntı düzeyiyle de
yanıtlanabilirdi.

Bu, basamak tasarımının asıl kararını gösterir: seyreltilmiş basamağın çözünürlüğünü ve satır
seçimini soruların gerektirdiği en düşük düzeye indirmek, tek bir sorunun bedelini yetmiş üç
gigabayttan gigabayt mertebesine düşürür. Basamağın süresini kısaltmak ise S4'ü tümüyle kapatır ve
hiçbir şey kazandırmaz.

## En Ucuz Basamağın Kaybettiği Sorular

Özet basamak ayrıntı düzeyiyle üç soruyu 0,07 gigabayta yanıtlar — soru başına 0,02 gigabayt, bütün
hattın en ucuz sayısı. Yalnız bu sayıya bakan bir karar her şeyi özete indirirdi. Kaybedilenler
listede adıyla durur ve her birinin nedeni ayrı bir tasarım kalemidir.

Çözünürlük 3600 saniyeye çıktığı için **S1** (hangi servis yavaşladı), **S11** (iş emri kuyruğu
neden birikti) ve kısmen **S8** düşer; üçüncü derste ölçülmüştü, bir saatlik pencerede doksan
saniyelik bir bozulma ne ortalamada ne yüzdelikte görünür. `dilim` etiketi düşürüldüğü için **S2**
düşer: dağılım kovası olmadan üst dilim hesaplanamaz. `ornek` etiketi servise toplandığı için
**S8** ve **S9** düşer — hangi örneğin yeniden başladığı ve hangi koşumun yavaş olduğu artık
sorulamaz. Günlük satırları hiç tutulmadığı için **S5**, **S6** ve **S10** düşer.

Sekiz sorunun sekizi de sessizce kapanır. Özet basamakta bu sorgular hata vermez; boş sonuç ya da
tek bir toplam değer döner. Beşinci dersteki kırpma bulgusuyla aynı biçimdir: kaybın işareti,
kaybın kendisiyle birlikte kaybolur.

## Basamak Düzenleri Yan Yana

Basamakların tek tek bedeli bilindiğine göre düzenin kendisi karşılaştırılabilir: aynı on iki
soruluk küme hangi düzende kaç gigabayta yanıtlanıyor?

```js
// politika.mjs — basamak duzenleri karsilastirilir: ayni soru kumesi kac gigabayta yanitlaniyor.
import { seri, GUNLUK_SATIR, SATIR_BAYT, BASAMAK, SORU, uygun, gb } from "./basamak.mjs";

const bicim = (ad, bas, bit) => {                    // bir basamagi baska yas araligina tasi
  const b = BASAMAK.find((x) => x[0] === ad);
  return [ad, bas, bit, b[3], b[4], b[5]];
};
const bayt = (b) => seri(b[4]) * Math.floor(86400 / b[3]) * (b[2] - b[1]) * 16 + seri(b[4]) * 120 +
  (b[2] - b[1]) * b[5].reduce((t, tur) => t + GUNLUK_SATIR[tur] * SATIR_BAYT[tur], 0);

const POLITIKA = [
  ["yalniz ham, 7 gun", [bicim("ham", 0, 7)]],
  ["yalniz ham, 30 gun", [bicim("ham", 0, 30)]],
  ["yalniz ham, 395 gun", [bicim("ham", 0, 395)]],
  ["uc basamak 7 / 90 / 395", [bicim("ham", 0, 7), bicim("seyreltilmis", 7, 90), bicim("ozet", 90, 395)]],
  ["ham 7 + ozet 395 (orta yok)", [bicim("ham", 0, 7), bicim("ozet", 7, 395)]],
  ["ham 30 + ozet 395", [bicim("ham", 0, 30), bicim("ozet", 30, 395)]],
];
console.log("politika                       toplam GB   yanitlanan   GB/soru   yanitsiz kalan");
const olc = POLITIKA.map(([ad, bs]) => {
  const t = bs.reduce((s, b) => s + bayt(b), 0);
  const y = SORU.filter((s) => bs.some((b) => uygun(b, s)));
  console.log(`${ad.padEnd(31)}${gb(t).padStart(9)}${`${y.length}/12`.padStart(13)}${gb(t / y.length).padStart(10)}   ` +
    SORU.filter((s) => !y.includes(s)).map(([k]) => k).join(" "));
  return [ad, t, y.length];
});
const [, ucT, ucY] = olc[3], [, ortasiz, ortasizY] = olc[4];
console.log(`\norta basamagin katkisi: ${gb(ucT - ortasiz)} GB fazla, ${ucY - ortasizY} yeni soru`);
console.log(`her seyi ham tutmanin bedeli: ${gb(olc[2][1] - ortasiz)} GB fazla,` +
  ` ${olc[2][2] - ortasizY} yeni soru`);
```

```
politika                       toplam GB   yanitlanan   GB/soru   yanitsiz kalan
yalniz ham, 7 gun                  30.31         9/12      3.37   S4 S7 S12
yalniz ham, 30 gun                129.92        10/12     12.99   S7 S12
yalniz ham, 395 gun              1710.56        11/12    155.51   S12
uc basamak 7 / 90 / 395           103.35        11/12      9.40   S12
ham 7 + ozet 395 (orta yok)        30.41        11/12      2.76   S12
ham 30 + ozet 395                 130.00        11/12     11.82   S12

orta basamagin katkisi: 72.94 GB fazla, 0 yeni soru
her seyi ham tutmanin bedeli: 1680.16 GB fazla, 0 yeni soru
```

Dört düzen aynı on bir soruyu yanıtlar ve aralarında elli altı kat fiyat farkı vardır. En ucuzu
orta basamağı **hiç kurmayan** düzendir: yedi günlük ham, sonrasında doğrudan özet. Toplam 30,41
gigabayt, soru başına 2,76.

Üç basamaklı düzenin orta katmanı 72,94 gigabayt fazla tutar ve **sıfır yeni soru** açar. Nedeni
dördüncü bölümde görülmüştü: seyreltilmiş basamağın tek katkısı S4'tü ve S4, `surum` etiketiyle
saatlik çözünürlük istediği için özet basamağın ayrıntısıyla da yanıtlanır. Orta basamak yalnız
"yedi gün az, doksan gün iyi olur" sezgisiyle kurulmuştur; soru kümesine karşı sayıldığında
karşılığı yoktur.

"Her şeyi ham tut" düzeni aynı on bir soruyu 1710,56 gigabayta yanıtlar — 1680 gigabayt fazla,
sıfır yeni soru. Soru başına maliyeti 155,51 gigabayttır, en ucuz düzenin elli altı katı. Bu iki
satır bu kursun kuralını sayıya bağlar: hiçbir soruyu yanıtlamayan veri, ne kadar özenle
toplanırsa toplansın, maliyettir.

## Özet

- Bir basamağı dört kalem tanımlar ve dördü de soru kapatabilir: yaş aralığı, çözünürlük,
  düşürülen etiket ve tutulan satır türü.
- Ham basamak ayrıntı düzeyiyle 11/12 soruyu taşır ama yaş aralığı yüzünden 9/12'sini yanıtlar;
  ayrıntıyı tutmak yetmez, yeterince eski veriyle birlikte durması gerekir.
- Bayt günlük tarafında toplanır: ham basamağın 30,31 GB'ının 26,18'i günlük, 4,14'ü ölçüt;
  seyreltilmiş basamakta istek satırları atılmasına rağmen günlük 70,51 GB tutar.
- Marjinal maliyet tersine döner: seyreltilmiş basamak bir soruyu (S4) 72,96 GB'a açar, özet
  basamak bir soruyu (S7) 0,07 GB'a — bin kat fark, ikisi de tam bir soru.
- En ucuz basamak (özet) 3/12 soruyu 0,02 GB/soruya yanıtlar ve sekiz soruyu adıyla, sessizce
  kaybeder: çözünürlükten S1, S11; `dilim` etiketinden S2; `ornek` etiketinden S8, S9; günlük
  satırlarından S5, S6, S10. Sorgular hata vermez, boş ya da tek toplam değer döner.
- Düzen karşılaştırmasında dört farklı düzen aynı 11/12'yi yanıtlar: en ucuzu orta basamağı hiç
  kurmayandır (30,41 GB, 2,76 GB/soru). Orta basamak 72,94 GB fazla tutup sıfır soru açar; "her
  şeyi ham tut" 1680 GB fazla tutup sıfır soru açar.

## Sonraki Adım

Bu konu veriyi uçtan uca ele aldı: nasıl toplandığı, hangi etiketlerle saklandığı, hangi
toplulaştırmayla sorulduğu, günlük hattının hangi katmanında ne kaybettiği, metnin nasıl aranabilir
alana çevrildiği ve yaşlandıkça hangi basamakta ne kadara mal olduğu. On iki sorunun on biri bir
yerde yanıtlanır hâle geldi ve her yanıtın fiyatı bilinir.

Geriye tek bir soru kaldı ve hiçbir basamakta, hiçbir etiket kümesinde, hiçbir günlük satırında
görünmedi: bir faturanın hangi okumadan üretildiği. Bunu sormak, tek bir işlemin okuma
toplayıcıdan doğrulayıcıya, oradan faturalamaya ve iş emrine giden **yolunu** istemektir. Ölçüt
onu taşıyamaz, çünkü işlem kimliğinin kardinalitesi sınırsızdır; günlük satırı taşıyamaz, çünkü
her servis kendi kimliğini üretir ve satırlar birbirine bağlanamaz. Toplanan yüz gigabaytın hiçbir
baytı o yolu göstermez. Sonraki konu bu boşluktan başlar: bir isteğin servisler arasındaki yolunu
görünür kılmak neyi gerektirir ve hangi soruları açar.
