---
title: 'Küme Gözlemlenebilirliği'
source: 'https://academia.sh/tr/kurslar/orkestrasyon/kume-gozlemlenebilirligi'
course: 'Konteyner Orkestrasyonu'
language: tr
updated: '2026-08-17T18:09:08+00:00'
license: 'CC BY-SA 4.0'
---

# Küme Gözlemlenebilirliği

Küme ölçeğinde günlük, ölçüt ve iz toplamanın bedeli sayılır: kaç kaynak, kaynak başına kaç seri, saklama süresiyle çarpıldığında kaç kayıt ve kaç bayt. Etiket kardinalitesi arttığında seri sayısının çarpımsal büyümesi gösterilir; örnekleme ve toplulaştırma uygulandığında kazanılan bayt ile kaybedilen ayrıntı birlikte ölçülür.

Bir önceki dersin bütün sayıları tek bir hattın seksen turluk izinden çıktı ve o izi tutan şey
ölçümdü: tur başına üç kalem, toplam iki yüz kırk okuma. Kümede bir değil onlarca kaynak vardır ve
her birinin denetleyicisi aynı okumayı yapar. Ölçümün kendisi de bir yük olur.

Bu ders ölçütün ne olduğunu tartışmaz — sayaç, ölçer ve dağılım M16/K07'de kuruldu ve burada
yalnız adlarıyla geçer. Ölçülen tek şey **küme ölçeğinde toplama bedelidir**: kaç kaynak, kaynak
başına kaç seri, saklama süresiyle çarpıldığında kaç kayıt ve kaç bayt. Devredilen karar da
buradan çıkar: **hangi sorunun sonradan yanıtlanabilir kalacağına** toplama anında karar verilir ve
bu karar geri alınamaz, çünkü toplanmayan ayrıntı hiçbir yerde durmaz.

Ölçüm yine **bölgesel ölçüm ağı** üzerindedir ve **kurgudur**; gerçek küme koşturulmaz, sayılan şey
`node` ile kurulmuş bir **modeldir**.

**OI49.** Küme envanteri kurgudur: beş uygulamaya ait 34 kapsül ve 9 düğüm.
**OI50.** Ölçüt türleri M16/K07'de kuruldu; burada yalnız adıyla anılır.
**OI51.** Bir kayıt 16 bayttır (zaman damgası 8, değer 8), bir seri künyesi 120 bayttır; örnekleme
aralığı 15 saniye, saklama süresi 30 gündür.
**OI52.** Seri sayısı, kaynak sayısı ile ölçüt başına etiket kardinalitelerinin çarpımının
toplamıdır.
**OI53.** Gecikme sinyali kendi üretecimizle üretilir, tohum `20260801`; on iki ani **önceden
yazılıdır**.
**OI54.** On iki işletim sorusu ve her birinin gerektirdiği etiket önceden yazılıdır.

## Küme Ölçeğinde Seri Aritmetiği

```js
// kume.mjs — kume envanteri, olcut tanimlari ve seri / kayit / bayt aritmetigi.
export const KAYNAK = { kapsul: 34, dugum: 9 };      // bes uygulama, 34 kapsul, 9 dugum
export const ORNEKLEME_SN = 15, SAKLAMA_GUN = 30;
export const KAYIT_BAYT = 16, SERI_BAYT = 120;       // zaman damgasi 8 + deger 8; seri kunyesi 120

export const OLCUT = {                               // ad: [tur, { etiket: kardinalite }]
  kapsul: [
    ["istek-sayisi", "sayac", { yol: 12, yontem: 3, sonuc: 4 }],
    ["istek-suresi", "dagilim", { yol: 12, kova: 12 }],
    ["kuyruk-boyu", "olcer", {}],
    ["islenen-okuma", "sayac", { hat: 4 }],
    ["bellek-kullanimi", "olcer", {}],
  ],
  dugum: [
    ["dugum-cpu", "olcer", { cekirdek: 8 }],
    ["dugum-bellek", "olcer", {}],
    ["disk-io", "sayac", { aygit: 3, yon: 2 }],
  ],
};

export const seriSayisi = (olcut, kaynak = KAYNAK) => Object.entries(olcut).reduce((t, [tur, liste]) =>
  t + kaynak[tur] * liste.reduce((s, [, , e]) =>
    s + Object.values(e).reduce((c, k) => c * k, 1), 0), 0);
export const etiketDusur = (olcut, ad) => Object.fromEntries(Object.entries(olcut).map(([t, l]) =>
  [t, l.map(([a, tur, e]) => [a, tur, Object.fromEntries(Object.entries(e).filter(([k]) => k !== ad))])]));

export const kayit = (seri, aralik = ORNEKLEME_SN, gun = SAKLAMA_GUN) =>
  seri * Math.floor(86400 / aralik) * gun;
export const bayt = (seri, aralik = ORNEKLEME_SN, gun = SAKLAMA_GUN) =>
  kayit(seri, aralik, gun) * KAYIT_BAYT + seri * SERI_BAYT;
export const gb = (b) => (b / 1024 ** 3).toFixed(1);

// etiket eklemek: ilgili olcutun seri sayisini carpar
export const etiketEkle = (olcut, hedef, ad, kardinalite) =>
  Object.fromEntries(Object.entries(olcut).map(([t, l]) => [t, l.map(([a, tur, e]) =>
    hedef.includes(a) ? [a, tur, { ...e, [ad]: kardinalite }] : [a, tur, e])]));
```

```js
// olc.mjs — kume olceginde toplama bedeli ve etiket kardinalitesinin carpimsal buyumesi.
import { KAYNAK, OLCUT, ORNEKLEME_SN, SAKLAMA_GUN, seriSayisi, kayit, bayt, gb, etiketEkle } from "./kume.mjs";

const seri = seriSayisi(OLCUT);
const carp = (l) => l.reduce((s, [, , e]) => s + Object.values(e).reduce((c, k) => c * k, 1), 0);
console.log(`kaynak ${KAYNAK.kapsul + KAYNAK.dugum} (kapsul ${KAYNAK.kapsul}, dugum ${KAYNAK.dugum})` +
  `   kapsul basina seri ${carp(OLCUT.kapsul)}   dugum basina seri ${carp(OLCUT.dugum)}   toplam seri ${seri}`);
console.log(`ornekleme ${ORNEKLEME_SN} sn, saklama ${SAKLAMA_GUN} gun` +
  ` -> kayit ${kayit(seri).toLocaleString("tr-TR")}   bayt ${gb(bayt(seri))} GB`);

console.log("\netiket eklendikce (yalniz adi gecen olcutlere)");
console.log("eklenen etiket                     toplam seri   carpan   kayit          GB");
const yaz = (ad, oo) => {
  const s = seriSayisi(oo);
  console.log(`${ad.padEnd(34)} ${String(s).padStart(9)}   ${(s / seri).toFixed(1).padStart(6)}` +
    `   ${kayit(s).toLocaleString("tr-TR").padStart(13)}  ${gb(bayt(s)).padStart(7)}`);
  return oo;
};
let o = yaz("taban", OLCUT);
o = yaz("+ bolge (7) istek olcutlerine", etiketEkle(o, ["istek-sayisi", "istek-suresi"], "bolge", 7));
o = yaz("+ sayac-tipi (23) islenen-okumaya", etiketEkle(o, ["islenen-okuma"], "sayac-tipi", 23));
o = yaz("+ surum (4) butun kapsul olcutlerine", etiketEkle(o, OLCUT.kapsul.map(([a]) => a), "surum", 4));
yaz("+ istek-kimligi (5000) sureye", etiketEkle(o, ["istek-suresi"], "istek-kimligi", 5000));

const gun = SAKLAMA_GUN * 86400;                     // uc sinyalin ayni kumede otuz gunluk bedeli
const SINYAL = [["olcut  (15 sn ornekleme)", kayit(seri) * 16],
  ["gunluk (kapsul basina 12 satir/sn, 180 bayt)", KAYNAK.kapsul * 12 * 180 * gun],
  ["iz     (220 istek/sn, 6 aralik, 260 bayt)", 220 * 6 * 260 * gun],
  ["iz     (yuzde bir orneklemeyle)", (220 * 6 * 260 * gun) / 100]];
console.log("\nuc sinyalin otuz gunluk toplama bedeli");
for (const [ad, b] of SINYAL) console.log(`  ${ad.padEnd(44)} ${gb(b).padStart(9)} GB`);
```

```
kaynak 43 (kapsul 34, dugum 9)   kapsul basina seri 294   dugum basina seri 15   toplam seri 10131
ornekleme 15 sn, saklama 30 gun -> kayit 1.750.636.800   bayt 26.1 GB

etiket eklendikce (yalniz adi gecen olcutlere)
eklenen etiket                     toplam seri   carpan   kayit          GB
taban                                  10131      1.0   1.750.636.800     26.1
+ bolge (7) istek olcutlerine          68883      6.8   11.902.982.400    177.4
+ sayac-tipi (23) islenen-okumaya      71875      7.1   12.420.000.000    185.1
+ surum (4) butun kapsul olcutlerine    287095     28.3   49.610.016.000    739.3
+ istek-kimligi (5000) sureye      685590007   67672.5   118.469.953.209.600  1765416.5

uc sinyalin otuz gunluk toplama bedeli
  olcut  (15 sn ornekleme)                          26.1 GB
  gunluk (kapsul basina 12 satir/sn, 180 bayt)     177.3 GB
  iz     (220 istek/sn, 6 aralik, 260 bayt)        828.5 GB
  iz     (yuzde bir orneklemeyle)                    8.3 GB
```

Kırk üç kaynak, kapsül başına iki yüz doksan dört seri, düğüm başına on beş seri — toplam **on bin
yüz otuz bir seri**. Otuz günlük saklamada bir milyar yedi yüz elli milyon kayıt ve yirmi altı
gigabayt. Bu, hiçbir etiketin eklenmediği taban durumdur ve kaynak sayısı otuz dörtte kaldığı
sürece doğrusal büyür: kapsül sayısı ikiye katlanırsa seri de ikiye katlanır.

Etiket eklemek doğrusal değildir. **Bölge** etiketinin yedi değeri iki ölçüte eklendiğinde seri on
binden altmış dokuz bine çıkar — kaynak sayısı değişmemiştir, eklenen bilgi yedi ayrı değerdir, ama
sonuç 6,8 katıdır. Nedeni tek satırdadır: bir ölçütün seri sayısı etiketlerinin kardinalitelerinin
**çarpımıdır**. `istek-sayisi` ölçütü zaten on iki yol, üç yöntem ve dört sonuç taşıyordu; yedi
bölge eklenince yüz kırk dört seri bin sekiz yüz seriye çıkar.

Son iki satır sınırı gösterir. Sürüm etiketi bütün kapsül ölçütlerine eklendiğinde toplam yirmi
sekiz katına, yedi yüz otuz dokuz gigabayta çıkar. İstek kimliği — beş bin ayrı değer — tek bir
ölçüte eklendiğinde seri altı yüz seksen beş milyona, saklama bir buçuk petabayt mertebesine çıkar.
Bu satır bir öneri değil, bir **sınır işaretidir**: sınırsız kardinaliteli bir alan etiket olarak
kullanıldığında ölçüt deposu kayıt deposuna dönüşür.

Üç sinyalin karşılaştırması da bedelin nerede yattığını gösterir. Aynı kümede ölçüt yirmi altı,
günlük yüz yetmiş yedi, iz sekiz yüz yirmi sekiz gigabayttır. İz en pahalısıdır, çünkü tek tek
isteği taşır; yüzde bir örneklemeyle sekiz gigabayta iner ve o an her yüz istekten doksan
dokuzunun yolu kaybolur.

## Örnekleme ve Toplulaştırma

```js
// orneklem.mjs — ornekleme ve toplulastirmada kaybedilen ayrinti ile kazanilan bayt birlikte sayilir.
import { KAYNAK, OLCUT, seriSayisi, etiketDusur, bayt, gb } from "./kume.mjs";

const uretec = (t) => () => (t = (t * 1103515245 + 12345) % 2147483648) / 2147483648;
const rast = uretec(20260801);                       // tohum gorunur
const ANI = [180, 420, 655, 900, 1210, 1480, 1755, 2010, 2290, 2640, 2980, 3310];
const sn = Array.from({ length: 3600 }, (_, i) => 118 + Math.round(rast() * 8) +
  (ANI.some((a) => i >= a && i < a + 20) ? 780 : 0));

console.log(`bir saatlik gecikme sinyali: 3600 saniye, ${ANI.length} ani (her biri 20 sn, +780 ms)`);
console.log("aralik   ornek   yakalanan ani   gorulen tepe   seri basina kayit/gun   toplam GB");
const seri = seriSayisi(OLCUT);
for (const k of [1, 15, 60, 300]) {
  const idx = [...sn.keys()].filter((i) => i % k === 0);
  const yakalanan = ANI.filter((a) => idx.some((i) => i >= a && i < a + 20 && sn[i] > 500)).length;
  const tepe = Math.max(...idx.map((i) => sn[i]));
  console.log(`${String(k).padStart(4)} sn ${String(idx.length).padStart(7)}` +
    `${String(`${yakalanan}/${ANI.length}`).padStart(14)}${String(`${tepe} ms`).padStart(15)}` +
    `${String(Math.floor(86400 / k)).padStart(24)}${gb(bayt(seri, k)).padStart(12)}`);
}

const SORU = [["hangi yol yavasladi", ["yol"]], ["hangi yontem hata veriyor", ["yontem"]],
  ["hangi sonuc kodu artti", ["sonuc"]], ["gecikmenin ust dilimi", ["kova"]],
  ["hangi hat geride kaldi", ["hat"]], ["hangi kapsul bellek tuketiyor", ["kaynak"]],
  ["hangi cekirdek doldu", ["cekirdek"]], ["toplam istek sayisi", []],
  ["hangi uygulama yavas", []], ["hangi kapsul yeniden basladi", ["kaynak"]],
  ["hangi yolda hangi sonuc", ["yol", "sonuc"]], ["disk yonu okuma mi yazma mi", ["yon"]]];

console.log("\ntoplulastirma            seri   GB   yanitlanan soru   kaybedilen ayrinti");
const duzey = [["yok", [], KAYNAK], ["kova dusuruldu", ["kova"], KAYNAK],
  ["+ yol dusuruldu", ["kova", "yol"], KAYNAK],
  ["+ kapsul uygulamaya toplandi", ["kova", "yol", "kaynak"], { kapsul: 5, dugum: 9 }]];
for (const [ad, dusen, kaynak] of duzey) {
  const o = dusen.filter((d) => d !== "kaynak").reduce((x, d) => etiketDusur(x, d), OLCUT);
  const s = seriSayisi(o, kaynak);
  const yanit = SORU.filter((q) => q[1].every((e) => !dusen.includes(e))).length;
  console.log(`${ad.padEnd(30)} ${String(s).padStart(5)} ${gb(bayt(s)).padStart(5)}` +
    `${String(`${yanit}/${SORU.length}`).padStart(15)}   ${dusen.length ? dusen.join(", ") : "-"}`);
}
```

```
bir saatlik gecikme sinyali: 3600 saniye, 12 ani (her biri 20 sn, +780 ms)
aralik   ornek   yakalanan ani   gorulen tepe   seri basina kayit/gun   toplam GB
   1 sn    3600         12/12         906 ms                   86400       391.3
  15 sn     240         12/12         905 ms                    5760        26.1
  60 sn      60          5/12         903 ms                    1440         6.5
 300 sn      12          1/12         903 ms                     288         1.3

toplulastirma            seri   GB   yanitlanan soru   kaybedilen ayrinti
yok                            10131  26.1          12/12   -
kova dusuruldu                  5643  14.5          11/12   kova
+ yol dusuruldu                  781   2.0           9/12   kova, yol
+ kapsul uygulamaya toplandi     230   0.6           7/12   kova, yol, kaynak
```

Örnekleme tablosu iki sütunu yan yana koyar. On beş saniyelik aralık, saniyelik toplamanın on
beşte biri kadar bayt tutar — üç yüz doksan bir gigabayt yerine yirmi altı — ve **on iki aninin
on ikisini de yakalar**, çünkü ani yirmi saniye sürüyor ve on beş saniyelik ızgara her yirmi
saniyelik pencereye en az bir kez düşüyor. Buraya kadar örnekleme bedava görünür.

Altmış saniyeye çıkıldığında bayt dörtte birine, altı buçuk gigabayta iner ve yakalanan ani on
ikiden **beşe** düşer. Üç yüz saniyede bayt bir virgül üç gigabayttır ve on iki aniden yalnız biri
görünür. Kaybın nereden geldiği açıktır: örnekleme aralığı olayın süresini geçtiği anda olayın
görünürlüğü rastlantıya kalır. Görülen tepe değeri üç aralıkta da dokuz yüz milisaniye
civarındadır — yani **yakalanan ani ölçüldüğünde doğru ölçülür**, kaybolan şey büyüklük değil,
anilerin kaçının hiç görünmediğidir. Ölçütün ortalaması hâlâ doğrudur ve hâlâ yanıltıcıdır.

Toplulaştırma tablosu aynı ikiliği etiket tarafında kurar. Dağılım kovası düşürüldüğünde seri on
binden beş bin altı yüz kırk üçe iner, on iki sorunun on biri yanıtlanabilir kalır — kaybedilen tek
soru gecikmenin üst dilimidir. Yol etiketi de düşürüldüğünde seri yedi yüz seksen bire, bayt iki
gigabayta iner ve iki soru daha kapanır. Kapsüller uygulamaya toplandığında seri iki yüz otuza, bayt
altı yüz megabayta iner; artık hangi kapsülün belleği tükettiği ya da hangisinin yeniden başladığı
sorulamaz.

Üç adımın getirisi eşit değildir. İlk adım 11,6 gigabayt kazandırır ve bir soruya mal olur; ikinci
adım 12,5 gigabayt kazandırır ve iki soruya; üçüncü adım yalnız 1,4 gigabayt kazandırır ve yine iki
soruya. Soru başına kazanç 11,6'dan 6,3'e, oradan 0,7 gigabayta iner. Ucuz olan, **çarpımın büyük
çarpanını** düşürmektir — on iki kovalı dağılım ve on iki yollu ayrım. O iki çarpan gittikten sonra
kalan seriler zaten azdır ve her ek toplulaştırma neredeyse bedava bayt karşılığında soru kapatır.

## Devrin Bilançosu

| Ölçü | Değer |
|---|---|
| kaynak | 43 (34 kapsül, 9 düğüm) |
| kapsül / düğüm başına seri | 294 / 15 |
| toplam seri, kayıt, bayt (15 sn, 30 gün) | 10.131 / 1,75 milyar / 26,1 GB |
| bir etiket (7 değer) iki ölçüte eklenince | seri 6,8 kat, bayt 177,4 GB |
| sınırsız kardinaliteli etiket (5000 değer) | seri 67.672 kat |
| ölçüt / günlük / iz (30 gün) | 26,1 / 177,3 / 828,5 GB |
| örnekleme 15 → 60 sn | bayt 26,1 → 6,5 GB, yakalanan ani 12/12 → 5/12 |
| toplulaştırma üç adım | bayt 26,1 → 0,6 GB, yanıtlanan soru 12/12 → 7/12 |

Devredilen karar şudur: **hangi sorunun sonradan yanıtlanabileceğine, soru sorulmadan önce karar
verilir.** Gereken bilgi kalemleri de sayılıdır — hangi ölçüt, hangi etiketler, hangi aralık, ne
kadar saklama. Bilginin maliyeti dört sayının çarpımıdır ve çarpımdaki tek bir kalemin değişmesi
sonucu kat kat büyütür.

Sistemin bilmediği şeyin ne yaptığı da tablodadır ve bu kez sessizdir. Altmış saniyelik örnekleme
kurulduğunda hiçbir uyarı çıkmaz; yedi ani hiç görünmediği için **görünmedikleri de görünmez**.
Kapsül etiketi düşürüldüğünde sorgu hata vermez, yalnız uygulama düzeyinde bir sayı döndürür. Bu iki
kayıp, kararın devredildiği andan aylar sonra ve ancak o soru gerçekten sorulduğunda fark edilir;
o an geriye dönüp toplanmamış veriyi almanın yolu yoktur.

## Özet

- 43 kaynak, kapsül başına 294 ve düğüm başına 15 seri; toplam 10.131 seri, 30 günde 1,75 milyar
  kayıt ve 26,1 GB.
- Bir ölçütün seri sayısı etiket kardinalitelerinin çarpımıdır: 7 değerli bir etiket iki ölçüte
  eklenince toplam 6,8 kat, 4 değerli bir etiket bütün kapsül ölçütlerine eklenince 28,3 kat büyür.
- 5000 değerli bir alan etiket yapıldığında seri 67.672 kata çıkar; sınırsız kardinalite ölçüt
  deposunu kayıt deposuna çevirir.
- Aynı kümede 30 günlük bedel ölçütte 26,1, günlükte 177,3, izde 828,5 GB; yüzde bir örnekleme izi
  8,3 GB'a indirir ve her 100 isteğin 99'unun yolunu siler.
- Örnekleme 15'ten 60 saniyeye çıkınca bayt 26,1'den 6,5 GB'a, yakalanan ani 12/12'den 5/12'ye
  iner; üç toplulaştırma adımı baytı 0,6 GB'a indirirken yanıtlanan soruyu 12/12'den 7/12'ye
  düşürür.

## Sonraki Adım

Buraya kadarki bütün ölçümler **tek küme** üzerindeydi: tek bir denetim düzlemi, tek bir kaynak
envanteri, tek bir seri deposu. Bölgesel ölçüm ağının üretimi iki bölgede koşuyor ve her bölgenin
kendi kümesi var — aynı dağıtım paketi, aynı kaynak türü, aynı denetleyici, ayrı denetim düzlemleri.
Bir sonraki ders bu çoğalmanın bedelini sayar: aynı istenen durumun kaç kümeye kaç ayrı yoldan
ulaştığı, kümeler arasındaki sapmanın nasıl ölçüldüğü, ve bir kararın tek kümede değil küme
kümesinde verilmesi gerektiğinde hangi bilgi kaleminin kimden geleceği.
