pgBackRest ile yedekleme ve PITR
PostgreSQLSeviye: OrtaSüre: 45–90 dkpgBackRest ile tam / diferansiyel / artımlı yedek, sürekli WAL arşivi ve zamana göre geri dönüş (PITR). Tek sunucu, streaming replication (primary + standby'lar) ya da Patroni cluster'ı için; repo aynı sunucuda, ayrı bir yedek sunucusunda (SSH) ya da S3 uyumlu object storage'da olabilir. Şifreleme, sıkıştırma, saklama politikası, cron/systemd zamanlaması ve ayrı dizine test restore dahil; aynı rehber felaket anında yerinde restore runbook'u da üretir (Patroni'de cluster'ın yedekten yeniden kurulması dahil). Benzerlerinden farkı: üretim için önerilen fiziksel yedek aracıdır; ek araç kurmadan fiziksel yedek ve PITR için pg_basebackup + WAL arşivi rehberi, mantıksal yedek (tablo/veritabanı dökümü, sürümler arası taşıma) için pg_dump / pg_restore rehberi kullanılır.
Yapı: 1 sunucu, primary + standby'lar ya da Patroni cluster'ı; isteğe bağlı yedek sunucusu
Senaryolar
- pgBackRest kurulumu + ilk yedek + test restore — pgBackRest henüz yok: yazılım, repo, WAL arşivi, ilk yedek, zamanlama ve bir test restore.
- Felaket anı: yerinde restore (son duruma ya da zamana göre) — Veritabanını yerinde, yedekteki ve arşivdeki bir ana döndürün: son an, zaman, xid, LSN ya da restore point. Cluster kapanır; hedeften sonraki değişiklikler kaybolur.
- Veri dizininde bozuk ya da silinmiş dosya var (delta restore ile onar) — Sunucu sağlam ama bazı veri dosyaları okunamıyor ya da silinmiş: --delta yalnız farklı dosyaları yedekten yazar, arşivin son anına kadar ilerler. Cluster kapanır.
- Yalnız bir veritabanını geri getir (--db-include) — Cluster açık kalır: tek veritabanı geçici bir instance'a (ayrı dizin ve port) restore edilir, pg_dump ile alınıp canlı sunucuya yeni adla yüklenir. Silinen tek tablo için de bu kart (oradan pg_dump -t).
- Yedeği başka bir sunucuya geri yükle (klon / test / raporlama) — Canlı sunucuya dokunulmaz. Yedek yeni bir sunucuya açılır; WAL arşivi kapatılır, böylece klon canlı repo'ya yazmaz. Şifreli repo'da anahtar istenir.
- Sunucu tamamen kayboldu: yedeği yeni sunucuya aç ve yerine geçir — Disk ya da sunucu kaybı: yeni sunucu yedekten açılır ve yeni primary olur; WAL arşivi ve yedekler aynı stanza'da sürer. Eski sunucu kesinlikle kapalı kalmalı.
- Yedekten yeni bir standby kur (--type=standby) — Primary'ye kopya yükü bindirmeden yeni standby: dosyalar yedekten gelir, eksik WAL arşivden ve streaming ile tamamlanır. Primary açık kalır.
- Yedekler gerçekten sağlam mı? (info / check / verify ve restore tatbikatı) — Salt okunur kontroller ve canlı sunucuya dokunmayan, ayrı dizinde restore tatbikatı. Aylık doğrulama işi (cron) da kurulur.
- Saklama süresini değiştir ve eski yedekleri temizle (expire) — repo1-retention-full/diff ayarlarını değiştirir, önce --dry-run ile neyin silineceğini gösterir, sonra expire çalıştırır. Silinen yedek geri gelmez.
Başlamadan önce
- PostgreSQL … kurulu ve çalışıyor (pg-install rehberi)…; bu sunucu primary…. Veri dizini ….
- Patroni cluster'ı … çalışıyor (Patroni kurulumu): bir Leader, diğerleri streaming replica. Tüm node'larda veri dizini …, Patroni yapılandırması …, REST API parolası /etc/patroni/patroni.env dosyasında.
- Başka bir arşiv/yedek aracı (Barman, WAL-G, elle yazılmış archive_command) tanımlı değil; varsa önce kaldırın. İki araç aynı WAL'ı farklı yerlere taşırsa ikisi de eksik kalır.… Patroni'de mevcut değer patronictl show-config çıktısındadır.…
- Veritabanı boyutu biliniyor. Repo için kabaca (full sayısı + 1) × sıkıştırılmış boyut + WAL arşivi kadar yer gerekir (zst ile çoğu veritabanında 1/3–1/5 oranında sıkışır).
- Repo dizini … veritabanından ayrı bir diskte/NFS paylaşımında ve kalıcı bağlı (fstab).
- Yedek sunucusunda … için yeterli alanlı ayrı disk bağlı. Yedek sunucusu veritabanıyla aynı işletim sistemi ailesinde.
- Sunucular birbirinin adını çözüyor (…, …) ve aralarında 22/tcp (SSH) açık.
- Standby'lar (………, ……) primary'den WAL alan streaming standby ve primary ile aynı PGDATA yolunu (…) kullanıyor.
- Bucket … oluşturuldu; yalnız bu bucket'a okuma/yazma/silme yetkili bir erişim anahtarı (access key + secret key) hazır. Bucket'ta nesneleri silen lifecycle kuralı yok (saklamayı pgBackRest yönetir). Sunucu endpoint'e erişebiliyor.
- Saat senkron (NTP). PITR hedef zamanı ve S3 imzaları doğru saate bağlıdır.
- Sunucular PGDG ve EPEL repo'larına (ya da kurum içi mirror'a) erişebiliyor; pgBackRest'in bağımlılığı libssh2 EPEL'den gelir.
- Şifreleme anahtarının saklanacağı yer (parola kasası / vault) hazır. Anahtar sunucu dışında saklanmazsa sunucu kaybında yedekler açılamaz.
Rehberin aşamaları
- pgBackRest yazılımının kurulumu — PGDG repo'sunu ekle (yedek sunucusu) · PGDG repo'sunu ekle (yedek sunucusu) · EPEL repo'sunu etkinleştir · pgBackRest'i kur · pgbackrest kullanıcısını oluştur · Eski yapılandırma dosyasını kaldır
- Repo hazırlığı — Repo dizinini oluştur · Repo dizinini oluştur · SSH anahtarı üret (yedek sunucusu) · SSH anahtarı üret (veritabanı sunucuları) · Yedek sunucusunun anahtarını yetkilendir · Veritabanı sunucularının anahtarlarını yetkilendir …
- pgBackRest yapılandırması — Yapılandırma dosyasını yaz · Yapılandırma dosyasını yaz (yedek sunucusu) · Yapılandırma dosyasını yaz (veritabanı sunucuları) · S3 erişim anahtarlarını gir · Şifreleme anahtarını üret · Şifreleme anahtarını … sunucusuna yaz …
- Stanza ve ilk yedek — Stanza'yı oluştur · Stanza'yı oluştur · Yapılandırmayı doğrula (check) · İlk full yedeği al · İlk full yedeği al · Repo durumunu görüntüle (info) …
- Yedek zamanlaması — pgbackrest komutunun yolunu doğrula · Yedek betiğini yaz · Betiğin sahipliğini ve iznini ayarla · systemd service ve timer'larını oluştur · Zamanlamayı test et (elle tetikle) · cron servisini hazırla …
- Doğrulama ve geri dönüş testi — WAL arşivinin çalıştığını kontrol et · Test verisi yaz ve hedef zamanı kaydet · Test restore dizinini hazırla · Hedef zamana kadar ayrı dizine restore et · Test cluster'ını ayrı portta başlat · Geri dönen veriyi doğrula …
- İzleme ve bakım — Repo bütünlüğünü doğrula (verify) · Repo bütünlüğünü doğrula (verify) · Son yedeğin yaşını izle · Son yedeğin yaşını izle · İkinci kopya ve anahtar saklama
- Teşhis: bozuk ya da eksik dosya mı? — Logdaki hatayı ve etkilenen dosyayı bul · Bozuk nesneyi belirle · Sağlam bir yedek ve arşiv olduğunu doğrula
- Restore öncesi kontrol — Yedekleri listele · Uygulama bağlantılarını kontrol et · Standby'ları durdur · PostgreSQL'i durdur · Mevcut veri dizininin kopyasını al (yer varsa)
- Yerinde restore — Restore et (--delta) · PostgreSQL'i başlat ve recovery'nin bitmesini bekle · Hedefteki veriyi kontrol et (pause) · Recovery'yi bitir ve promote et
- Doğrulama — Restore ayarlarını temizle · Cluster'ın durumunu kontrol et · Uygulama verisini kontrol et · Bozulmanın giderildiğini doğrula (amcheck) · Arşivin devam ettiğini doğrula · Yeni bir full yedek al …
- Restore öncesi: Patroni cluster'ını durdur — Yedekleri listele · Cluster durumunu ve dinamik yapılandırmayı kaydet · Uygulamaları durdur · Replica'larda Patroni'yi durdur · Leader'da Patroni'yi durdur · Mevcut veri dizininin kopyasını al (yer varsa)
- Doğrulama ve temizlik (Patroni) — Arşivin devam ettiğini doğrula · Yeni bir full yedek al · Cluster'ı ve uygulama erişimini kontrol et · Kenara alınan veri dizinlerini sil
- Patroni: bozuk node'u yeniden kur (reinit) — Bozulmanın hangi node'da olduğunu bul · Bozuk node leader ise liderliği devret · Bozuk replica'yı yeniden kur (reinit)
- Yedek doğrulama ve restore tatbikatı — Yedeklerin durumu ve son yedeğin yaşı (info) · Arşivin şu an çalıştığını doğrula (check) · Repo bütünlüğünü doğrula (verify) · Tatbikat dizinini hazırla · Son yedeği tatbikat dizinine restore et · Tatbikat instance'ını başlat ve recovery'yi bekle …
- Aylık doğrulama zamanlaması — Aylık doğrulama betiğini yaz · Betiğin iznini ayarla ve cron ortamıyla dene · Aylık cron görevini yaz · cron dosyasının izinlerini ayarla
- Saklama politikasını değiştir — Mevcut saklama ayarı ve yedekler · Saklama ayarını değiştir · Neyin silineceğini göster (dry-run) · Eski yedekleri sil (expire) · Repo doluluğunu ve zamanlamayı kontrol et