İçeriğe geç
academia.sh

Ders 11 / 22

Günlük Mimarisi

Sistem günlüğü ile servis günlükleri arasındaki ayrım: bir kaydın nereden geldiği, hangi düzeyle damgalandığı ve tek bir birim dosyasına bakan tanının kaç kez yanlış çıktığı.

İçindekiler

Önceki konu makinenin açılışını baştan sona izledi: ürün yazılımı önyükleyiciyi, önyükleyici çekirdeği, çekirdek de ilk süreci çağırdı ve servis yöneticisi birimleri bağımlılık sırasına göre ayağa kaldırdı. O zincirin her adımı bir iş yaptı, ama hiçbiri yaptığı işi operatörün gözü önünde yapmadı. Makine açıldıktan sonra geriye kalan tek tanık yazılı izdir.

Bu konu o izi ele alır. İlk soru mimaridir: bir satır günlüğe (log) nasıl girer, onu kim damgalar, hangi adrese yazılır ve o adresi açan kişi neyi göremez. Sorunun son parçası kursun kuralına bağlanır: bir günlüğün değeri kaç satır tuttuğu değil, o satırlardan çıkarılan tanının kaç kez yanlış çıktığıdır.

Konunun kapsamı tek makinedir. Birden çok makinenin kayıtlarını tek bir yerde toplayan hatlar, göstergeleri saklayan depolar ve eşik aşıldığında haber veren uyarı zincirleri Gözlemlenebilirlik ve İşletim ile Güvenlik Operasyonları ve Olay Müdahalesi kurslarında ölçüldü; burada tekrarlanmaz. Buradaki soru daha önce gelir: makinenin kendi diskinde ve kendi belleğinde duran kayıt, o makinede ne olduğunu söylemeye yeter mi.

Günlüğün Üç Kaynağı

Tek bir makinede günlük satırları üç ayrı yerden doğar ve üçü aynı yola girmez.

Birincisi çekirdektir. Çekirdek kendi iletilerini bellekte dairesel bir tampona yazar; tampon dolduğunda en eski satır düşer. Aygıt tanıma, blok aygıtı hatası ve bellek baskısı uyarıları buradan gelir. Bu tampon disk değildir: yeniden başlatma onu boşaltır, dolayısıyla bir önceki açılışın çekirdek iletileri kalıcı bir kopya alınmadıysa kayıptır.

İkincisi servis yöneticisidir. Bir birim başlatıldığında yöneticinin ona verdiği standart çıktı ve standart hata birer boru hattıdır; birim o iki akışa ne yazarsa yönetici yakalar, birim adıyla damgalar ve sistem günlüğüne (journal) koyar. Programın günlük yazmak için özel bir kütüphaneye ihtiyacı yoktur; ekrana yazması yeterlidir. Kabuk Programlama kursunda kurulan standart çıktı ve standart hata ayrımı burada işletim tarafında karşılığını bulur: veri birinci akıştan, tanı iletisi ikinci akıştan gelir ve yönetici ikisini farklı düzeyle damgalayabilir.

Üçüncüsü uygulamanın kendisidir. Bir program kendi seçtiği bir dosyaya kendi biçiminde yazabilir. Bu dosya servis yöneticisinin görüş alanı dışındadır: birim durdurulsa da dosya kalır, birim adıyla damgalanmaz, düzeyleri yöneticinin düzeyleriyle aynı olmak zorunda değildir. Aynı olayın hem sistem günlüğünde hem de uygulamanın kendi dosyasında iki ayrı biçimde durması olağan bir durumdur.

Üç kaynağın ortak yanı şudur: hiçbiri diğerinin ne yazdığını bilmez. Ayrımın pratik sonucu, bir olayın izinin tek bir adreste bulunacağının garantisi olmamasıdır.

Kalıcılık: Bellekte mi, Diskte mi

Sistem günlüğünün nereye yazıldığı bir yapılandırma kararıdır ve varsayılan davranış dağıtıma göre değişebilir. Üç seçenek vardır. Günlük yalnız bellekte tutulabilir; bu durumda yeniden başlatma bütün geçmişi siler ve makine kendini toparladıktan sonra arızanın izi kalmaz. Günlük diske yazılabilir; geçmiş açılışlar sorgulanabilir hâle gelir, ama dosya sınırsız büyümez ve bir boyut ya da süre sınırına ulaştığında en eskisini atar. Üçüncü seçenek ikisinin karışımıdır: dizin varsa diske, yoksa belleğe.

Bu karar tanıyı doğrudan belirler. Bellekte tutulan bir günlükte, kendini yeniden başlatarak kurtaran bir servisin arıza kaydı kendi kurtulmasıyla birlikte silinir. Servisler konusunda ölçülen durum burada ikinci kez karşımıza çıkar: “her zaman” politikalı bir birim altı yüz saniyede altmış kez yeniden başlıyor ve “çalışıyor” görünüyordu; o birimin makineyi de yeniden başlatan bir arızası varsa, geriye ne durum kalır ne kayıt.

Diske yazılan günlükte ise sınır boyuttur. Sınıra ulaşan dosyanın eski kısmının atılmasına döndürme (rotation) denir ve bu konunun üçüncü dersinin tamamı onun ne sildiğini sayar. Şimdilik tek cümle yeter: kanıtın ömrü, kanıtı üreten olayın ömründen kısa olabilir.

Dördüncü bir ayrım da erişimdir. Günlük dosyaları da sıradan dosyalardır ve Linux’a Giriş kursunda kurulan izin modeline uyarlar; kimlik olaylarını tutan dosyalar çoğunlukla ayrıcalıksız kullanıcıya kapalıdır. Bir kaydın var olması, onu okuyabildiğiniz anlamına gelmez.

Zaman Damgası ve Sıra

Bir günlük satırının en çok güvenilen alanı zamandır, oysa en kırılgan alanı da odur. İki ayrı saat vardır: makinenin açılışından beri geçen süreyi sayan tek yönlü sayaç ve takvim saatini gösteren duvar saati. Birincisi geriye gitmez. İkincisi gider: saat sunucusuyla eşitleme, elle düzeltme ve yaz saati geçişi duvar saatini ileri ya da geri atlatabilir.

Sonucu şudur: duvar saatine göre sıralanmış bir günlükte, gerçekte önce olan bir olay sonra olan bir olayın altında görünebilir. Nedensellik bir arıza incelemesinin ana aracıdır ve tersine dönmüş iki satır, tanıyı doğrudan tersine çevirir. Bu yüzden yapılandırılmış kayıtlar duvar saatinin yanında tek yönlü sayacı ve monoton artan bir sıra numarası da tutar; sıralama yapılırken sayaca güvenmek duvar saatine güvenmekten daha sağlamdır.

Bu dersin ölçüsünde ve sonraki derslerde zaman, ortak tanımın model saniyesidir: gözlem penceresi altı yüz saniyedir ve bütün süreler o pencerenin içinde sayılır. Gerçek bir zaman damgası hiçbir yerde yazılmaz, çünkü gerçek zaman damgası makineye bağlıdır ve yeniden üretilemez.

Düzey, Alan ve Biçim

Her kaydın bir düzeyi vardır. Yaygın sıralama, hata ayıklama iletilerinden acil durum iletilerine kadar uzanan sekiz basamaktır; bu konuda üç basamak yeter: bilgi, uyari, hata. Düzey kaydı yazan tarafın kendi beyanıdır, bağımsız bir ölçüm değildir. Bir program ölümcül bir durumu bilgi düzeyiyle yazarsa, düzeye göre süzen her araç o satırı atar.

Düzeyin ikinci sorunu eşiktir. Bir sistem günlüğü çoğunlukla bir alt sınırla çalışır: belirlenen düzeyin altındaki satırlar yazılmaz. Hata ayıklama düzeyini kapalı tutmak günlüğü küçültür, ama arıza anında en çok işe yarayacak ayrıntı da tam olarak orada durur. Eşiği arızadan sonra açmak geçmişi geri getirmez; eşik, olay olurken neyin yazıldığını belirler. Bu, kursun üçüncü iddiasının en yalın biçimidir: geç bakan az görür.

Yapılandırılmış kayıt ile düz metin arasındaki fark da burada belirir. Düz metin satırı tek bir dizedir; okumak için ayrıştırmak gerekir. Yapılandırılmış kayıt alanlardan oluşur: birim adı, düzey, süreç kimliği, zaman. Alanlar sorgulanabilir olduğu için süzme işi metin eşlemeye değil alan karşılaştırmasına dayanır. Bu ayrım bir sonraki derste ölçülecek olan şeyi belirler: metin eşleyen bir süzgeç ile alan bilen bir süzgeç aynı soruya farklı yanıt verir.

Aynı Olayın İki Adresi

Sistem günlüğü, bütün birimlerin kayıtlarını zaman sırasına göre tek bir akışta tutar. Aşağıdaki döküm örnektir ve çalıştırılmamıştır; köşeli parantez içindeki sayı açılıştan sonra geçen saniyedir.

# ornek dokum , calistirilmis degildir
[  461.250] isleme[1043]: hata: kuyruk yaniti alinamadi
[  461.400] isleme[1043]: bilgi: yeniden deneme 1/5
[  463.100] olcum[1092]: uyari: ornekleme penceresi asildi
[  466.050] veri-alma[1014]: hata: akis kapandi

Aynı olaylar birim başına ayrılmış dosyalarda saklanırsa görüntü değişir. isleme biriminin kendi dosyası şöyle görünür; bu döküm de örnektir ve çalıştırılmamıştır.

# ornek dokum , calistirilmis degildir
[  461.250] hata: kuyruk yaniti alinamadi
[  461.400] bilgi: yeniden deneme 1/5
[  527.500] hata: kuyruk yaniti alinamadi

İkinci dökümde olcum ve veri-alma satırları yoktur. Kaybolan şey satır değil, satırlar arasındaki komşuluktur: isleme biriminin hatasından beş saniye sonra veri-alma biriminin akışının kapandığı bilgisi yalnız birleşik akışta durur.

İki dökümün ikinci farkı damgadır. Birleşik akışta her satırın önünde birim adı vardır; birim dosyasında yoktur, çünkü dosyanın adı zaten birimi belirtir. Bu, dosya küçükken tasarruf gibi görünür, ama iki dosya birleştirildiğinde satırların hangisinin nereden geldiği kaybolur. Bir arıza incelemesinde farklı kaynaklardan gelen dökümleri tek zaman ekseninde birleştirmek olağan bir adımdır; damgasız satırlar bu adımda kimliksiz kalır.

Üçüncü fark ise servis yöneticisinin damgayı kendisinin koymasıdır. Birim adı, süreç kimliği ve düzey satırın içeriğinden değil, yöneticinin bildiği bağlamdan gelir. Program kendi dosyasına yazdığında bu bağlam yoktur: aynı olayın uygulamanın kendi dosyasındaki karşılığında birim adı bulunmaz, süreç kimliği programın yazmayı seçtiği kadardır ve düzey programın kendi ölçeğine göre işaretlenir. Aynı olay, iki adreste iki farklı doğrulukta temsil edilir.

Ölçülen Şey: Tek Dosyaya Bakan Tanı

Ölçü, ortak tanımın günlük üretecinin üzerine kurulur. Kurgunun varsayımları şunlardır: gözlem penceresi altı yüz saniye, günlük 4000 satır ve düzey ağırlıkları ortak tanımdan gelir (GN1); kayıtlar altı birime dağılır (GN2); komşuluk penceresi beş saniyedir (GN3); operatör açtığı tek dosyaya bakarak karar verir (GN4).

Kâhin, altı birimin gerçekte kaç hata yazdığıdır; kurguyu biz ürettiğimiz için biliniyor. Araç çıktısı, operatörün açtığı tek bir birim dosyasıdır. Tanı, o dosyaya bakarak verilen “hata kaynağı bu birimdir” kararıdır.

TOHUM = 20260218
DONEM = 600                      # gozlem penceresi: 600 saniye


def uretec(tohum):
    d = tohum

    def sonraki(n):
        nonlocal d
        d = (d * 1103515245 + 12345) % 2147483648
        return d % n
    return sonraki


BIRIM = {
    "veri-alma":      {"gerektirir": [], "yeniden": "her zaman"},
    "kuyruk":         {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "isleme":         {"gerektirir": ["kuyruk"], "yeniden": "arizada"},
    "rapor":          {"gerektirir": ["isleme"], "yeniden": "hayir"},
    "olcum":          {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "yedek":          {"gerektirir": [], "yeniden": "hayir"},
}


def gunluk_uret(tohum=TOHUM, satir=4000):
    r = uretec(tohum)
    kayit = []
    for i in range(satir):
        agirlik = r(100)
        duzey = "hata" if agirlik < 3 else ("uyari" if agirlik < 12 else "bilgi")
        kayit.append({"sira": i, "saniye": i * (DONEM / satir),
                      "duzey": duzey, "birim": list(BIRIM)[r(len(BIRIM))]})
    return kayit


def birim_hatalari(kayitlar):
    d = {b: 0 for b in BIRIM}
    for k in kayitlar:
        if k["duzey"] == "hata":
            d[k["birim"]] += 1
    return d


def tek_gunluk_tanisi(kayitlar):
    """GN4: yalniz TEK bir birim dosyasina bakan operator: 'kaynak bu birim'."""
    d = birim_hatalari(kayitlar)
    suclu = max(d, key=lambda b: d[b])
    return {"gercek_kaynak": suclu, "sessiz_dosya": sum(1 for b in d if d[b] == 0),
            "denenen": len(d), "yanlis_tani": sum(1 for b in d if b != suclu)}


def komsu_hata(kayitlar, aralik=5.0):
    """GN3: bes saniye icinde BASKA bir birimden hata gelen hatalar."""
    h = [k for k in kayitlar if k["duzey"] == "hata"]
    return sum(1 for i, a in enumerate(h)
               if any(abs(b["saniye"] - a["saniye"]) <= aralik
                      and b["birim"] != a["birim"] for j, b in enumerate(h) if i != j))


for tohum in (TOHUM, 20260219):
    G = gunluk_uret(tohum)
    d = birim_hatalari(G)
    print("tohum", tohum, "| satir", len(G), "| hata", sum(d.values()),
          "| birim basina", list(d.values()))
    print("  ", tek_gunluk_tanisi(G), "| komsu hata", komsu_hata(G))
tohum 20260218 | satir 4000 | hata 86 | birim basina [28, 0, 31, 0, 27, 0]
   {'gercek_kaynak': 'isleme', 'sessiz_dosya': 3, 'denenen': 6, 'yanlis_tani': 5} | komsu hata 50
tohum 20260219 | satir 4000 | hata 163 | birim basina [0, 50, 0, 51, 0, 62]
   {'gercek_kaynak': 'yedek', 'sessiz_dosya': 3, 'denenen': 6, 'yanlis_tani': 5} | komsu hata 135

Çıktının Söylediği ile Sistemin Gerçeği

Üç sayı yan yana durur. Kâhin: 4000 satırlık pencerede 86 hata var ve bunların 31’i isleme birimine ait; gerçek kaynak odur. Araç çıktısı: altı birim dosyasının içeriği, sırasıyla 28, 0, 31, 0, 27 ve 0 hata. Yanlış tanı: 5. Operatör altı dosyadan birini açar ve “hata kaynağı bu birimdir” der; altı denemenin beşinde yanılır.

Bu beş yanılgının üçü aynı türden değildir. Üç dosya tamamen sessizdir: hiç hata satırı tutmaz. O dosyayı açan operatör “burada sorun yok” sonucuna varır ve bu sonuç, kendi birimi için doğru olsa bile sistem hakkında yanlıştır — sistemde 86 hata vardır. Kalan iki dosya hata gösterir ama en çoğunu göstermez; oradaki operatör soruna bakar, yanlış birimi suçlar. Sessizlik ile masumiyet aynı şey değildir.

İkinci sayı komşuluğu ölçer: 86 hatanın 50’sinin beş saniye içinde başka bir birimden gelen bir hata komşusu vardır. Bu 50 satırın hiçbiri, tek bir birim dosyasında komşusuyla birlikte görünmez. Birim başına ayrılmış dosyalar satır kaybetmez; sıra kaybeder ve sıranın kendisi bir kanıttır.

Buradan mimari bir karar çıkar: birim başına dosya, tek bir birimi derinlemesine incelerken işe yarar; bir arızanın nereden başladığını bulmak içinse birleşik ve zaman sıralı akış gerekir. İki adresten birini seçmek zorunlu değildir, ama hangisine bakıldığının tanıyı belirlediği bilinmelidir.

Ölçünün sınırı da açıkça durmalıdır. Kâhin burada kurgunun kendisidir; gerçek bir makinede hangi birimin gerçekten kaynak olduğunu bilen bir taraf yoktur, tanıyı sınayan tek şey sonradan yapılan onarımın işe yarayıp yaramamasıdır. Kurgunun sağladığı şey, “altıda beş” sayısının nereden geldiğinin görülebilmesidir: sayı, aracın kusurundan değil, bakılan adresin seçiminden doğar. Aynı 4000 satır birleşik akışta okunsaydı hata dağılımı tek sorguyla görünürdü ve yanlış tanı sıfıra inerdi. Araç yalan söylemiyor; eksik olan şey sorunun sorulduğu yerdir.

Operasyonel sonuç iki maddedir. Birincisi, bir arıza incelemesine birim dosyasından değil birleşik akıştan başlanır; birim dosyası, kaynağın hangi birim olduğu belirlendikten sonra ayrıntı için açılır. İkincisi, sessiz bir dosya kanıt sayılmaz: o birimin hiç kayıt yazmaması, birimin sağlıklı olduğunu değil, yalnız yazmadığını gösterir. Bir birimin sustuğu bir arıza ile hiç sorun yaşamadığı bir pencere, günlük tarafından aynı biçimde temsil edilir.

İkinci Tohum

İkinci tohumla kurgu değişir: hata sayısı 163’e çıkar, hatalar farklı birimlere dağılır ve gerçek kaynak yedek olur. Yanlış tanı sayısı yine 5, sessiz dosya sayısı yine 3 kalır; iki tohumda da yalnız üç birim hata yazar. Komşu hata oranı ise değişir: ilk tohumda 86 hatanın 50’si, ikincisinde 163 hatanın 135’i komşuludur. Oranın kendisi kurguya bağlıdır; kurguya bağlı olmayan şey, tek dosyaya bakan tanının altıda beş yanılması ve komşuluğun tek dosyada hiç görünmemesidir.

Özet

  • Günlük satırları üç ayrı kaynaktan doğar: çekirdeğin dairesel tamponu, servis yöneticisinin yakaladığı standart çıktı ve standart hata, uygulamanın kendi dosyası.
  • Düzey, kaydı yazanın beyanıdır; bağımsız bir ölçüm değildir. Yanlış damgalanmış bir satırı düzeye göre süzen her araç atar.
  • Kâhin 86 hatanın gerçek kaynağını bilir; tek bir birim dosyasına bakan tanı altı denemenin beşinde yanılır, üç dosya ise tamamen sessizdir.
  • 86 hatanın 50’si beş saniye içinde başka bir birimden gelen bir hataya komşudur; bu komşuluk yalnız birleşik ve zaman sıralı akışta görünür.
  • Birim başına ayrılmış dosyalar satır kaybetmez, sıra kaybeder; sıra da bir kanıttır.

Sonraki Adım

Bu derste bakılan kayıtların hepsi servislerin kendi ürettiği iletilerdi. Bir makinede ayrıca kimin ne zaman girdiğini, hangi hesabın hangi yetkiyi istediğini ve hangi isteğin reddedildiğini tutan ayrı bir olay kümesi vardır. O kayıtlar aynı sistem günlüğüne düşer ama farklı okunur: sorulan soru “hangi birim bozuldu” değil, “kim yaptı” sorusudur. Sonraki ders kimlik doğrulama günlüklerini ele alır ve metin eşleyen bir süzgecin bu soruya verdiği yanıtın kaç satırda yanlış olduğunu sayar.

İ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