Checkpointer işlemi WAL (write-ahead logging) günlüklerini silemediğinde bu günlükler birikir. Bu durum genellikle bir çoğaltma yuvasının (replication slot) günlükleri tutmasından, WAL ile ilgili parametrelerin çok yüksek ayarlanmasından veya yazma işlemlerinin temizleme sürecini aşırı yüklemesinden kaynaklanır. Bu konu, hem ana veritabanında hem de salt okunur örneklerde WAL günlüğü birikiminin nasıl teşhis edileceğini ve çözüleceğini ele almaktadır.
Arka plan bilgileri
WAL, veri güvenliğini sağlamak ve sistem güvenilirliği ile performansı artırmak için PostgreSQL'in temel bir bileşenidir. WAL, birden fazla arıza meydana gelse bile veri kaybını önlemeye ve verilerin güvenilir bir şekilde geri yüklenmesine yardımcı olur.
Ana veritabanında WAL günlüğü birikimi
Etkin olmayan çoğaltma yuvaları veya bildirilmeyen LSN
Çoğaltma yuvası (replication slot), PostgreSQL'de yüksek kullanılabilirlik ve olağanüstü durum kurtarma uygulamak için kullanılan önemli bir araçtır. Çoğaltma yuvası, tüketici WAL günlüklerini işleyene kadar PostgreSQL'in bu günlükleri silmemesini sağlar. Bir yuva etkinliğini yitirirse — örneğin tüketici log sequence number (LSN) bildirimini durdurursa — o yuvaya bağlı WAL günlükleri süresiz olarak birikir.
Adım 1: WAL silme işlemini engelleyen yuvaları belirleyin.
Her yuva tarafından ne kadar WAL'ın tutulduğunu kontrol etmek için pg_replication_slots sistem görünümünde aşağıdaki sorguyu çalıştırın:
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size
FROM pg_replication_slots;
Bir yuva için delay_size değeri büyükse veya gözlemlediğiniz toplam WAL birikimiyle eşleşiyorsa, bu yuva silme işlemini muhtemelen engelliyordur.
Adım 2: Etkin olmayan yuvayı silin.
Yuvanın iş gereksinimlerinize göre hâlâ gerekli olup olmadığını değerlendirin ve gerekmiyorsa yuvayı silin:
SELECT pg_drop_replication_slot('<slot_name>');
Bir çoğaltma yuvasını silmek, yuvayı kalıcı olarak kaldırır. Yuva gerçekten etkin değilse ve aşağı akışta herhangi bir tüketici yoksa silme işlemini gerçekleştirin.
Adım 3: Kaldırma işlemini doğrulayın.
Yuvanın kaldırıldığını doğrulamak için 1. adımdaki tanımlama sorgusunu yeniden çalıştırın.
Çoğaltma yuvalarının yönetimi hakkında daha fazla bilgi için bkz. WAL günlüğü yönetimi özelliğini kullanma.
Hatalı parametre ayarları
wal_keep_segments (PostgreSQL 12 ve önceki sürümler), wal_keep_size veya max_wal_size parametreleri çok yüksek ayarlandığında PostgreSQL gerekli olandan çok daha fazla WAL saklar. Mevcut değerleri gözden geçirin ve bunları gerçek çoğaltma ve kurtarma ihtiyaçlarınıza uygun olacak şekilde düşürün.
WAL ile ilgili parametrelerin mevcut değerlerini kontrol etmek için aşağıdaki SQL ifadesini çalıştırın:
select * from pg_settings where name like '%wal%';
wal_keep_size parametresi, pg_wal dizininde tutulan WAL günlüklerinin minimum boyutunu kontrol eder. Bu parametreyi en fazla 1.024 MB olarak ayarlayın. Bu parametreyi RDS konsolundaki parametre ayarları sayfasından değiştirebilir veya ModifyParameter API işlemini çağırarak güncelleyebilirsiniz.
max_wal_size parametresi, sistem tarafından örnek teknik özelliklerine göre LEAST(GREATEST(DBInstanceClassMemory/2097152,2048),16384) formülü kullanılarak dinamik olarak hesaplanır. Bu parametreyi manuel olarak ayarlamanız gerekmez.
PostgreSQL 13 ve sonraki sürümlerde wal_keep_size parametresi wal_keep_segments parametresinin yerini alır. PostgreSQL 9.5 ve sonraki sürümlerde max_wal_size parametresi checkpoint_segments parametresinin yerini alır. PostgreSQL 14 ve sonraki sürümleri çalıştıran RDS örnekleri yalnızca yeni parametreleri destekler.
Anormal yedekleme ilkeleri
Çekirdek, yedekleme tamamlandıktan sonra bir checkpoint işlemi sırasında WAL günlüklerini otomatik olarak temizler. Yedekleme ilkesi yanlış yapılandırılırsa veya yedekleme bileşeni başarısız olursa WAL günlükleri yedeklenemez ve birikir.
RDS konsolunda oturum açın, örnek ayrıntıları sayfasına gidin ve Backup and Restoration > Backup Policy seçeneğini seçin. Günlük yedeklemenin etkin olup olmadığını kontrol edin ve saklama süresini doğrulayın. Günlük yedekleme Never Clear olarak ayarlanırsa WAL günlükleri süresiz olarak saklanır; bu beklenen bir davranıştır.
DBS konsolu üzerinde oturum açın ve yedekleme görevi durumunu ile yükleme ilerlemesini incelemek için yedekleme zamanlaması listesini kontrol edin. Anormal bir yedekleme görevi veya yükleme gecikmesi yerel WAL birikimine neden olabilir. Görev hatalarını gidermek için DBS konsolunda yedekleme zamanlaması ayrıntılarını görüntüleyebilirsiniz.
VACUUM fırtınası ve yüksek yazma hacmi
VACUUM fırtınası — aynı anda çalışan birçok otomatik veya manuel VACUUM işlemi — kısa sürede büyük miktarda WAL günlüğü oluşturur. Bu durum G/Ç yükünü artırabilir ve WAL temizlemesini geciktirebilir. Etkiyi azaltmak için VACUUM parametrelerini ayarlayın ve VACUUM yürütmesini zamanlayarak yükü zamana yaydırın.
Yüksek yazma aktarım hızı da benzer bir etki yaratır. Mümkün olduğunca toplu yazma işlemlerini yoğun olmayan saatlerde planlayın.
Salt okunur örneklerde WAL günlüğü birikimi
Çoğaltma gecikmesi
Salt okunur bir örnekte yeniden oynatma geride kaldığında WAL günlükleri birikir. İki yaygın neden şunlardır:
Yeniden oynatmayı engelleyen uzun süreli işlemler. Salt okunur örnekteki uzun süreli bir işlem, WAL günlüğü yeniden oynatmasıyla çakışabilir. hot_standby_feedback ve max_standby_streaming_delay ayarlarını gözden geçirin. Örneğin,
hot_standby_feedbackparametresioffkonumundaykenmax_standby_streaming_delayparametresi yüksek bir değere ayarlanmışsa salt okunur örnekteki uzun süreli sorgular yeniden oynatmayı önemli ölçüde geciktirebilir.Yetersiz salt okunur örnek teknik özellikleri. Salt okunur örneğin hesaplama veya depolama teknik özellikleri ana veritabanından daha düşükse çoğaltma akışına yetişemeyebilir. Yeniden oynatılmayan WAL günlükleri silinemez. İş gereksinimlerinize göre salt okunur veritabanı için uygun teknik özellikleri değerlendirin ve seçin.
Sonraki adımlar
Bu adımları tamamladıktan sonra WAL günlüğü birikimi devam ederse ApsaraDB RDS for PostgreSQL teknik destek ekibiyle iletişime geçin.
Başvurular
AliPG'nin WAL günlüklerini otomatik olarak silmesine olanak tanımak için etkin olmayan çoğaltma yuvalarını manuel olarak silebilirsiniz. Daha fazla bilgi için bkz. WAL günlüğü yönetimi özelliğini kullanma.