Kilit Beklemesi Olayını Yönetmek: Sahiplik, Müdahale Kararı ve Toparlanma Kanıtı
PostgreSQL kilit kuyruğu dalgalanmalarında panik yapmadan olay yönetimi: RACI sahiplik matrisi, backend terminate sınırları, retry storm önleme protokolü, paydaş iletişimi ve doldurulabilir olay kartı.
▸ Yönetici Özeti ve Olay Anı Gerçeği
PostgreSQL kilit beklemeleri (lock contention), platform mühendisliğinin en hızlı tırmanan ve en tehlikeli kriz türlerinden biridir. Bir web servisi bellek tükettiğinde pod yeniden başlar; CPU yükseldiğinde autoscaler devreye girer. Ancak bir transaction kritik bir satır veya tabloda kilit tutarken beklemeye girdiğinde, saniyeler içinde yüzlerce oturum aynı kilidi beklemeye başlar. Bağlantı havuzu tükenir (53300 too many clients), API yanıt süreleri tırmanır, arka planda biriken sorgular sunucuyu kilitler.
Bu kriz anında en büyük tehlike yanlış kararlar almaktır:
- 1Rastgele oturum öldürmek: Kök bloklayıcıyı (root blocker) bulmadan kilit bekleyen masum istemcileri öldürmek sorunu çözmez; yeni bağlantılar hemen boşalan yerleri doldurarak kuyruğu daha da şişirir.
- 2`pg_cancel_backend` yanılgısı:
idle in transactiondurumundaki bir işlemipg_cancel_backendile durdurmaya çalışmak başarılı döner (true), ancak oturum açık kaldığı için kilitler bırakılmaz. - 3Retry fırtınası (retry storm): Timeout yiyen istemcilerin hemen aynı işlemi tekrar denemesi, veritabanı kilit kuyruğunu katlayarak çöküşü kaçınılmaz hale getirir.
Bu rehber, bir PostgreSQL kilit krizi patlak verdiğinde veri platformu ve SRE ekiplerinin izleyeceği operasyonel standardı tanımlar: rol paylaşımı (RACI), adım adım müdahale sınırları, retry fırtınasını dondurma protokolü, paydaş iletişimi ve olay sonrası kanıta dayalı postmortem standardı.
1. Olay Sahipliği ve RACI Matrisi
Bir kilit krizi sırasında Slack kanalında 15 kişinin aynı anda öneri sunması felakettir. Kimin yetkili olduğu krizden önce bilinmelidir.
| Rol | Sorumlu Kişi | Temel Görev (RACI) | Yetki Sınırı |
|---|---|---|---|
| Incident Commander (IC) | Nöbetçi SRE / Platform Lead | Accountable (A): Kriz kanalını yönetir, kararları kaydeder, iletişimi tek elden yürütür. | Müdahale zaman sınırını koyar. Teknik detaya boğulmaz. |
| Database On-Call / DBA | Kıdemli Veritabanı Mühendisi | Responsible (R): Kök bloklayıcı PID'yi tespit eder, kilit türünü ve güvenli sonlandırma yöntemini belirler. | pg_cancel_backend veya pg_terminate_backend çalıştırma yetkisi tek kişidedir. |
| Uygulama Sahibi (App Owner) | Servisin Tech Lead'i | Consulted (C): Bloklayan işlemin iş yükü önemini değerlendirir: Finansal mutabakat mı, arka plan raporu mu? | İşlem geri alınırsa (rollback) veri kaybı veya tutarsızlık olup olmayacağını onaylar. |
| Paydaş İletişimcisi (Comms) | Ürün Yöneticisi / Destek Lideri | Informed (I): Müşteri ve yönetim kanallarına standart durum şablonlarını iletir. | Teknik kanala soru sormaz; yalnızca IC'nin özetini yayar. |
2. Müdahale Karar Ağacı: Rollback, Cancel veya Terminate
Kriz anında kök neden bulunduysa (örneğin PID 113), DBA ve Uygulama Sahibi şu karar matrisini uygular:
▸2.1. `pg_cancel_backend` vs `pg_terminate_backend` Ayrımı
Laboratuvar testlerimizde (L5 Senaryosu) kesin olarak kanıtlandığı üzere:
- `pg_cancel_backend(pid)`: Yalnızca o anda çalışmakta olan bir SQL ifadesine
SIGINTsinyali gönderir. Eğer oturumidle in transactiondurumundaysa, fonksiyontruedöndürür ancak hiçbir şey yapmaz! Oturum açık kalmaya, transaction devam etmeye ve satır kilitleri tutulmaya devam eder. - `pg_terminate_backend(pid)`: Backend prosesine
SIGTERMgönderir, istemci bağlantısını koparır, transaction'ı sunucu tarafında güvenleROLLBACKeder ve tutulan tüm kilitleri anında işletim sistemine ve PostgreSQL'e iade eder.
idle in transaction durumundaki kök bloklayıcılar için pg_cancel_backend ile vakit kaybetmeyin. Doğrudan hedefli pg_terminate_backend(pid) çalıştırın.3. Retry Fırtınasını (Retry Storm) Önleme Protokolü
Kilit beklemelerinin en yıkıcı ikinci dalgası, veritabanı kilitlendiği anda mikroservislerin agresif retry politikalarıyla gelir.
▸Mekanizma:
- 1100 kullanıcı aynı anda checkout butonuna basar.
- 2İlk istek kilit alır; diğer 99 istek
lock_timeout(örneğin 2 sn) süresine takılarak55P03veya57014hatası alır. - 3Uygulama kodu
for (let i = 0; i < 3; i++) { retry(); }döngüsüne girer. - 4Sıfır bekleme süresiyle (zero delay) 99 istek anında tekrar veritabanına hücum eder. 99 istek 198, ardından 396 isteğe dönüşür.
- 5Veritabanı bağlantı havuzcusu (PgBouncer) kilitlenir, sunucuda CPU tavan yapar.
▸Protokol:
- 1Circuit Breaker: Kilit bekleme süresi 5 saniyeyi aştığında istemci katmanı veya API Gateway (Kong, Envoy) ilgili uç noktayı
503 Service Unavailableile anında reddetmeli, veritabanına yeni bekleme sokmamalıdır. - 2Exponential Backoff + Full Jitter:
$$\text{sleep} = \text{random}(0, \min(\text{cap}, \text{base} \times 2^{\text{attempt}}))$$ Tüm istemcilerin aynı anda retry atmasını engellemek için tam rastgelelik (full jitter) zorunludur.
4. Olay İletişim Şablonları
Incident Commander, kriz sırasında paydaşlara kesinlikle kod parçası veya iç SQL çıktıları göndermez. İki standart şablon kullanılır:
▸4.1. Dahili Mühendislik & Yönetim Güncellemesi (Her 15 dakikada bir)
[DURUM GÜNCELLEMESİ #2] - Ödeme Servisi DB Kilit Beklemesi Olayı
Durum: Araştırılıyor (Kök bloklayıcı PID 1420 tespit edildi)
Kullanıcı Etkisi: %12 oranında ödeme isteği 504 Gateway Timeout alıyor.
Alınan Aksiyon: Kök bloklayıcı oturumun 'idle in transaction' kaldığı doğrulandı.
Uygulama Sahibi onayı ile pg_terminate_backend(1420) çalıştırıldı.
Sonraki Adım: Kuyruk erimesi ve replikasyon gecikmesi izleniyor.
Bir Sonraki Güncelleme: 14:30 TSİ▸4.2. Müşteri & Kamuoyu Bildirimi
Ödeme sistemlerimizde geçici bir yavaşlık tespit edilmiştir.
Mühendislik ekibimiz müdahale etmektedir; mevcut işlemler güvendedir ve mükerrer tahsilat
riski bulunmamaktadır. Yeni denemeler için lütfen 5 dakika bekleyiniz.5. Doldurulabilir Olay Kartı (Incident Card)
Kilit vakası çözüldükten hemen sonra Incident Commander ve DBA bu kartı doldurarak olay kanalına sabitler:
| Alan | Bilgi / Kayıt | Açıklama |
|---|---|---|
| Olay Kodu | INC-2026-11-06-LOCKS-01 | Benzersiz olay kimliği |
| Başlangıç / Bitiş | 14:02 UTC — 14:18 UTC (Süre: 16 dk) | TTD (Tespit) ve TTR (Çözüm) süreleri |
| Kök Bloklayıcı PID | PID 113 (app_checkout_a) | Kilit kuyruğunu başlatan backend prosesi |
| Kilit Tipi & Nesne | ExclusiveLock on orders_p2026_11 | Beklemeye neden olan tablo/satır kilidi |
| Kuyruk Boyutu | 48 oturum bekledi (53300 pool near max) | Maksimum eşzamanlı bloke olan oturum sayısı |
| Müdahale Kararı | pg_terminate_backend(113) uygulandı | Neden: idle in transaction süresi > 120s |
| Toparlanma Kanıtı | pg_stat_activity kilit bekleyen: 0; CPU: %14'e düştü | Veritabanı ve havuz metriklerinin normale dönüşü |
| Kök Katkı Faktörü | Dış PSP çağrısının transaction içinde yapılması | HTTP timeout süresince DB transaction açık kalmış |
| Önleyici Aksiyon | PSP çağrısı transaction dışına taşınacak; idle_in_transaction_session_timeout = '15s' set edilecek | JIRA: PLAT-4921 (Kapanış: 3 gün) |
6. Kanıta Dayalı Postmortem ve 90 Günlük İyileştirme Planı
Bir kilit krizi geçiştirilemez. Postmortem toplantısında suçlama yapılmaz; pipeline ve mimari açıklar kapatılır.
▸Katkı Faktörleri Modeli (Blameless Review)
- Tetikleyici: Ödeme servisinin dış sağlayıcıdan (PSP) yanıt alamaması.
- Mimari Açık:
BEGIN; SELECT FOR UPDATE; await fetch(psp); COMMIT;şeklinde ağ çağrısının transaction içine yazılmış olması. - Sistemik Güvenlik Eksikliği: Veritabanında
idle_in_transaction_session_timeouttanımlanmamış olması.
▸90 Günlük Yol Haritası:
- 10–30 Gün (Sert Koruma):
- Tüm uygulama rollerinde
idle_in_transaction_session_timeout = '15s'zorunlu kılınacak. - Tüm DDL operasyonlarında
lock_timeout = '2s'standardı CI/CD migration araçlarına entegre edilecek.
- 131–60 Gün (Gözlemlenebilirlik):
- Kilit bekleme süresi > 1s olduğunda Slack alert üreten Prometheus/Datadog metriği devreye alınacak.
- PGBouncer bağlantı satürasyon alarmları erken uyarı moduna geçirilecek.
- 161–90 Gün (Mimari Olgunluk):
- Kod tabanındaki tüm
FOR UPDATEve uzun transaction kalıpları denetlenecek. - Veritabanı işlemlerinde optimistic locking (
versionkolonu) desenine geçiş başlatılacak.
Restore Tatbikatı & Kurtarma Deneyiminizi Paylaşın
Altyapınızdaki gerçek tatbikat sonuçlarını, RTO/RPO hedeflerinizi ve karşılaştığınız operasyonel engelleri anonim veya isimli olarak paylaşın. Sektör benchmark'ına katkıda bulunun.
Tamamlayıcı Ekosistem İçerikleri: PostgreSQL Kilitleri, Deadlock ve Uzun Transaction'lar: Teşhis, Araç Seçimi ve Olay Yönetimi
Aynı mühendislik konusunu farklı açılardan (teşhis, araç seçimi, olay yönetimi) ele alan diğer dataiotech yayınları:
PostgreSQL Kilitlerini Okumak: Blocking, Deadlock ve Uzun Transaction'lar
PostgreSQL kilit hiyerarşisi, pg_locks ve pg_stat_activity ile kök bloklayıcıyı bulma, L1-L5 izole lab kanıtları ve güvenli sonlandırma kuralları.
PostgreSQL Kilit Beklemelerinde Araç Seçimi: Canlı Oturumdan Geçmiş Olay Kanıtına
PostgreSQL kilit ve deadlock vakalarında pg_stat_activity/CLI, pg_activity/pgCenter ve pganalyze/Datadog/OTel karşılaştırması; saklama, yetki ve maliyet matrisi.
Bu mimariyi üretimde test etmek ister misiniz?
DataOpsphere CI/CD şablonlarını ve Docker Compose ortamlarını kopyalayıp hemen çalıştırabilirsiniz.