dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Operasyon/Runbook'lar/PostgreSQL/Replication & HA/Troubleshooting
PostgreSQL / Replication & HA / Troubleshooting
Teknik Uygulama Rehberihigh30 dakika / 30 mins
postgresql (14–18)

PostgreSQL Replication Lag: Darboğazı Adım Adım Teşhis Etme

Replica geriden geliyor. Sorun WAL üretiminde, gönderimde, aktarımda veya replay aşamasında mı? Salt okunur kontrollerle önce gecikmenin hangi aşamada biriktiğini bulun.

Gerekli Ön Koşullar & Güvenlik İlkeleri:
Salt okunur (read-only) izleme kullanıcısı (en az yetkili hesap)Primary ve Standby sunucu bağlantı bilgileriPostgreSQL sürümü (PG 14–18 uyumlu)Topoloji bilgisi (doğrudan standby mı, cascading mi?)
PostgreSQL Replication Lag: Darboğazı Adım Adım Teşhis Etme
PostgreSQL 14–18 Fiziksel Streaming Replikasyon ve Darboğaz Teşhis Mimarisi

▸Kısa Açıklama

Replica geriden geliyor. Sorun WAL üretiminde, gönderimde, aktarımda veya replay aşamasında mı? Salt okunur kontrollerle önce gecikmenin hangi aşamada biriktiğini bulun.

Replication lag tek başına kök neden değildir. Kullanıcıların eski veri görmesine, raporların güncelliğini kaybetmesine veya kurtarma hazırlığının zayıflamasına eşlik edebilen bir belirtidir. İlk adım rastgele parametre değiştirmek değil, topolojiyi ve gecikmenin yerini belirlemektir.

Bir replica’nın primary’ye bağlı olması, aldığı değişiklikleri aynı hızda uyguladığı anlamına gelmez. Benzer şekilde, bir izleme ekranında yüksek bir “lag seconds” değeri görmek de tek başına replikasyonun durduğunu kanıtlamaz.

Doğru teşhis için üç soruyu birbirinden ayırın:

  1. 1Bağlantı var mı? Beklenen standby, doğru upstream sunucuya bağlı mı?
  2. 2WAL ilerliyor mu? Gönderilen, yazılan, kalıcılaştırılan ve uygulanan konumlar ilerliyor mu?
  3. 3Hizmet etkileniyor mu? Replica’nın sunduğu veri, kullanım amacı için yeterince güncel mi?

Bu rehber PostgreSQL fiziksel streaming replication ve doğrudan primary–standby bağlantısına odaklanır. Logical replication ayrı değerlendirilmelidir. Cascading yapılarda her bağlantı ayrıca incelenmelidir.


▸Önce Kavramları Ayırın: Birikim, Gecikme ve Veri Güncelliği

“Replication lag” ifadesi farklı ölçümleri anlatmak için kullanılabilir:

KavramYanıtladığı soruTek başına söylemediği
WAL konum farkıİki aşama arasında kaç byte WAL var?Kaç transaction geride olunduğu veya ne zaman yetişileceği
write_lag, flush_lag, replay_lagYakın tarihli WAL’ın ilgili aşamaya ulaşması ve bunun primary’ye bildirilmesi ne kadar sürdü?Mevcut birikimin ne kadar sürede kapanacağı
Son replay edilen transaction’ın yaşıSon uygulanan transaction’ın primary üzerindeki zamanı ne kadar eski?Primary’de yeni transaction olup olmadığı
Uygulama veri güncelliğiKullanıcının ihtiyaç duyduğu değişiklik okuma yolunda görülebiliyor mu?Darboğazın hangi teknik aşamada olduğu

Bu ölçümler birbirinin alternatifi değil, tamamlayıcısıdır. Örneğin primary üzerinde yeni transaction oluşmuyorsa son replay zamanı eski kalabilir; replica buna rağmen mevcut WAL’ı tamamen uygulamış olabilir.


▸Önce Bağlamı Kaydedin

  • •PostgreSQL ve izleme aracı sürümü.
  • •Primary ile standby arasındaki bağlantı ve varsa ara replica.
  • •Senkron/asenkron yapı, kasıtlı geciktirme politikası.
  • •Replica’nın rolü: raporlama, okuma trafiği veya failover adayı.
  • •Sorunun başladığı zaman, bakım ve toplu yükleme gibi eşzamanlı değişiklikler.

Bu listeyi olayın başında doldurmak önemlidir. Aynı teknik bulgu farklı topolojilerde farklı anlama gelebilir. Raporlama için kasıtlı geciktirilmiş bir replica ile düşük veri eskiliği hedefleyen okuma replica’sı aynı eşikle değerlendirilmemelidir.

Sorgular salt okunurdur. İstatistik alanlarının görünürlüğü ve fonksiyon erişimleri rolünüze ve servis sağlayıcınıza bağlıdır. Yetkili DBA’nın belirlediği en az yetkili izleme hesabını kullanın; yalnızca sorgu çalıştırmak için superuser vermeyin. Örnekler PostgreSQL 18 dokümantasyonuna göre hazırlanmıştır.


▸Aşama 1 — Hangi Sunucudasınız?

Primary ve standby üzerinde ayrı ayrı çalıştırın:

sql
SELECT clock_timestamp() AS sampled_at, current_setting('server_version') AS server_version, pg_is_in_recovery() AS in_recovery;

Normal fiziksel standby üzerinde recovery durumu true olmalıdır. Beklenmeyen sonuçta önce rol veya topoloji değişikliğini kontrol edin.

Özellikle bağlantı havuzu, servis adresi veya failover sonrası güncellenen bir endpoint kullanıyorsanız sunucunun rolünü varsaymayın. “Replica adresine bağlandım” düşüncesi, sorgunun gerçekten standby üzerinde çalıştığının kanıtı değildir.

Bu aşamanın çıktısı: Ölçüm zamanı, PostgreSQL sürümü ve doğrulanmış sunucu rolü.


▸Aşama 2 — Primary Üzerindeki Bağlantıyı ve WAL Konumlarını Görün

Yalnızca primary üzerinde:

sql
SELECT clock_timestamp() AS sampled_at, application_name, state, sync_state, sent_lsn, write_lsn, flush_lsn, replay_lsn, pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS current_to_sent_bytes, pg_wal_lsn_diff(sent_lsn, write_lsn) AS sent_to_write_bytes, pg_wal_lsn_diff(write_lsn, flush_lsn) AS write_to_flush_bytes, pg_wal_lsn_diff(flush_lsn, replay_lsn) AS flush_to_replay_bytes, write_lag, flush_lag, replay_lag FROM pg_stat_replication;

LSN, WAL içindeki konumu ifade eder. Farklar byte cinsindedir; satır veya transaction sayısı değildir. Bu alanlar standby’dan bildirilen konumlara dayanır; anlık bir snapshot kesin kök neden kanıtı değildir. Lag süreleri de “replica kaç saniyede yetişir?” tahmini değildir. Boşta ve yetişmiş bir sistemde süre alanları NULL olabilir. NULL değerini otomatik olarak sıfır veya arıza diye sınıflandırmayın.

Önemli ayrıntı: pg_current_wal_lsn() primary’nin mevcut WAL write konumunu verir; WAL insert veya kalıcı depolamaya flush konumuyla aynı kavram değildir. Bu nedenle current_to_sent_bytes alanını, “üretilmiş bütün WAL’ın mutlak ve eksiksiz ölçüsü” olarak değil, sorguda seçilen write konumuyla gönderim konumu arasındaki fark olarak okuyun.

Ayrıca pg_stat_replication yalnızca doğrudan bağlı standby’ları gösterir. Primary üzerindeki sonuç kümesinde görünmeyen bir downstream replica, cascading topolojide bir ara standby’a bağlı olabilir.

Bulguları nasıl kullanmalısınız?

Tekrarlanan gözlemİnceleme yönü; kesin neden değildir
Beklenen replica satırı yokBağlantı, servis durumu, topoloji ve kimlik doğrulama
current_to_sent farkı büyüyorWAL üretim hızı, sender kapasitesi ve geri basınç
sent_to_write farkı büyüyorAğ yolu, receiver kapasitesi ve standby yazma performansı
write_to_flush farkı büyüyorStandby depolama gecikmesi
flush_to_replay farkı büyüyorReplay ilerlemesi, kaynak rekabeti ve recovery beklemeleri

Tek bir ölçüm yerine kısa bir zaman serisi alın. Üretim artışı ile tüketim yavaşlamasını aynı şey sanmayın. İstatistiklerin uzun bir transaction içindeki snapshot etkisini azaltmak için örnekleri ayrı autocommit sorguları olarak alın.

Zaman serisinde yalnızca farkın büyüklüğünü değil, yönünü de inceleyin:

  • •Fark büyüyor: İlgili aşama, gözlem aralığında gelen WAL’a yetişemiyor olabilir.
  • •Fark küçülüyor: Replica birikimi kapatıyor olabilir; henüz tamamen toparlanmış sayılmaz.
  • •Fark sabit: Sabit bir gecikme, dengelenmiş ama kabul edilmeyen bir birikim veya ilerlemeyen iki konum söz konusu olabilir. LSN’lerin kendisine de bakın.
  • •Satır kayboluyor: Değerin sıfıra indiğini değil, bağlantının veya gözlemin kaybolduğunu değerlendirin.

state alanındaki streaming değeri de tek başına “hiç gecikme yok” anlamına gelmez. Bağlantı durumu ile WAL açığını birlikte okuyun.


▸Aşama 3 — Standby Üzerindeki İlerlemeyi Kontrol Edin

Yalnızca standby üzerinde:

sql
SELECT clock_timestamp() AS sampled_at, pg_last_wal_receive_lsn() AS received_lsn, pg_last_wal_replay_lsn() AS replayed_lsn, pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS received_to_replayed_bytes, pg_is_wal_replay_paused() AS replay_paused, pg_last_xact_replay_timestamp() AS last_replayed_xact_at;

Son replay edilen transaction’ın zamanı, güncel replication lag ile aynı değildir: yeni transaction yoksa bu tarih eski kalabilir. Receive–replay farkı da kaynaktaki toplam açığı göstermez. Arşivden recovery gibi durumlarda ayrıca yorumlanmalıdır.

Replay paused görülürse duraklatmanın planlı olup olmadığını öğrenin; otomatik resume uygulamayın. Benzer şekilde kasıtlı geciktirilmiş replica’yı normal replica eşiğiyle değerlendirmeyin.

Duraklatma konusunda teknik ayrıntı: pg_is_wal_replay_paused() duraklatma isteği bulunup bulunmadığını bildirir. İsteğin gerçekten uygulanıp uygulanmadığını ayırmak gerektiğinde PostgreSQL’in belgelediği pg_get_wal_replay_pause_state() fonksiyonunun döndürdüğü durum incelenmelidir. Duraklatma isteği ile recovery’nin fiilen durmuş olması aynı anlama gelmez.

Bu sorgudaki received_lsn de genel bir ağ alım sayacı değildir: kullanılan fonksiyon, streaming replication yoluyla alınmış ve diske senkronize edilmiş son WAL konumunu döndürür. Streaming henüz başlamadıysa veya devre dışıysa NULL olabilir.

Primary ve standby ölçümleri aynı anda alınmadığından, iki taraftan gelen değerleri karşılaştırırken örnekleme zamanlarını kaydedin. Farklı anlara ait ölçümleri tek bir atomik görüntü gibi değerlendirmeyin.


▸Aşama 4 — Hipotezi İkinci Kanıtla Doğrulayın

  • •Ağ şüphesinde: paket kaybı, throughput ve bağlantı kesintilerini inceleyin.
  • •Depolama şüphesinde: standby disk gecikmesi, throughput ve boş alanı karşılaştırın.
  • •Replay şüphesinde: PostgreSQL logları, recovery çatışmaları ve eşzamanlı raporlama yükünü inceleyin.
  • •WAL üretim artışında: toplu yükleme ve uygulama değişikliklerinin zamanını karşılaştırın.
  • •Slot kullanılan yapılarda: retained WAL ve primary disk riskini ayrıca izleyin.

İkinci kanıtın amacı, ilk hipotezi yalnızca desteklemek değil, yanlış olabileceğini de sınamaktır.

İlk hipotezDestekleyebilecek ek gözlemKontrol edilmesi gereken alternatif
Ağ darboğazıAynı aralıkta aktarım sorunları ve bağlantı kesintileriStandby’ın WAL yazımına yetişememesi
Standby depolaması yavaşArtan disk gecikmesi ve flush birikimiKaynak rekabeti veya altyapı sınırı
Raporlama yükü replay’i etkiliyorRecovery çatışmaları, ilgili loglar ve yük değişimiDisk/CPU sorununun hem sorguları hem replay’i etkilemesi
Ani WAL üretimi kapasiteyi aştıYazma işiyle aynı zamanda başlayan birikimAynı anda replica kapasitesinin düşmesi

Bir raporlama sorgusunun uzun sürmesi, onun kesin olarak replay’i engellediğini göstermez. Kaynak rekabeti ile recovery çatışmasını ayrı değerlendirin. Benzer şekilde çatışma nedeniyle iptal edilen sorguların sayısı, bekleme süresinin doğrudan ölçüsü değildir.

Slot silme, WAL dosyası silme, oturum sonlandırma veya failover bu teşhis sorgularının doğal devamı değildir; her biri ayrı karar ve yetkilendirme gerektirir.


▸Örnek Yorum — Ölçülmüş Vaka Değildir

Birden fazla örnekte gönderim ve yazma farklarının küçük, flush–replay farkının büyüyen olduğunu varsayalım. Aynı anda standby disk gecikmesinin artması replay/depolama hattına odaklanmak için gerekçe oluşturur. Bu bulgu tek başına “sorun kesin disktir” sonucunu vermez.

İncelemeyi şu şekilde ilerletin:

  1. 1Ölçümlerin güncel olduğunu ve aynı replica’yı temsil ettiğini doğrulayın.
  2. 2Replay konumunun tamamen durmuş mu, yoksa yavaş ilerliyor mu olduğunu belirleyin.
  3. 3Planlı duraklatma ve kasıtlı geciktirme olasılığını dışlayın.
  4. 4Disk, CPU, raporlama yükü ve recovery loglarını aynı zaman aralığında karşılaştırın.
  5. 5Yetkili ve geri alınabilir bir müdahale yapılırsa öncesi/sonrası eğilimini kaydedin.

Müdahale sonrasında birikimin azalması, seçilen aksiyonun yararlı olduğunu gösterebilir. Ancak aynı anda bir toplu yüklemenin bitmesi gibi başka değişiklikler olduysa, bu sonuç tek başına kök nedenin doğrulandığı anlamına gelmez.


▸Sık Yapılan Teşhis Hataları

  • •Son transaction’ın yaşını gerçek lag kabul etmek: Boşta sistemlerde yanıltıcı olabilir.
  • •NULL değerleri sıfıra çevirmek: Bilinmeyen durumları sağlıklı gösterebilir.
  • •Yalnızca standby’daki receive–replay farkına bakmak: Standby’a henüz ulaşmamış WAL’ı görünmez bırakabilir.
  • •Bağlı replica sayısını beklenen replica sayısı sanmak: Kaybolan replica envanter olmadan fark edilmeyebilir.
  • •İlk çözüm olarak restart yapmak: Kanıt toplamadan müdahale etmeye ve gereksiz kesintiye yol açabilir.
  • •Replay açığını doğrudan veri kaybı saymak: Alınmış ve kalıcılaştırılmış ama henüz uygulanmamış WAL ile replica’ya hiç ulaşmamış WAL’ı karıştırır.

▸Teşhis Tamamlandığında Elinizde Ne Olmalı?

İyi bir teşhis kaydı yalnızca “lag vardı” demez. Şunları içerir:

  • •Etkilenen replica ve doğrulanmış rolü.
  • •Sorunun gözlendiği zaman aralığı.
  • •Birikimin oluştuğu düşünülen aşama.
  • •Bu hipotezi destekleyen ve zayıflatan kanıtlar.
  • •Primary ve standby üzerindeki hizmet/kapasite etkisi.
  • •Yapılan değişiklikler ve toparlanma gözlemleri.
  • •Doğrulanmış kök neden veya açık kalan inceleme maddesi.

▸Kaynaklar


▸Replikasyon Sağlığı Ortak Seri Bağlantıları

Topluluk Katkısı & Replikasyon Benchmark

Replikasyon Gecikmesi & Mimari Deneyiminizi Paylaşın

Altyapınızdaki gerçek PostgreSQL replikasyon topolojisini, karşılaştığınız darboğazları (WAL, ağ, disk, replay kilitleri) ve izleme yaklaşımlarını paylaşarak sektör benchmark'larına katkıda bulunun.

İlgili Karar Matrisleri ve Ekip Kılavuzları