Ders 11 / 21
Denetim Günlükleri
Bir olay kümesi denetim kaydına düşürülür ve kaç sorunun yanıtlandığı sayılır: 480 olayın 273'ü dört soruyu birden yanıtlıyor, varsayılan yapılandırmada 88'i. Sekiz soruşturmanın 3'ü yanıtlanıyor. Kaydı 11 özne silebiliyor; ayrı hesaba taşımak 6 meşru işi durduruyor ve veri düzlemi kaydı yönetim düzleminin 772 katına mal oluyor.
İçindekiler
Önceki üç derste aynı cümle defalarca geçti: “hepsi denetim kaydında”. Anahtar kullanımı kayda düşüyordu, sır okumaları kayda düşüyordu, politika değişiklikleri kayda düşüyordu. O cümle şimdiye kadar hiç sınanmadı. Bu ders onu sınar ve ölçüyü tek bir biçime indirir: bir olay kümesi denetim kaydına düşürülür ve kaç soru yanıtlanabiliyor sayılır. Sorular dörttür — kim, ne zaman, hangi kaynak, hangi kimlikten.
Kaydın kapsamadığı bir işlem türü var ve adı yazılmalıdır: veri düzlemi okumaları ve yazmaları. Yönetim düzlemi çağrıları (politika değişikliği, anahtar kullanımı, kaynak oluşturma) varsayılan olarak kaydedilir; nesne okuma, nesne yazma ve kuyruk tüketimi kaydedilmez. Bu kayıt ayrı açılır ve ayrıca ücretlendirilir. İkinci konu kaydın kendisidir: bir denetim günlüğü de bir yüzeydir — kim silebiliyor, nereye yazılıyor, değiştirilemezliği nasıl sağlanıyor.
Ölçüm bölgesel ölçüm ağı üzerindedir, kurgudur ve node ile yazılmış bir modeldir.
Para birimi de kurgudur: “b” birimi uydurmadır, gerçek bir fiyat değildir.
BG19. Olay örneklemi 480 işlemdir; günlük hacim yönetim düzleminde 2.400, veri düzleminde 1.860.000 olaydır (kurgu). BG20. Yönetim düzlemi kaydı varsayılan olarak açıktır; veri düzlemi kaydı ayrı açılır ve ayrıca ücretlendirilir. BG21. Olayın kimliği dört türdendir: kullanıcı, rol üstlenmiş kullanıcı, iş yükü kimliği, otomatik servis. Rol üstlenmede tekil özne ancak oturum etiketi varsa okunur. BG22. Toplu işlemler kaynağı tek tek adlandırmaz; kaynak alanı kapsayıcı adıyla dolar ve “hangi kaynak” sorusu yanıtsız kalır. BG23. Kaydın yazıldığı hedef için silebilen, değiştirebilen ve okuyan özne sayıları ile değiştirilemezlik kilidi modelde yazılıdır. BG24. Maliyet kurgu birimle hesaplanır: bin olay alımı 0,4 b, GB-ay saklama 12 b, olay boyutu 1,4 KB. Örneklemli kayıt tekil kaynak sorularını yanıtlamaz. Üreteç kendi yazılmıştır; tohum 20260722’dir.
Kaç Soru Yanıtlanabiliyor
// olay.mjs — denetim kaydina dusen olaylar ve yanitlanabilen sorular. MODELDIR. // Bolgesel olcum agi KURGUDUR. Uretec kendi yazilmistir; tohum asagida gorunur. export const TOHUM = 20260722; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; export const YONETIM = ["politika-degisikligi", "anahtar-kullanma", "rol-ustlenme", "ag-kurali-degisikligi", "sir-okuma", "kaynak-olusturma"]; export const VERI = ["nesne-okuma", "nesne-yazma", "nesne-silme", "kuyruk-tuketimi"]; export const GUNLUK = { yonetim: 2400, veri: 1860000 }; // gunluk olay hacmi (kurgu) const r = uretec(TOHUM); export const OLAY = Array.from({ length: 480 }, () => { const veriMi = r() < 0.72; const islem = veriMi ? VERI[Math.floor(r() * VERI.length)] : YONETIM[Math.floor(r() * YONETIM.length)]; const u = r(); const kimlik = u < 0.18 ? "kullanici" : u < 0.52 ? "rol-ustlenme" : u < 0.86 ? "is-yuku" : "otomatik-servis"; return { duzlem: veriMi ? "veri" : "yonetim", islem, kimlik, etiket: kimlik === "rol-ustlenme" ? r() < 0.38 : true, // oturum etiketi tekil ozneyi verir ayrinti: r() > (veriMi ? 0.34 : 0.12) }; // toplu islem kaynagi adlandirmaz }); // Dort soru: kayitta duran bir olay hangilerini yanitliyor. export const SORU = { "ne zaman": () => true, "hangi kimlikten": () => true, "hangi kaynak": (o) => o.ayrinti, "kim (tekil ozne)": (o) => o.kimlik !== "rol-ustlenme" || o.etiket, }; export const kayitta = (o, veriAcik) => o.duzlem === "yonetim" || veriAcik; // Sorusturma: bir soru bir isleme, bir alana ve geriye bakis suresine baglidir. export const SORUSTURMA = [ ["uretim politika belgesini kim degistirdi", "politika-degisikligi", "kim (tekil ozne)", 12], ["arsivden hangi nesneler okundu", "nesne-okuma", "hangi kaynak", 5], ["musteri anahtarini hangi kimlik kullandi", "anahtar-kullanma", "hangi kimlikten", 40], ["olcum kaydini kim sildi", "nesne-silme", "kim (tekil ozne)", 3], ["ag kurali ne zaman gevsetildi", "ag-kurali-degisikligi", "ne zaman", 210], ["bakim kimligi hangi sirri okudu", "sir-okuma", "hangi kaynak", 60], ["is ortagi jetonunu kim okudu", "sir-okuma", "kim (tekil ozne)", 150], ["yedek hangi kaynaga yazildi", "nesne-yazma", "hangi kaynak", 400], ]; export const yanit = (s, veriAcik, saklama) => { const [, islem, alan, gun] = s; const l = OLAY.filter((o) => o.islem === islem && kayitta(o, veriAcik) && SORU[alan](o)); if (gun > saklama) return ["hayir", `saklama ${saklama} gun < ${gun}`]; if (l.length === 0) { const kapali = OLAY.some((o) => o.islem === islem) && VERI.includes(islem) && !veriAcik; return ["hayir", kapali ? "veri duzlemi kaydi kapali" : `${alan} alani bos`]; } return ["evet", `${l.length} olay`]; }; const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); const yz = gen([20, 12, 14, 18, 12]); if (import.meta.url === `file://${process.argv[1]}`) { const y = OLAY.filter((o) => o.duzlem === "yonetim").length; console.log(`model (tohum ${TOHUM}): ${OLAY.length} olay orneklemi — ${y} yonetim duzlemi, ` + `${OLAY.length - y} veri duzlemi; gunluk hacim ${GUNLUK.yonetim} / ${GUNLUK.veri} (kurgu)`); console.log("\n" + yz(["soru", "varsayilan", "veri de acik", "kayit disi kalan", "oran"])); for (const [ad, f] of Object.entries(SORU)) { const v = OLAY.filter((o) => kayitta(o, false) && f(o)).length; const t = OLAY.filter((o) => kayitta(o, true) && f(o)).length; console.log(yz([ad, v, t, OLAY.length - t, `${Math.round(100 * t / OLAY.length)}%`])); } const dort = (va) => OLAY.filter((o) => kayitta(o, va) && Object.values(SORU).every((f) => f(o))).length; console.log(yz(["dordu birden", dort(false), dort(true), OLAY.length - dort(true), `${Math.round(100 * dort(true) / OLAY.length)}%`])); for (const [va, sk, ad] of [[false, 90, "varsayilan (yonetim, 90 gun)"], [true, 90, "veri duzlemi acik (90 gun)"], [true, 365, "veri duzlemi acik (365 gun)"]]) { const s = SORUSTURMA.map((x) => yanit(x, va, sk)); console.log(`\n${ad}: ${s.filter((x) => x[0] === "evet").length}/${SORUSTURMA.length} soru ` + `yanitlaniyor`); if (ad.startsWith("varsayilan")) for (const [i, x] of SORUSTURMA.entries()) console.log(` ${x[0].padEnd(42)} ${s[i][0].padEnd(6)} ${s[i][1]}`); } }
model (tohum 20260722): 480 olay orneklemi — 132 yonetim duzlemi, 348 veri duzlemi; gunluk hacim 2400 / 1860000 (kurgu) soru varsayilan veri de acik kayit disi kalan oran ne zaman 132 480 0 100% hangi kimlikten 132 480 0 100% hangi kaynak 119 352 128 73% kim (tekil ozne) 99 374 106 78% dordu birden 88 273 207 57% varsayilan (yonetim, 90 gun): 3/8 soru yanitlaniyor uretim politika belgesini kim degistirdi evet 16 olay arsivden hangi nesneler okundu hayir veri duzlemi kaydi kapali musteri anahtarini hangi kimlik kullandi evet 17 olay olcum kaydini kim sildi hayir veri duzlemi kaydi kapali ag kurali ne zaman gevsetildi hayir saklama 90 gun < 210 bakim kimligi hangi sirri okudu evet 15 olay is ortagi jetonunu kim okudu hayir saklama 90 gun < 150 yedek hangi kaynaga yazildi hayir saklama 90 gun < 400 veri duzlemi acik (90 gun): 5/8 soru yanitlaniyor veri duzlemi acik (365 gun): 7/8 soru yanitlaniyor
İlk sütun varsayılan yapılandırmanın kapsamıdır ve 480 olayın 348’i o sütunda hiç yoktur — veri düzlemi kaydı kapalıdır. “Ne zaman” ve “hangi kimlikten” soruları kalan 132 olayın hepsinde yanıtlanıyor; kayıt bu iki alanı her zaman taşır.
Diğer iki soru taşımıyor. Veri düzlemi de açıldığında “hangi kaynak” 480 olayın 352’sinde yanıtlanıyor: kalan 128 olay toplu işlemdir ve kaynak alanı tek tek nesneleri değil kapsayıcıyı adlandırır. “Kim” sorusu 374’te yanıtlanıyor; eksik 106 olay rol üstlenmiş çağrılardır ve oturum etiketi taşımıyorlar. Kayıtta rolün adı var, o rolü üstlenen insanın adı yok — rol paylaşımlıysa soru orada biter.
Dört soruyu birden yanıtlayan olay sayısı 273’tür, yani %57. Varsayılan yapılandırmada aynı sayı 88’dir: 480 olayın %18’i. Bu, “hepsi denetim kaydında” cümlesinin ölçülmüş karşılığıdır.
Soruşturma listesi aynı sonucu somut sorularla veriyor: sekiz sorunun üçü yanıtlanıyor. Başarısızlıklar iki sınıfta toplanıyor ve ikisi ayrı kararlara bakıyor. İki soru veri düzlemi kaydı kapalı olduğu için, üç soru saklama süresi yetmediği için yanıtsız. Veri düzlemi açılınca 5/8, üstüne saklama 365 güne çıkınca 7/8 olur. Hangisinin önce yapılacağı bir maliyet sorusudur ve sonraki bölümde sayılıdır.
Kaydın Kendi Yüzeyi ve Saklamanın Faturası
// kayit.mjs — kaydin kendi yuzeyi (silme, degistirilemezlik) ve saklama-maliyet taramasi. // Para birimi KURGUDUR: "b" birimi uydurmadir, gercek fiyat degildir. import { GUNLUK, SORUSTURMA, yanit } from "./olay.mjs"; const HEDEF = [ // kayit nereye yaziliyor. MODEL. ["ayni hesap, ayni kova", 11, 11, 14, "yok", 0, 0], ["ayni hesap, kilitli kova", 3, 0, 14, "saklama kilidi", 4, 2], ["ayri hesap, kilitli kova", 1, 0, 5, "saklama kilidi", 9, 6], ["ayri hesap + ikinci kopya", 0, 0, 5, "kilit + kopya", 14, 6], ].map(([ad, sil, degis, oku, kilit, ek, duran]) => ({ ad, sil, degis, oku, kilit, ek, duran })); const OLAY_KB = 1.4, ALIM_BIN = 0.4, SAKLAMA_GB = 12; // kurgu birim (b) const gb = (n, gun) => (n * gun * OLAY_KB) / (1024 * 1024); const aylik = (n, gun) => Math.round((n * 30 / 1000) * ALIM_BIN + gb(n, gun) * SAKLAMA_GB); const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); const yh = gen([27, 11, 16, 9, 19, 10, 12]); const ym = gen([14, 12, 14, 14, 14, 13, 13]); console.log(yh(["kayit hedefi", "silebilen", "degistirebilen", "okuyan", "degistirilemezlik", "ek kalem", "duran is"])); for (const h of HEDEF) console.log(yh([h.ad, h.sil, h.degis, h.oku, h.kilit, h.ek, h.duran])); console.log("\n" + ym(["saklama(gun)", "yonetim GB", "yonetim(b/ay)", "veri GB", "veri(b/ay)", "%5 orneklem", "kapsanan"])); for (const gun of [30, 90, 180, 365, 730]) { const t = SORUSTURMA.map((x) => yanit(x, true, gun)).filter((x) => x[0] === "evet").length; console.log(ym([gun, gb(GUNLUK.yonetim, gun).toFixed(2), aylik(GUNLUK.yonetim, gun), Math.round(gb(GUNLUK.veri, gun)), aylik(GUNLUK.veri, gun), aylik(GUNLUK.veri * 0.05, gun), `${t}/${SORUSTURMA.length}`])); } const kapsam = (va, gun) => SORUSTURMA.map((x) => yanit(x, va, gun)) .filter((x) => x[0] === "evet").length; const tut = (va, gun) => aylik(GUNLUK.yonetim, gun) + (va ? aylik(GUNLUK.veri, gun) : 0); console.log(`\nkapsam ve maliyet (kurgu birim b): varsayilan ${kapsam(false, 90)}/8 -> ` + `${tut(false, 90)} b/ay; veri duzlemi acik 90 gun ${kapsam(true, 90)}/8 -> ${tut(true, 90)} b/ay; ` + `365 gun ${kapsam(true, 365)}/8 -> ${tut(true, 365)} b/ay`); console.log(`veri duzlemi kaydini acmak: +${tut(true, 90) - tut(false, 90)} b/ay ve ` + `+${kapsam(true, 90) - kapsam(false, 90)} soru. Saklamayi 90 -> 365 gun: ` + `+${tut(true, 365) - tut(true, 90)} b/ay ve +${kapsam(true, 365) - kapsam(true, 90)} soru`); console.log(`ayni kapsamin iki yolu: yalniz yonetim duzlemi 365 gun ${kapsam(false, 365)}/8 -> ` + `${tut(false, 365)} b/ay; veri duzlemi acik 90 gun ${kapsam(true, 90)}/8 -> ${tut(true, 90)} b/ay`); console.log(`veri duzlemi kaydi yonetim duzlemi kaydinin ` + `${(aylik(GUNLUK.veri, 365) / aylik(GUNLUK.yonetim, 365)).toFixed(0)} katidir; %5 orneklem bu ` + `farki 20'ye boler ama tekil kaynak sorularini yanitlamaz`);
kayit hedefi silebilen degistirebilen okuyan degistirilemezlik ek kalem duran is ayni hesap, ayni kova 11 11 14 yok 0 0 ayni hesap, kilitli kova 3 0 14 saklama kilidi 4 2 ayri hesap, kilitli kova 1 0 5 saklama kilidi 9 6 ayri hesap + ikinci kopya 0 0 5 kilit + kopya 14 6 saklama(gun) yonetim GB yonetim(b/ay) veri GB veri(b/ay) %5 orneklem kapsanan 30 0.10 30 75 23214 1161 3/8 90 0.29 32 224 25002 1250 5/8 180 0.58 36 447 27684 1384 6/8 365 1.17 43 906 33197 1660 7/8 730 2.34 57 1813 44074 2204 8/8 kapsam ve maliyet (kurgu birim b): varsayilan 3/8 -> 32 b/ay; veri duzlemi acik 90 gun 5/8 -> 25034 b/ay; 365 gun 7/8 -> 33240 b/ay veri duzlemi kaydini acmak: +25002 b/ay ve +2 soru. Saklamayi 90 -> 365 gun: +8206 b/ay ve +2 soru ayni kapsamin iki yolu: yalniz yonetim duzlemi 365 gun 5/8 -> 43 b/ay; veri duzlemi acik 90 gun 5/8 -> 25034 b/ay veri duzlemi kaydi yonetim duzlemi kaydinin 772 katidir; %5 orneklem bu farki 20'ye boler ama tekil kaynak sorularini yanitlamaz
Üstteki tablo dersin en rahatsız edici satırıyla başlıyor. Varsayılan yerleşimde denetim kaydı, kaydettiği olayların gerçekleştiği hesabın içinde duruyor ve 11 özne onu silebiliyor, 11’i değiştirebiliyor. Kaydın anlamı buradan gelir: bir olayı yapabilen özne, o olayın kaydını da kaldırabiliyorsa kayıt bir kanıt değil, bir kolaylıktır. Saklama kilidi değiştirebileni sıfıra, silebileni 3’e indiriyor; bedeli 4 kalem yapılandırma ve 2 meşru işin durmasıdır — kova üzerinde doğrudan çalışan iki iş kilitle uyuşmuyor.
Ayrı hesaba taşımak silebileni 1’e indirir, ama okuyan özne sayısını 14’ten 5’e düşürür ve 6 meşru iş durur: kaydı doğrudan sorgulayan ekipler erişimlerini kaybeder ve hesaplar arası okuma ayrıca kurulmadan geri gelmez. Daraltmanın bedeli budur ve 9 yapılandırma kalemiyle birlikte gelir. Son satır silebileni sıfırlar: kilit ve ikinci kopya, 14 kalem. Değiştirilemezlik ücretsiz bir özellik değil, 14 kalemlik bir yapılandırma ve 6 durmuş iştir.
Alt tablo saklama ile maliyeti aynı satırda tutuyor. Yönetim düzlemi kaydı ucuzdur: 365 günde ayda 43 b, 1,17 GB. Veri düzlemi kaydı aynı sürede 33.197 b ve 906 GB — 772 kat. “Kaydın kapsamadığı işlem türü” ücretsiz olduğu için kapsam dışında değildir; kapsam dışıdır çünkü açıldığında fatura üç basamak büyür. Yüzde beşlik örneklem bu farkı yirmiye böler, ama tekil kaynak sorularını yanıtlamaz: “arşivden hangi nesneler okundu” sorusu örneklemli bir kayıtta yanıtsızdır.
Marjinal hesap sıralamayı belirliyor. Veri düzlemini açmak ayda 25.002 b ekliyor ve 2 soru kazandırıyor: soru başına 12.501 b. Saklamayı 90 günden 365 güne çıkarmak 8.206 b ekliyor ve yine 2 soru kazandırıyor: soru başına 4.103 b. Son satır kararı kesinleştiriyor — yalnız yönetim düzlemi kaydını 365 gün saklamak 5/8 soruyu ayda 43 b’ye yanıtlıyor, veri düzlemini açıp 90 gün saklamak aynı 5/8 için 25.034 b istiyor. Beş yüz seksen kat fark, tek bir yapılandırma sırasından doğuyor.
Özet
- 480 olayın 273’ü dört soruyu birden yanıtlıyor (%57); varsayılan yapılandırmada bu sayı 88’dir (%18), çünkü 348 olay veri düzlemindedir ve hiç kaydedilmez.
- “Ne zaman” ve “hangi kimlikten” kayıtlı her olayda yanıtlanıyor; “hangi kaynak” 128 toplu işlemde, “kim” ise oturum etiketi taşımayan 106 rol üstlenme çağrısında yanıtsız kalıyor.
- Sekiz soruşturmanın 3’ü varsayılan yapılandırmada yanıtlanıyor; iki soru veri düzlemi kapalı olduğu, üç soru saklama süresi yetmediği için düşüyor.
- Kaydı varsayılan yerleşimde 11 özne silebiliyor ve 11’i değiştirebiliyor; kilit ve ayrı hesap bunu 0’a indiriyor, karşılığında 14 yapılandırma kalemi ve 6 meşru işin durması geliyor.
- Veri düzlemi kaydı yönetim düzlemi kaydının 772 katına mal oluyor (365 gün, kurgu birim); yüzde beşlik örneklem farkı yirmiye böler ama tekil kaynak sorularını yanıtlamaz.
- Marjinal bedel sırayı veriyor: soru başına saklama uzatması 4.103 b, veri düzlemi açması 12.501 b; yalnız yönetim düzlemini 365 gün saklamak 5/8 soruyu ayda 43 b’ye yanıtlıyor.
Sonraki Adım
Şifreleme, döndürme ve kayıt kurulduğunda ortaya bir sorun çıkıyor: bunların hepsi yapılandırma olarak duruyor ve yapılandırma zamanla kayıyor. Bir kova kilidi kaldırılıyor, bir kayıt hedefi değiştiriliyor, bir bacak muafiyeti kalıcı hale geliyor. Bir sonraki ders bu kaymayı kural kümesiyle ölçer: kaç kaynak uyum kurallarından geçiyor, kaç tanesi geçmiyor ve otomatik düzeltme devreye girdiğinde kaç meşru yapılandırma bozuluyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.