İçeriğe geç
academia.sh

Ders 05 / 12

Veri Örgüsü ve Veri Ağı

Sahiplik dağıtıldığında değişen iki sayının ölçülmesi: düzen kararı alan taraf sayısı ve uçtan uca bir sorgunun dokunduğu düzen sayısı. Merkezî kurulum 1/1, veri örgüsü 1/5, veri ağı 5/5 veriyor; beş yerel soru artı bir ülke sorusundan oluşan karışımda maliyet 3.120, 2.000 ve 6.280 çıkıyor. Ağın pahalı olmasının nedeni dağıtım değil ölçülmemiş anahtar seçimidir: iki birimin kararı tek başına 2.450 tutuyor. Ders dosya sabitini 60, 120, 240 ve 480 değerlerinde süpürüyor: iki sayı sabitten bağımsız, sıralama değil — örgü ile merkezînin eşitlendiği yer 400, ve budanmayan tek bir soru eklendiğinde dağıtık kurulum dört değerde de kaybediyor.

İçindekiler

Önceki derste altı alt küme çıkarıldı ve her birinin bölüm anahtarını, tazeleme sırasını ve türetme kuralını tek bir taraf belirledi. Bölge birimi kendisi için yazılmış kümeyi yalnızca okudu. Karar orada kalmasaydı ne olurdu: düzen anahtarını bölgenin kendisi seçseydi, yazma takvimini kendisi kursaydı, kendi kümesini bir ürün gibi yayımlasaydı.

Bu soru bir mimari tercih gibi görünür, oysa iki sayıyı değiştirir ve o iki sayı ölçülebilir. Birincisi düzen kararı alan taraf sayısıdır: kaç ayrı yerde “bu satırlar hangi anahtara göre dosyalanacak” sorusu yanıtlanıyor. İkincisi uçtan uca bir sorgunun dokunduğu düzen sayısıdır: bütün bölgeleri kapsayan tek bir soru kaç ayrı bölümleme kararının üstünden geçiyor. Ders bu iki sayıyı üç düzenlemede ölçer, ardından bu kursun her maliyetinin dayandığı dosya sabitini süpürerek hangi sonucun sabite bağlı olduğunu gösterir.

  • DY51. Kaynak, hat ve depolama düzeni kurgudur ve ders içinde tanımlanır. Hiçbir ambar, göl, katalog ürünü, sorgu motoru ya da bulut depolama servisi çağrılmaz. Tohum 20260218.
  • DY52. Veri örgüsü (data fabric), satırların birden çok yerde yazıldığı ama anahtar kararının tek bir standartta kaldığı düzenlemedir. Veri ağı (data mesh), satırları üreten birimin hem yazmaya hem anahtar seçimine sahip olduğu düzenlemedir; her birim kendi veri ürününü yayımlar.
  • DY53. Sorgunun bildiği adres sayısı üçüncü bir sayı olarak ayrıca yazılır. Örgüde tek bir erişim noktası vardır, ağda beş. Bu sayı maliyeti değiştirmez.
  • DY54. Soru karışımı ikidir. A karışımı beş yerel soru (her birim kendi bölgesinin bir dönemi) artı bir ülke sorusu (aynı dönem, bütün bölgeler). B karışımı A’nın üstüne budanmayan bir soru ekler: tek bir abonenin bütün dönemleri.
  • DY55. Sahiplik ve yönetişim yordamı Siber Güvenlik müfredatındaki Yönetişim, Risk ve Uyumluluk kursunda, sahiplik boşluğunun sayısı ise Veri Mühendisliğine Giriş kursundaki Veri Yönetişimi dersinde ölçüldü; burada tekrarlanmaz. Bu ders sahipliği yalnız hangi düzenin kimin elinde olduğu olarak sayar.
  • DY56. Dosya sabiti bir seçimdir ve bu derste süpürülür: 60, 120, 240, 480. Maliyet bir oran değil tam sayıdır; dosya oranı basılacaksa çözünürlük adımı 0,0091’dir.

Kararın Kaç Elde Olduğu

Üç düzenleme aynı 2.200 satırın üstüne kurulur. Merkezîde tek bir depo vardır ve anahtarı donem’dir. Örgüde satırlar beş ayrı yere yazılır, fakat anahtarın ne olacağına tek bir taraf karar verir ve beşi de donem kullanır. Ağda her birim kendi anahtarını seçer: iki birim donem, biri donem+tip, biri hiç bölümleme yapmaz, biri yalnız tip’i seçer. Bu seçimler kötü niyetli değildir; hiçbiri hangi soru için yapıldığını yazmamıştır.

# KURGUDUR. Olcum aginin sayac okumalari, hat ve depolama duzeni ders icinde
# tanimlanir; hicbir ambar, gol, katalog urunu ya da sorgu motoru cagrilmaz.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


def kaynak_uret():
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e, "birim": "m3"})
    return kayit


def a1_ayikla(kayit):
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


def a3_tuketim(kayit):
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti, dusen = [], 0
    for k in kayit:
        i = DONEM.index(k["donem"])
        if i == 0:
            continue
        onceki = tablo.get((k["abone"], DONEM[i - 1]))
        if onceki is None:
            dusen += 1
            continue
        cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"])))
    return cikti, dusen


SUTUN = ("abone", "donem", "bolge", "tip", "endeks", "birim", "m3")
DOSYA_SABIT = 120          # bir dosyaya dokunmanin sabit bedeli , hucre cinsinden


def hattan(kaynak):
    v, _ = a1_ayikla(kaynak)
    v, _ = a2_tekille(v)
    v, _ = a3_tuketim(v)
    return v


def yaz(kayitlar, bolumleme=()):
    duzen = {}
    for k in kayitlar:
        duzen.setdefault(tuple(k[a] for a in bolumleme), []).append(k)
    return duzen


def sorgu(duzen, bolumleme, secilen, suzgec=None, sutunlu=True):
    """Bolumleme anahtarindaki alan dosya budar , obur alan dosyanin tamamini okutur."""
    suzgec = {} if suzgec is None else suzgec
    budayan = {a: v for a, v in suzgec.items() if a in bolumleme}
    kalan = {a: v for a, v in suzgec.items() if a not in bolumleme}
    dosya, hucre, satir = 0, 0, 0
    okunan_sutun = len(secilen) if sutunlu else len(SUTUN)
    for anahtar, kayit in duzen.items():
        if budayan:
            es = dict(zip(bolumleme, anahtar))
            if any(es[a] != v for a, v in budayan.items()):
                continue
        dosya += 1
        hucre += len(kayit) * okunan_sutun
        satir += sum(1 for k in kayit if all(k[a] == v for a, v in kalan.items()))
    return {"dosya": dosya, "hucre": hucre, "eslesen_satir": satir,
            "maliyet": dosya * DOSYA_SABIT + hucre}


TUM = hattan(kaynak_uret())
SEC = ("abone", "m3")
D07 = {"donem": "2026-07"}
AB = {"abone": "A007"}
# Uc duzenleme. Anahtar secimi kimin elinde: merkezde , tek standartta , birimde.
MERKEZI = {"": ("donem",)}
ORGU = {b: ("donem",) for b in BOLGE}            # dagitik yazim , tek anahtar karari
AG = {"dogu": ("donem",), "bati": ("donem", "tip"), "kuzey": (),
      "guney": ("donem",), "merkez": ("tip",)}   # her birim kendi anahtarini secti
SAYIM = {"merkezi": (1, 1, 1), "orgu": (1, 5, 1), "ag": (5, 5, 5)}


def kur(anahtarlar):
    if list(anahtarlar) == [""]:
        return {"": yaz(TUM, anahtarlar[""])}
    return {b: yaz([k for k in TUM if k["bolge"] == b], anahtarlar[b]) for b in anahtarlar}


def olc(anahtarlar, duzenler):
    """Bes yerel soru (her birim kendi bolgesinin donemi) , bir ulke sorusu ,
    bir abone sorusu. Merkezi kurulumda ucu de tek duzene gider."""
    if list(anahtarlar) == [""]:
        d, a = duzenler[""], anahtarlar[""]
        yerel = sum(sorgu(d, a, SEC, dict(D07, bolge=b))["maliyet"] for b in BOLGE)
        return yerel, sorgu(d, a, SEC, D07)["maliyet"], sorgu(d, a, SEC, AB)["maliyet"]
    yerel = sum(sorgu(duzenler[b], anahtarlar[b], SEC, D07)["maliyet"] for b in BOLGE)
    abone = sum(sorgu(duzenler[b], anahtarlar[b], SEC, AB)["maliyet"] for b in BOLGE)
    return yerel, yerel, abone


KURULUM = [("merkezi", MERKEZI), ("orgu", ORGU), ("ag", AG)]
print(f"satir {len(TUM)} , dosya sabiti {DOSYA_SABIT} hucre\n")
print("duzenleme  duzen karari  dokunulan duzen  adres  dosya   yerel x5   ulke   abone")
for ad, anah in KURULUM:
    dz = kur(anah)
    y, u, a = olc(anah, dz)
    t, dd, ad_r = SAYIM[ad]
    print(f"{ad:<10} {t:>12}  {dd:>15}  {ad_r:>5}  {sum(len(x) for x in dz.values()):>5}"
          f"   {y:>8}  {u:>5}  {a:>6}")

print("\nagda birim basina yerel soru:  anahtar / dosya / maliyet")
dz = kur(AG)
for b in BOLGE:
    r = sorgu(dz[b], AG[b], SEC, D07)
    print(f"  {b:<7} {str(AG[b]):<18} {len(dz[b]):>3} dosyanin {r['dosya']:>2} tanesi"
          f" , maliyet {r['maliyet']:>5}")
satir 2200 , dosya sabiti 120 hucre

duzenleme  duzen karari  dokunulan duzen  adres  dosya   yerel x5   ulke   abone
merkezi               1                1      1     11       2600    520    5720
orgu                  1                5      1     55       1000   1000   11000
ag                    5                5      5     47       3140   3140   10040

agda birim basina yerel soru:  anahtar / dosya / maliyet
  dogu    ('donem',)          11 dosyanin  1 tanesi , maliyet   188
  bati    ('donem', 'tip')    22 dosyanin  2 tanesi , maliyet   302
  kuzey   ()                   1 dosyanin  1 tanesi , maliyet  1132
  guney   ('donem',)          11 dosyanin  1 tanesi , maliyet   200
  merkez  ('tip',)             2 dosyanin  2 tanesi , maliyet  1318

İlk üç sütun dersin iki sayısını taşır. Merkezîde karar bir elde ve uçtan uca sorgu tek düzene dokunuyor: 1 ve 1. Örgüde satırlar beş yere dağılmış ama anahtar kararı hâlâ tek elde: 1 ve 5. Ağda ikisi de beş. Adres sütunu üçüncü ayrımı gösterir; örgü beş depoyu tek bir erişim noktasının arkasına koyar, ağ koymaz. Adres sayısının maliyet sütunlarına hiçbir katkısı yoktur: örgü 1.000 ödüyor, çünkü satırlar orada; adresin tek olması okunan hücreyi değiştirmiyor. Bir erişim katmanı maliyeti değil, kimin bilmek zorunda olduğunu azaltır.

Maliyet sütunlarında iki şey birden okunur. Yerel sorularda örgü merkezîden üç kat ucuzdur (1.000’e karşı 2.600), çünkü merkezî düzende bir bölgenin dönemini sormak o dönemin bütün satırlarını okutur ve beş bölge aynı dosyayı beş kez okur. Dağıtık yazımda beş yerel soru ayrık kümelere iner ve toplamları tam olarak ülke sorusunun maliyetine eşit çıkar. Buna karşılık ülke sorusunda merkezî 520, örgü 1.000 öder: aynı 400 hücre okunuyor, fark dosya sabitinin bir kez yerine beş kez ödenmesi. Abone sorusunda uçurum açılıyor, 5.720’ye karşı 11.000, çünkü orada budayan hiçbir anahtar yok ve elli beş dosyanın tamamına dokunuluyor.

Ağın 3.140’ı ise dağıtımın değil, ölçülmemiş anahtar seçiminin sayısıdır. Alt tablo bunu birim birim ayırır: doğu 188, güney 200, batı 302 öderken kuzey 1.132 ve merkez 1.318 ödüyor. İki birimin kararı tek başına 2.450 tutuyor, yani ağın yerel toplamının üçte ikisinden fazlası. Kuzey hiç bölümleme yapmadığı için tek dosyasının tamamını okuyor; merkez tip’i seçtiği için dönem süzgeci hiçbir şey budamıyor. Kursun kuralı burada ikinci kez görünüyor: hangi sorgu için seçildiği yazılmayan düzen ölçülmemiş sayılır, ve ölçülmemiş beş karar ölçülmüş tek karardan pahalıya mal oluyor. Sahipliği dağıtmak bu farkı yaratmıyor; sahipliği ölçüsüz dağıtmak yaratıyor.

Dosya Sabiti Süpürülünce

Bu kursun bütün maliyetleri bir seçime dayanıyor: bir dosyaya dokunmanın bedeli 120 hücre. Sayı kurgudur ve başka türlü olabilirdi. Yukarıdaki bütün karşılaştırmalar o seçime ne kadar borçlu, bunun tek yolu sabiti değiştirip aynı ölçümü tekrarlamaktır.

# Onceki blogun tanimlari surer: kur, olc, KURULUM, SAYIM, TUM, DOSYA_SABIT.
DUZENLEMELER = {ad: (anah, kur(anah)) for ad, anah in KURULUM}
AD = ("merkezi", "orgu", "ag")


def karisim():
    """A: bes yerel soru + bir ulke sorusu. B: A , ustune bir abone sorusu."""
    c = {}
    for ad, (anah, dz) in DUZENLEMELER.items():
        y, u, a = olc(anah, dz)
        c[ad] = (y + u, y + u + a)
    return c


print("sabit    merkezi-A    orgu-A      ag-A    merkezi-B    orgu-B      ag-B")
for sabit in (60, 120, 240, 480):
    DOSYA_SABIT = sabit
    c = karisim()
    print(f"{sabit:>5}  " + "  ".join(f"{c[a][0]:>9}" for a in AD)
          + "  " + "  ".join(f"{c[a][1]:>9}" for a in AD))

# Maliyet sabitte dogrusaldir: maliyet(sabit) = hucre + sabit x dokunulan dosya.
DOSYA_SABIT = 0
hucre = karisim()
DOSYA_SABIT = 1
egim = {a: tuple(karisim()[a][i] - hucre[a][i] for i in (0, 1)) for a in AD}
DOSYA_SABIT = 120
print("\nkurulum        A karisimi              B karisimi")
for a in AD:
    print(f"{a:<9}  {hucre[a][0]:>7} + sabit x {egim[a][0]:>3}"
          f"      {hucre[a][1]:>7} + sabit x {egim[a][1]:>3}")
esik = (hucre["merkezi"][0] - hucre["orgu"][0]) // (egim["orgu"][0] - egim["merkezi"][0])
print(f"\nA karisiminda orgu ile merkezinin esitlendigi sabit: {esik}")
print("sabitten bagimsiz olan: duzen karari alan taraf / dokunulan duzen , "
      + " , ".join(f"{a} {SAYIM[a][0]}/{SAYIM[a][1]}" for a in AD))
sabit    merkezi-A    orgu-A      ag-A    merkezi-B    orgu-B      ag-B
   60       2760       1400       5440       7820       9100      12660
  120       3120       2000       6280       8840      13000      16320
  240       3840       3200       7960      10880      20800      23640
  480       5280       5600      11320      14960      36400      38280

kurulum        A karisimi              B karisimi
merkezi       2400 + sabit x   6         6800 + sabit x  17
orgu           800 + sabit x  10         5200 + sabit x  65
ag            4600 + sabit x  14         9000 + sabit x  61

A karisiminda orgu ile merkezinin esitlendigi sabit: 400
sabitten bagimsiz olan: duzen karari alan taraf / dokunulan duzen , merkezi 1/1 , orgu 1/5 , ag 5/5

Süpürme üç ayrı türde sonuç veriyor. Birincisi sabitten bağımsız olanlardır: düzen kararı alan taraf ve dokunulan düzen sayıları dört değerde de 1/1, 1/5 ve 5/5 kalıyor. Bu dersin iki ana sayısı bir maliyet modelinin değil, bir örgütlenme kararının sayısıdır ve dosya sabiti onlara dokunmaz. Aynı biçimde ağın örgüden pahalı olması da dört değerde sürüyor; ölçülmemiş anahtar seçiminin bedeli sabitten bağımsızdır.

İkincisi sabite bağlı olan sıralamadır ve bu dersin en önemli uyarısıdır. A karışımında örgü 60, 120 ve 240’ta merkezîden ucuzdur, 480’de değildir. Doğrusal biçim nedenini veriyor: örgü 800 hücreye karşılık her dosya için 10, merkezî 2.400 hücreye karşılık 6 ödüyor. Örgünün hücre avantajı sabit, dosya dezavantajı sabitle çarpılıyor; ikisi tam olarak 400’de eşitleniyor. Sabitin 120 seçilmiş olması “dağıtık yazım yerel soruları ucuzlatır” cümlesini doğru yapıyor; 480 seçilseydi aynı cümle yanlış olurdu. Bir düzen karşılaştırması, dayandığı sabit yazılmadan aktarılamaz.

Üçüncüsü soru karışımına bağlı olan sonuçtur ve sabitin süpürülmesi onu ortadan kaldırmıyor. B karışımı A’nın üstüne budanmayan tek bir soru ekliyor ve sıralama dört değerde de tersine dönüyor: merkezî 7.820, örgü 9.100 ile başlıyor, 480’de fark 14.960’a karşı 36.400 oluyor. Eğim sütunu bunu açıklıyor: B’de örgünün dosya katsayısı 65, merkezînin 17. Budayan bir anahtarın olmadığı tek bir soru, dağıtık yazımın dosya sayısını doğrudan maliyete çeviriyor. Dağıtmak da bozar; bozduğu yer, hiçbir anahtarın yardım etmediği sorulardır.

Özet

  • Sahipliğin dağıtılması iki sayıyı değiştirir: düzen kararı alan taraf sayısı ve uçtan uca bir sorgunun dokunduğu düzen sayısı. Merkezî 1/1, veri örgüsü 1/5, veri ağı 5/5 verir.
  • Örgü ile ağın ayrımı yazmanın dağıtılması değil, anahtar kararının dağıtılmasıdır; sorgunun bildiği adres sayısı üçüncü bir sayıdır ve maliyeti hiç değiştirmez.
  • Ağın yerel toplamı 3.140, örgününki 1.000; farkın kaynağı dağıtım değil ölçülmemiş anahtar seçimidir, iki birimin kararı tek başına 2.450 tutar.
  • Dosya sabiti süpürüldüğünde iki ana sayı ve ağın örgüden pahalı olması dört değerde de değişmez; değişen şey örgü ile merkezînin sıralamasıdır, eşitlik noktası 400’dür.
  • Maliyet sabitte doğrusaldır (hücre + sabit x dosya), bu yüzden bir karşılaştırma dayandığı sabit yazılmadan aktarılamaz.
  • Budanmayan tek bir soru eklendiğinde dağıtık kurulum dört sabit değerinde de kaybeder: B karışımında merkezî 8.840, örgü 13.000, ağ 16.320 öder.

Sonraki Adım

Bu derste beş depo, kırk yedi dosya ve beş ayrı anahtar kararı sayıldı. Ölçülen her maliyet, sorunun hangi depoya gideceğinin zaten bilindiği varsayımına dayanıyordu. Ağ düzenlemesinde beş adres vardı ve sorgu hepsini biliyordu; oysa bir bölge biriminin ürününün adı, taşıdığı sütunlar, bölüm anahtarı ve hangi dönemleri kapsadığı bir yerde yazılı olmadıkça bulunmaz. Sonraki ders bunu tek bir sayıya çevirir: bir veri varlığını bulmak için kaç girişe bakılıyor, katalog varken ve yokken. Aynı derste kataloğun kendi kusuru ölçülür — kaç giriş artık var olmayan bir düzeni gösteriyor — ve altı dersin ardından bu konu kapanır.

İ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