Sertaç Yıldırım saha notları

Ana sayfa → Teknik

Nöbet: Kahramanlık Değil, Devir Teslim

Gece 03:12. Telefon çalıyor: PAYMENT_LATENCY. Alarmın altında bir runbook linki var, tıklıyorum — sayfa boş. 40 dakika log okudum, sonra servisi yeniden başlattım ve düzeldi. Neden düzeldiğini hâlâ bilmiyorum.

Özet
  • Nöbetin zor kısmı alarmın çalması değil, o anda elinde ne olduğu. Alarm doğruydu; ben ne yapacağımı bilmiyordum.
  • Runbook’u yazılamayan alarm insana gitmez. Bu tek kural, bizde 60 küsur alarmın 23’ünü sildirdi — kimse itiraz etmedi.
  • Yetki önceden yazılır. Geri alınabilir her şey gece serbest; geri alınamaz hiçbir şey değil. Yazılı değilse nöbetçi ya donar ya izinsiz iş yapar.
  • Devir toplantısı 15 dakika, üç madde. En kritiği “bu hafta neyi susturdum” — susturma sessizce kalıcılaşan tek şey.
  • İlk nöbet tek başına olmaz. Gölge nöbet: bir hafta, telefon çalmıyor ama her alarmı o da görüyor.
  • Alarmı neye kuracağın ayrı bir konu. Onu gözlemlenebilirlik yazısında anlattım; burada alarm çaldıktan sonrası var.

Sahadan: boş runbook ve 40 dakika

O gece yaptığım şey dışarıdan başarı gibi görünüyor: alarm geldi, adam uyandı, servis düzeldi. İçeriden bakınca üç ayrı arıza var.

Birincisi: alarmın adı PAYMENT_LATENCY idi ve bu ad bana hiçbir şey söylemiyordu. Hangi servis, hangi eşik, kullanıcı ne hissediyor — hiçbiri yok. İkincisi: runbook linki vardı ama sayfa boştu; biri sayfayı açmış, başlığı yazmış, gerisini “sonra”ya bırakmıştı. Üçüncüsü ve en kötüsü: sorunu çözmedim, sildim. Yeniden başlatmak kök nedeni ortadan kaldırmaz, sadece kanıtı siler.

Sabah ekibe anlattığımda çıkan cümle şuydu: “Evet, o alarm hep öyle gelir, restart atıyoruz.” Yani bu benim bilmediğim bir şey değildi — hiçbir yerde yazmayan bir şeydi. Bilgi üç kişinin kafasındaydı ve nöbet listesinde beş kişi vardı.

Runbook’u olmayan alarm, alarm değildir. Gece çalan bir zildir.

Nöbetçinin üç sorusu

Gece uyanan bir insan sıfır bağlamla çalışır. Kahve yok, ekip yok, beynin yarısı kapalı. O insanın üç sorusu var ve nöbet sisteminin tek işi bu üçünü önceden cevaplamış olmak:

  1. Ne bozuldu? Alarmın adı ve mesajı, kullanıcının hissettiği şeyi söylemeli. CPU_HIGH değil, odeme-api p95 > 2sn, 5 dk.
  2. Ne yapmalıyım? Runbook. Sıradaki üç komut, sırayla.
  3. Yetkim var mı? Bunu gece tek başıma yapabilir miyim, yoksa birini mi uyandırmalıyım?

Üçüncü soru en çok atlanan. Yetki yazılı değilse iki şeyden biri oluyor: ya nöbetçi donup sabahı bekliyor (kesinti uzuyor), ya da izinsiz iş yapıyor (bir dahaki sefere daha büyük bir şey bozuluyor). İkisi de sistemin hatası, kişinin değil.

Runbook: doküman değil, koşu talimatı

Bizim boş sayfamızın sebebi şuydu: runbook’u bir doküman sanıyorduk. Doküman yazmak uzun sürer, o yüzden ertelenir. Koşu talimatı yazmak on dakika sürer:

Runbook sablonu
ALARM: odeme-api-p95-yuksek
--------------------------------------------------------------
NE DEMEK   : odeme-api p95 > 2sn, 5 dakikadir. Kullanici odeme
             ekraninda bekliyor; hata almiyor ama tamamlayamiyor.
ONCE BAK   : 1) Grafana "odeme-api" dashboard, error rate yukseldi mi?
             2) Bagimli servis: kart-servisi p95
             3) Son 2 saatte deploy var mi?
YAP        : - error rate normalse ve son deploy 2 saat icindeyse
               --> surumu geri al (tek komut, asagida)
             - kart-servisi de yavassa --> sorun bizde degil,
               kart-servisi nobetcisini ara
             - ikisi de degilse --> connection pool doygunlugu,
               komut asagida
KOMUTLAR   : rollback:  deploy rollback odeme-api
             pool:      kubectl -n prod get pods -l app=odeme-api
UYANDIR    : 20 dakikada duzelmediyse --> takim lideri
             para kaybi varsa --> hemen, beklemeden
YAPMA      : semayi degistirme, veri duzeltme, kalici config degisikligi

Sonra tek bir kural koyduk ve en çok işe yarayan şey bu oldu: runbook’u yazılamayan alarm insana gitmez. Bir alarmın runbook’unu yazamıyorsan ya alarm anlamsızdır ya da kimse ne yapacağını bilmiyordur; ikisinde de gece birini uyandırmaya hakkın yok. O alarm dashboard’a iner, oradan bakılır.

Kuralı uyguladığımız hafta sayfalanabilir alarm listesi 60 küsurdan 38’e düştü. Silinen 23 alarmın hiçbiri için “ama o lazımdı” diyen olmadı. Alarm biriktirmek kolay, silmek için bir bahane gerekiyor; kural o bahaneyi veriyor.

Gece yetkisi: önceden yazılır

Gece serbest (geri alınabilir)
  • Servisi yeniden başlatmak
  • Sürümü geri almak
  • Feature flag kapatmak
  • Trafiği başka bölgeye almak
  • Kapasite artırmak (replica, pool)
  • Bir tüketiciyi geçici durdurmak

Hepsinin ortak özelliği: yanlışsa geri alınır, kanıt kaybolmaz.

Gece yasak (geri alınamaz)
  • Şema değişikliği
  • Veri düzeltme / elle UPDATE
  • Kalıcı yapılandırma değişikliği
  • Kuyruğu boşaltmak
  • Alarmı kalıcı olarak kapatmak

Bunlar sabah, iki çift gözle. Gece 03:00 karar verme saati değil.

Bir de uyandırma eşiği lazım, çünkü en çok tereddüt edilen yer burası. Bizde üç satır:

  • 20 dakika kuralı. 20 dakikada ilerleme yoksa bir kişi daha uyandırılır. Tereddüt yok, izin istenmez.
  • Para kaybı varsa hemen. Beklemek yok; ödeme, sipariş ya da para hareketi etkileniyorsa süre şartı aranmaz.
  • Uyandırmak hata değildir. Gereksiz uyandırma için kimseye bir şey denmez. Bu cümleyi yazılı hâle getirmezsen kural işlemiyor — insanlar birini uyandırmaktan, kesintiyi uzatmaktan daha çok çekiniyor.

Devir toplantısı: 15 dakika, üç madde

Nöbetin en ucuz ve en çok atlanan parçası. Haftada bir, devreden ve devralan kişi, 15 dakika. Gündem sabit:

  1. Açık olaylar. Çözülmemiş ya da yarım kalmış ne var? “Restart attık, sebebini bilmiyoruz” da bir açık olaydır.
  2. Bu hafta neyi susturdum? Hangi alarmı, neden, ne kadar süreyle. Bu madde listenin en önemlisi.
  3. Biriken risk. “Disk %80’e geldi, iki haftaya dolar.” Bu hafta patlamayacak ama gelecek hafta senin nöbetinde.

İkinci maddenin neden kritik olduğunu zor yoldan öğrendik. Susturma, sistemde sessizce kalıcılaşan tek şey: bir alarmı “şimdilik” iki saatliğine susturuyorsun, sonra unutuluyor, üç ay sonra o alarm hiç çalmıyor ve kimse bunu bilmiyor. Devirde söylenmeyen susturma, silinmiş alarmdır.

Nöbet, alarmın çalmasıyla değil; devredilmesiyle yönetilir.

İlk nöbet: gölge hafta

Yeni katılan birini üçüncü haftasında tek başına nöbete koymak, yukarıdaki üç soruyu da cevapsız bırakmak demek. Bizde kural şu: ilk nöbet gölge.

Gölge haftada kişinin telefonu çalmıyor, ama bütün alarmları görüyor ve asıl nöbetçi müdahale ederken yanında. Tek görevi var: o hafta gelen her alarm için runbook’a bakmak ve eksik bulduğu yeri düzeltmek. İki kazanç birden — kişi sistemi öğreniyor, runbook’lar taze kalıyor. Runbook’u en iyi güncelleyen kişi, onu ilk kez okuyandır.

Ne izlemeli?

Nöbetin sağlığını üç ay üst üste ölçmeden bilemiyorsun. Yük dağılımının adaleti ayrı bir konu ve onu tükenmişlik yazısında anlattım; buradaki dört sayı nöbetin işleyişine bakıyor:

NeHedefNe anlama geliyor
Gece uyandıran alarm / hafta2’nin altıÜstündeyse sorun nöbet düzeni değil, sistemin kendisi
Runbook’u olan sayfalanabilir alarm oranı%100Zorunlu kural; %100 değilse eksik olanlar silinmeli
Aktif susturma sayısı0’a yakın ve bilinenKimsenin bilmediği susturma, kapatılmış alarmdır
“Sebebini bilmiyoruz” ile kapanan olay oranıDüşük ve takip ediliyorYüksekse restart kültürü var; her biri bir postmortem konusu

Bende işe yaramayanlar

  • Alarmları önem seviyesine bölmek (P1/P2/P3). Kâğıtta düzenli, pratikte herkes her alarmı P1 yazdı. Tek ayrım işe yaradı: bu alarm bir insanı uyandırır mı, uyandırmaz mı? İkiden fazla seviye yok.
  • Ortak nöbet havuzu. “Bütün servislere tek nöbet listesi” adil görünüyordu; nöbetçi bilmediği yedi servisin alarmını alınca her alarmda birini aramak zorunda kaldı. Nöbet, sahiplikle aynı sınırı takip etmeli.
  • Runbook’ları wiki’ye koymak. Wiki’de yazılan runbook güncellenmiyor, çünkü kodla birlikte değişmiyor. Repo’ya taşıdık; artık servisi değiştiren PR runbook’u da değiştiriyor. Bunu monorepo yazısındaki sahiplik mantığıyla aynı yere koyduk.

Kontrol listesi

Nöbet düzenin ayakta mı?
  • Sayfalanabilir alarmların kaçının runbook’u gerçekten dolu?
  • Alarm adları kullanıcının hissettiğini söylüyor mu, metrik adını mı?
  • Nöbetçinin gece ne yapabileceği yazılı mı, sözlü mü?
  • Kaç dakikada bir kişi daha uyandırılır — sayı belli mi?
  • “Gereksiz uyandırmak serbesttir” cümlesi yazılı mı?
  • Devir toplantısı yapılıyor mu, yoksa mesajla mı devrediliyor?
  • Şu an kaç aktif susturma var? Kim biliyor?
  • İlk nöbetine çıkan kişi gölge hafta geçiriyor mu?
  • Son ayda kaç olay “restart attık, geçti” diye kapandı?

Sonuç

O gece 40 dakika kaybettim ve bunun tek sebebi alarmın kötü olması değildi. Alarm doğru zamanda, doğru kişiye gitti. Sorun şuydu: alarmın arkasında bir sistem yoktu — ne bir talimat, ne bir yetki sınırı, ne de o bilgiyi üç kişinin kafasından çıkarıp yazıya döken bir alışkanlık.

Nöbeti düzelten şey daha dayanıklı insanlar bulmak değil. Gece uyanan insanın önüne, uyanıkken yazılmış bir talimat koymak.

Test basit: ekibe yeni katılan biri bu gece nöbet tutsa, tek başına ne kadar ilerleyebilirdi? Cevabın “pek ilerleyemezdi” ise nöbet listen var, nöbet düzenin yok.