DBAtlas · Veritabanı operasyon atlası

Replikasyon gecikmesi / durdu

Standby/replika primary'nin gerisinde kalıyor ya da replikasyon tamamen durdu. Bu ağaç, gecikmenin türünü (artıyor mu, sabit mi, durdu mu) adım adım daraltarak apply hatası, tek-thread darboğazı, recovery çakışması veya bozulma gibi kök nedene götürür.

Gecikme nasıl davranıyor?

Önce durumu ölç. Replika akışını ve gecikme metriğini gör: lag zamanla artıyor mu, sabit bir seviyede mi takılı, yoksa uygulama (apply) tamamen durmuş mu? Bu, aramayı üç ana kola ayırır.

SELECT client_addr, state, write_lag, flush_lag, replay_lag,
       pg_wal_lsn_diff(sent_lsn, replay_lsn) AS bytes_behind
FROM pg_stat_replication;
  • Apply tamamen durdu / hata var
  • Lag sürekli artıyor (yetişemiyor)
  • Lag sabit ama uzun sorgu şüphesi var
  • Çok geride / tutarsız görünüyor

Apply hatası ne diyor?

Replikasyon durduysa genelde uygulanan bir olayda hata vardır. Hata mesajına bak: hedefte olmayan bir satır/tablo mu, primary key çakışması mı, yoksa bağlantı/ağ kopması mı?

SHOW REPLICA STATUS\G  -- Last_Error, Last_SQL_Error, Replica_IO_Running, Replica_SQL_Running
  • Çakışan/eksik satır ya da tablo hatası
  • Ağ/bağlantı koptu, IO thread durdu

Neden yetişemiyor?

Lag sürekli büyüyorsa replika, primary'nin yazma hızına yetişemiyor demektir. Tek-thread apply mı darboğaz, yoksa replikanın diski/IO'su mu yavaş? Apply worker durumuna ve IO beklemesine bak.

SHOW REPLICA STATUS\G  -- Seconds_Behind_Source ve apply thread durumu
SELECT * FROM performance_schema.replication_applier_status_by_worker;
  • Tek-thread apply + ağır yazma yükü
  • Replikanın diski/IO'su yavaş

Standby'da uzun bir sorgu mu var?

Salt-okunur standby üzerinde çalışan uzun bir sorgu, apply'ı (recovery) bloklayabilir. PostgreSQL'de recovery conflict bu şekilde ortaya çıkar. Standby'daki aktif sorgulara ve çakışma sayaçlarına bak.

SELECT now()-query_start AS dur, pid, state, query
FROM pg_stat_activity WHERE state='active' ORDER BY query_start;
SELECT confl_snapshot, confl_lock, confl_bufferpin FROM pg_stat_database_conflicts WHERE datname=current_database();
  • Evet, uzun sorgu apply'ı blokluyor
  • Hayır, sorgu yok — yine de geride

Kök neden: Apply hatası (veri çakışması)

Replika, uygulayamadığı bir olayda takıldı: hedefte olmayan satır, primary key çakışması veya eksik tablo. Kör atlama yerine tutarsızlığın nedenini gider.

Kök neden: Bağlantı / ağ kopması

Alıcı (IO/receiver) thread primary'ye bağlanamıyor. Ağ, kimlik doğrulama veya biriken/temizlenen log segmentleri sorunlu olabilir.

Kök neden: Tek-thread apply darboğazı

Primary paralel yazarken replika değişiklikleri tek sırada uyguluyor ve yetişemiyor. Uygulamayı paralelleştir.

Kök neden: Replika IO darboğazı

Apply thread'i CPU değil diski bekliyor. Replikanın depolaması primary'nin yazma hızını karşılayamıyor.

Kök neden: Standby recovery çakışması

Standby'daki uzun salt-okunur sorgu, primary'den gelen değişikliğin uygulanmasını blokluyor (vacuum/lock çakışması). PostgreSQL bunu gecikme veya sorgu iptaliyle çözer.

Kök neden: Replika çok geride / bozuk — yeniden kur

Replika kurtarılamayacak kadar geride, gerekli log'lar silinmiş veya veri tutarsız. En güvenli yol taze yedekten yeniden kurmak.

DBAtlas'ta aç →