Bir önceki derste pg_basebackup ile backup alma ve restore işlemleri gördük, pg_basebackup ile backup almanın bazı kısıtıları mevcuttur, küçük veritabanları için, replika oluşturmak için kullanışlı bir backup komut seti aracıdır, ancak büyük production ortamlar ve yoğun işlem yapılan sistemler için yetersiz kalabilmekte, fark (incremental) backup ların alınması ihtiyaçları, alınan yedeklerden bazı veritabanlarının recover edilmesi vs. gibi ihtiyaçlar için yeterli olmamaktadır, işte bu gibi ihtiyaçlar için PGBackRest çözüm olabilmektedir.
PGBackRest , büyük olçekli veritabanlarının performanslı backuplarının alınabilmesi için açık kaynak kodlu bir yedekleme aracıdır. PgBackRest veritabanın çalıştığı sunucu üzerine kurulumu yapılarak çalıştırırlabildiği gibi, Oracle veritabanlarında olan Recovery Catalog mantığı ile çalışan uzak sunucu üzerinde kurulup çalıştırılarak backupları alınabilir, hatta uzak sunucu üzerinden tetiklenen backuplarda birden fazla PostgreSQL veritabanlarının backupları merkezileştirilebilir (Backup Katalog)
PgBackRest in temel ve faydalı bazı özelliklerini listelersek
- Lokal makineden veya uzak sunucu dan network üzerinden (ssh) ile yedekler alınabilir.
- PgBackRest yedek alırken veriyiyi sıkıştırır, yedekten dönerken sıkıştırılmış veriden geri döner bu sayede network üzerinden backup alınıyorsa ağ trafiğine az yük bindirir.
- Belirlenen sayı kadar veya belirtilen tarihten eski (retention count or time) yedekler ve archive WAL dosyaları otomatik siler.
- Parallel yedekleme ve Paralel geri yükleme (recovery) ile performanslı backup ve recovery işlemleri gerçekleştirir.
- Şifreli (Secure) yedekler alabilir.
- Page Checksum ile yedek bütünlüğünü sağlar.
- Alınan yedeklerin kataloğunu tutar, katalog bilgileri nelerdir;
- Yedek tipini (full, diff., incr.)
- Zaman bilgisini
- Boyut bilgisini
- Gerekli segment bilgileri
- PgBackRest ile Full Backup, Differential Backup ve Incremental Backup şeklinde backuplar alınabilir.
- Full Backup : Tüm cluster yedeğidir
- Differential Backup: Kendinden önceki son full backup tan yedekten sonraki tüm değişimlerin yedeği alınır
- Incremental Backup : Kendinden önceki son yedekten (Full,Diff veya Incr.) sonraki tüm değişimlerin yedeğini alır
- PGBackRest ile replikasyonlar üzerinden yedek alınabilir. pgBackRest, master ve replica ile bağlantılı bir backup sunucusu üzerinde yedekleme yapılmasına imkan verir. Sadece master üzerinden alabileceklerini master’dan alır, geri kalan diğer tüm yedekleme işlemini replica üzerinden yapar. Böylece, master sunucu üzerinde yük oluşturulmamış olur.
Kurulumu
PGBackRest RedHat Centos grubu için yum install pgbackrest şeklinde kurulabileceği gibi çalıştırılabilir binary dosyasından da kurulum yapılabilir.
Centos -RedHat için
# yum install pgbackrest |
Ubuntu Debian Grubu için;
# sudo apt install pgbackrest |
Repository üzerinden kurmak her zaman daha kolay ve tavsiye edilen dir, repository üzerinden kurulumlarda bağımlılıklar (depency) otomatik çözümlenecektir.
https://github.com/pgbackrest/pgbackrest/ github repository sinden doğrudan indirilip kurulumda yapılabilir.
Çalıştırılabilir dosyası ; /usr/bin/pgbackrest
tir ve Konfigürasyon (config) dosyası ise /etc/pgbackrest.conf
dosyalarıdır. Eğer uzak sunucu üzerine pgbackrest kurulumu yapılacak ve backup reposu olarak uzak sunucu kullanılacaksa , veritabanı makinası bu dosyalar kopyalanabilir (aynı sürüm olmalıdır).
postgres OS user ile pgbackrest dediğimizde komut opsyionları çıkacaktır.
$ pgbackrest |
Örnek olarak versiyonuna bakalım;
$ pgbackrest version |
Stanza Yapılandırma;
PGBackRest için herbir postgresql cluster yedeğine stanza adı verilir. Stanza PostgreSQL veritabanı cluster nerede bulunuyor, nasıl backup alınacak, archive opsiyonlarının ve diğer backup konfigürasyonlarının bütününü içerir. Yedeklenmesi gereken her bir Cluster için bir Stanza gerekmektedir. Stanza bilgileri konfigürasyon dosyası olan /etc/pgbackrest.conf
dosyasının içerisine girilmelidir.
Burada local veritabanı sunucu üzerinde oluşturulan bir pgbackrest için konfigürasyonları inceleyelim; /etc/pgbackrest.conf
dosyasını oluştururken, veritabanı sahibine okuma ayrıcalıkları verilmelidir.
PGBackRest yapılandırma dosyaları Windows INI kuralını izler. Bölümler köşeli parantez içindeki metinle gösterilir ve anahtar / değer çiftleri her bölümde bulunur. # İle başlayan satırlar yorum satırlarıdır
PgBackRest yapılandırma dosyalarının yüklenmesinin birden çok yolu vardır:
Dosyalar sanki büyük bir dosyaymış gibi birleştirilir, düzen önemli değildir, fakat bölümlere dayalı bir öncelik vardır.
Öncelik (en yukarıdan en aşağıya):
- [stanza:command]
- [stanza]
- [global:command]
- [global]
Lokal (veritabanı ile pgbackrest aynı instance üzerinde) bir pgbackrest için konfigürasyon örneği;
$ vi /etc/pgbackrest.conf |
Yukarıda stanza frk içeriği verilmiştir, stanza için istenen isim verilebilir.
- pg1-path : Cluster $PGDATA (Data) dizinini ifade eder
- pg1-port : Cluster Port bilgisini içerir
- repo1-path : Yedek alınacak dizini gösterir, öncesinde oluşturularak yetkileri verilmelidir. Birden fazla repo varsa repo2-repo-path, repo3-repo-path, … repoN-repo-path şeklinde ifade edilir.
- log-path: backup loglarının yazılacağı log dizinini gösterir, önceden oluşturularak yetkileri tanımlanmalıdır.
- log-level-file : Backup loglarının hangi detay seviyesinde yazılacağını belirtir.
- backup-user: Backupları hangi user ile alınacağını belirtir.
- archive-push: Arşivlenmesi için WAL dosyalarını postgresql.conf dosyasında belirttiğimiz dizine gönderir.
- archive-get : Arşivlenmiş WAL dosyalarını geri döndürür.
- retention-full : Alınan yedeklerin ne kadarının tutalacağını veya ne zamana kadar tutulacağını belirler. (archive dosyalarının silinme durumu da buna bağlıdır)
- retention-type Yedeğin retention durumunu bildiren retention-full parametresinin tipini belirler, time (süre) veya count (sayı) olabilir. Varsayılanı count.
- cipher-pass : Şifreleme anahtarıdır (Güvenli bir anahtar seçilmelidir) örnek olarak repo1-cipher-pass=zWaf6XtpjIVZC5444yXB+cgFDFl7MxGlgkZSao
- cipher-type : Şifreleme metodudur, repo1-cipher-type=aes-256-cbc gibi
PGBackRest için yüzlerce opsiyon ve parametre bulunmaktadır burada hepsini açılmama şansımız yok detaylar için aşağıdaki linkten tüm opsiyonlara ulaşabilirsiniz.
Tüm opsiyonlar için; https://pgbackrest.org/configuration.html
Tüm komutları için ; https://pgbackrest.org/command.html
Stanza oluşturmak
Stanza ne demek anlatıldı, bir stanza oluşturmak ve PGbackRest ile backup alabilmek için pg_basebackup
ta olan gereksinimler burada da geçerlidir, archive_mod
on olmalı , archive_command
PGBackRest e göre düzenlenmeli WAL parametreleri ayarlı olmalı (wal_level
replica veya logical olmalıdır).
alter system set archive_mode TO on; |
Stanza Oluşturulması
$ pgbackrest --stanza=frk --log-level-console=info stanza-create 2023-01-09 11:28:44.659 P00 INFO: stanza-create command begin 2.43: --exec-id=2286926-f6179081 --log-level-console=info --log-level-file=detail --log-path=/pgbackrest/backup/log --pg1-path=/postgres/14/data --pg1-port=5434 --pg1-socket-path=/tmp --repo1-path=/pgbackrest/backup --stanza=frk |
Stanza yı durdurmak istersek;
$ pgbackrest --stanza=frk --log-level-console=info stop |
Silmek için (DİKKAT Stanza silinirse frk stanzasının yedekleri de silinir)
$ pg_ctl stop |
PGBackRest Backup Alma
Üç tip backup alabiliriz;
- Full Backup : Tüm Cluster yedeği
- Differential Backup : Full Yedekten sonraki değişen kısımların yedeği
- Incremental Backup: Son yedekten sonra değişen kısımların yedeği.
Eğer herhangi bir yedek tipi belirtilmez ise alınacak yedek Full Backup tır, Differential veya Incremental backup ların alınabilmesi ve anlamlı da olabilmesi için ilk backup her zaman full backup olmalıdır.
- Backup
$ pgbackrest --stanza=frk backup --log-level-console=info |
- Differential Backup
$ pgbackrest --stanza=frk --type=diff backup --log-level-console=info |
- Incremental Backup
$ pgbackrest --stanza=frk --type=incr backup --log-level-console=info |
Veritabanınız çok büyükse her gün full backup almak yerine haftada bir full diğer günler incr backup alabilirsiniz , Örneğin Her Cumartesi 23:00 da full backup, diğer günler 23:00 da incr backup alan bir crontab girdisi aşağıdaki gibi olmalıdır.
23 00 * * 6 pgbackrest --type=full --stanza=frk backup23 |
Alınan Yedeklerden Geri Dönmek (Full Restore)
Cluster dizinindeki veritabanları zarar gördüğünde, cluster artık açılamaz duruma geldiğinde (corruption vb.) full restore yapmak gerekebilir. PGBackRest bizim için en güncel yedekten son ana döncektir.
Örnek; Mevcut veritabanı kapatarak DATA ve Tablespace alanlarını temizleyip bir full restore başlatalım
$ pgbackrest --stanza=frk restore --log-level-console=info |
PGBackRest İle Point In Time Recovery (PITR)
En son alınan full backup ile WAL dosyalarının bulunduğu bir zamana dönüş yapılabilir. Geri dönmek istenilen zama –type olarak LSN, transaction id veya recovery point cinsinden verilebilir.
Aşağıda Örnek bir Restore komutu mevcuttur;
$ pgbackrest --stanza=frk --delta --type=time "--target=2023-01-09 13:36:00.000000+00" --target-action=promote restore |
Buradaki parametrelerden –delta parametresi önemli bir parametredir, kullanıldığında $PGDATA veya tablespace alanlarını temizlememiz gerekmez , pgbackrest kendisi nelerin değişmesi gerektiğine kendi karar verecektir, zaman yönünden büyük veritabanları için oldukça kullanışlı olacaktır.
PGBackRest İle Tek Bir Veritabanını Restore Etmek;
Mevcut Veritabanlarını listeleyelim;
postgres=# \l |
Bu listeden my_app_db yi drop edisin;
postgres=# drop database my_app_db ; DROP DATABASE |
Mevcut pgbackrest içerisindeki kurtarılabilir veritabanlarını listeleyelim, bunu için önce backup larımızı listelemeliyiz sonrasında bu bu backup ID lerin içeriğini listelemeliyiz;
$ pgbackrest --stanza=frk info |
Full backup ID si 20230109-123306F bulduk içeriğine bakalım şimdi;
$ pgbackrest --stanza=frk --set=20230109-123306F info |
mevcut backup içerisinde my_app_db OID si 17648 olarak mevcut şimdi bu veritabanını pgbackrest ile kurtaralım, öncelikle Cluster kapatılır sonrasında pgbackrest restore işlemine geçilir;
$ pgbackrest --stanza=frk \ |
Cluster tekrar açalım ve veritabanlarını listeleyelim;
postgres=# \l |
my_app_db kurtarıldı. Tüm bu özelliklerine bakıldığında pg_basebackup
değil pgbackrest
kullanmak oldukça avantajlı olduğunu çok rahat söyleyebiliriz.
Oldukça uzun bir yazı oldu umarım faydalı olur.
Comments (2)
Minhosays:
Haziran 9, 2023 at 3:23 pmTeşekkürler. Elinize sağlık
PostgreSQL Veri Tabanı Yedeklemesi – Asiye Yigitsays:
Temmuz 29, 2024 at 9:24 am[…] POSTGRESQL YEDEKLEME VE KURTARMA -4 PGBACKREST […]