PGBackRest

Pgbackrest, büyük ölçekli ve ağır yük altındaki veritabanlarında performanslı
çalışabilmesi için algoritmalarla desteklenmiş, kullanımı kolay açık kaynak kodlu (MT
lisanslı) postgresql yedekleme aracıdır. (postgresql 9 ve üzeri ile uyumludur.)
Pgbackrest’i veritabanı sunucusunun lokaline kurup yedek alınabileceği gibi network
üzerindeki yedekleme sunucusuna kurularak da yedek alınabilir. Böylece ortamda fazla
sayıda postgres veritabanı sunucusu varsa yedek işlemleri merkezileştirilmiş olur.
Özellikleri ;
- Programlama dili perl & C,
- Lokal veya SSH ile network üzerindeki sunucuların yedeğini alabilir, Çoklu
depolama (repository) - Full/differential/incremantal yedek alabilir,
- Belirlenen tarihten eski yedek ve arşiv WAL dosyalarını silebilir,
- Paralel yedekleme ve geri yükleme (tek bir veritabanını geri yükleyebilme)
- Parallel, async WAL push&get
- Tablespace link,
- Amazon S3, Azure, GCS
- Şifreli yedekleme
- Delta restore
- Streaming Compression & Checksums
- Page Checksums, Yedek bütünlüğü (integrity)
Kurulum
# Seçenek 1 apt ile hazır paketten kurulum. sudo apt install pgbackrest # Seçenek 2, kaynak koddan kurulum. mkdir pgbr_setup wget https://github.com/pgbackrest/pgbackrest/archive/ release/2.40.tar.gz tar -xvf 2.40.tar.gz -C pgbr_setup/ # Kaynak koddan kurulum için gerekli paketler kurulur sudo apt-get install make gcc libpq-dev libssl-dev libxml2-dev pkg-config \ liblz4-dev libzstd-dev libbz2-dev libz-dev libyaml-dev cd pgbr_setup/pgbackrest-release-2.40/src ./configure make # oluşturulan pgbackrest çalıştırılabilir (executable) dosya /usr/bin’ e kopyalanır. sudo cp pgbackrest /usr/bin/ sudo chmod 755 /usr/bin/pgbackrest sudo apt install postgresql-client # Veritabanı sunucusuna kuruluyorsa gerekli değil. sudo apt install libxml2
pgbackrest, çalıştırılabilir bir adet binary dosyadan oluşur.
apt ile hazır paketten kurulum yapıldığında, işletim sisteminin repositorisinden bu
çalıştırılabilir dosyayı /usr/bin klasörüne kopyalar ve /etc/pgbackrest.conf
dosyasını oluşturur.
O an repositorideki mevcut sürümü kopyalar. Eski versiyon da olabilir. Güncel versiyon
kurulmak istenirse seçenek 2’deki gibi kaynak koddan kurulum yapmalıdır.
Burada dikkat edilmesi gereken, kurulum için birçok paket gerekiyor. Bunları canlı
ortama kurmak yerine pgbackrest’i başka bir makinede kurup, pgbackrest çalıştırılabilir
dosyasının canlı ortama kopyalanması önerilir. (İşletim sistemi sürümlerine dikkat
edilmelidir.)
sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown postgres:postgres /var/log/pgbackrest sudo mkdir -p /etc/pgbackrest sudo touch /etc/pgbackrest/pgbackrest.conf sudo chmod 640 /etc/pgbackrest/pgbackrest.conf sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf postgres@srv1:~$ pgbackrest pgBackRest 2.40 - General help Usage: pgbackrest [options] [command]
Dizinler ve konfig dosyaları oluşturulup haklar verilir.
Örnek Konfigurasyon
vim /etc/pgbackrest/pgbackrest.conf [mx] pg1-path=/pg/data/mx # $PGDATA pg1-port=5434 # Veritabanının çalıştığı port. pg1-socket-path=/tmp # .s.PGSQL.5434 bulunduğu dizin. [global] # Yedeğin alınacağı dizin,Öncesinde oluşturulmalı. repo-path=/RA/pgbackrest/mx backup-user=postgres retention-full=3 retention-type=count process-max=16 # CPU Core sayısına göre ayarlanmalı. log-path=/RA/pgbackrest/mx/log # Dizin öncesinde oluşturulmalı. log-level-file=detail start-fast=y # Fast checkpoint [global:archive-push] compress-level=3
Lokal yani veritabanı sunucusu üzerine kurulan, pgbackrest örnek konfigurasyonu.
(Veritabanı ile pgbackrest aynı sunucu üzerinden çalışıyor.)
Stanza, bir postgresql cluster’ı için oluşturulmuş ayarlar bütünüdür.
Backup politikaları, arşivleme, şifreleme yöntemleri, yedek repositorileri (backupların
ve arşiv logların alınacağı yer) gibi ayarları içerir.
Çoğu veritabanı sunucusunda tek veritabanı ve tek stanza mevcuttur.
Backup sunucularında ise her bir postgres cluster‘ı için bir adet stanza bulunur.
Yukarıda stanza mx’in detayları verilmiştir.
Stanza için istenen isim verilebilir. archive_command‘ daki stanza ile aynı olmalı.
Birden fazla repo varsa parametrelerin önünde repo1- … , repoN-…. şeklinde belirtilir.
Örnek repo1-path .

Arşivlenmiş WAL dosyaları, retention-full değerlerine göre silinen full backup’larla
birlikte otomatik silinir.
Archive, network ve file seviyelerinde sıkıştırma seçenekleri vardır. Detaylı bilgi için
resmi sitesine bakılabilir (pgbackrest.org/command.html).
Stanza oluşturma
alter system set archive_mode = 'on' ; alter system set archive_command = 'pgbackrest –-stanza=mx archive-push %p' ; alter system set max_wal_senders = 3 pg_ctl -o '--config-file=/pg/data/13.6/postgresql.conf' -D /pg/data/13.6/ restart # Stanza oluşutulması pgbackrest --stanza=mx --log-level-console=info stanza-create # Konfigurasyon kontrol pgbackrest --stanza=mx --log-level-console=info check pgbackrest --stanza=mx info # Yedek tutarlılık kontrolü pgbackrest --stanza=mx --log-level-console=info --verbose verify
pgbackrest.conf, archive_command ve stanza oluşturulurken aynı
stanza ismi kullanılmalıdır (Örnekte “mx” kullanılmıştır).
Not: Instance çalışmıyorsa ya da socket’i varsaydığı dizin yanlıştır.
“/…./.s.PGSQL.5434” failed: No such file or directory
Stanza silme
pg_ctl -o '--config-file=/pg/data/13.6/postgresql.conf' -D /pg/data/13.6/ stop pgbackrest --stanza=mx --log-level-console=info stop pgbackrest --stanza=mx --log-level-console=info stanza-delete
Not: stanza mx’in tüm yedeklerini de siler.
Backup
# Backup postgres pgbackrest --stanza=mx --log-level-console=info backup # Differential backup pgbackrest --stanza=mx --type=diff --log-level-console=info backup # Incremental backup pgbackrest --stanza=mx --type=incr --log-level-console=info backup
Full Backup : Tüm cluster’ın yedeğini alır. İlk backup her zaman full’dur
(-type=full).
Differential Backup : Full backup sonrasındaki değişiklikleri alır.
Incremental Backup : Kendisinden önce alınan backup’lardan (inc,diff)
sonraki değişiklikleri alır.
Backup tipi verilmezse default olarak full backup alır. Tip belirtilerek differential ya da
incremantal backup alınabilir.
Her gece 01:15 otomatik yedek aldırmak için crontab’a aşağıdaki satır eklenebilir.15 01 * * * pgbackrest --type=full --stanza=mx backup
Not: Aynı parametreler manuel çalıştırılabiliyor ama crontab’ta çalışmıyorsa pgbackrest
ve postgres bin klasörlerinin $PATH’te tanımlandığı bir script yazılıp ve crontab’a
eklenerek çözülebilir.
Full Restore (Tam geri yükleme)
pkill -9 postgres pgbackrest --stanza=mx start pgbackrest --stanza=mx --log-level-console=info restore pg_ctl -o '--config-file=/pg/data/13.6/postgresql.conf' -D /pg/data/13.6/ start
Full Restore : Cluster dizinindeki bir veya bir çok veritabanı dosyasının
silindiğini ya da zarar gördüğü durumlarda, full restore yani tam geri yükleme yapmak
gerekir.
En güncel yedekten geri yükleme yapıp mevcut WAL dosyalarını işler ve son noktaya
geri yükleme yapılmış olur.
Cluster klasörü ve farklı klasörlerdeki tablespace verilerinin silinmesi gerekir.
Restore, otomatik olarak en güncel yedeği seçer ve restore eder. Ayrıca yedek
belirtmeye gerek yoktur. Eğer birden fazla repository varsa sıra ile repo1 , repo2 kontrol
ederek ilerler.
Not: pgbackrest start komutu verilmezse
“invalid primary checkpoint record could not locate a valid” hatası alınır.
checkpoint record
Bu durumda cluster dizini ve default path’ten başka lokasyonlarda olan tablespace
dizinlerinin içerisi de boş olmalı.
Belirli Bir Ana/Noktaya Dönme / geri yükleme (Point-in Recovery)
pgbackrest --stanza=mx \ --delta \ --type=time “--target=2022-08-24 11:53:00.000000+00” \ --log-level-console=detail \ --target-action=promote restore pg_ctl -o ‘--config-file=/pg/data/13.6/postgresql.conf’ -D /pg/ data/13.6/ start mv /pg/data/13.6/recovery.signal /tmp pg_ctl -o ‘--config-file=/pg/data/13.6/postgresql.conf’ -D /pg/ data/13.6/ start
Point-in Recovery : Full backup ile WAL dosyalarının bulunduğu bir aralığa dönüş
yapılabilir. Geri dönülecek nokta zaman, LSN (-type=lsn), transaction
id ve recovery point cinsinden belirlenebilir.
Restore komut ile postgresql.auto.conf dosyasına aşağıdaki satırlar eklenir.
Recovery.signal dosyası silinmez ise her seferinde geri yükleme (restore/
recover) işlemini yeniden yapmaya çalışır.
restore_command = ’pgbackrest --stanza=mx archive-get %f "%p" ’’
recovery_target_time = '2022-08-24 14:53:00.000000+00'
recovery_target_action = promote'
GMT’ye dikkat etmek gerekiyor. Türkiye GMT+3 olduğu için örnekte 14:53 ‘ye geri
yükleme yapacaktır.
delta özelliği sayesinde, cluster dizini boş olmasa da restore edilebilir. Hangi dosyaların
restore hangi dosyaların silinmesi gerektiğine otomatik olarak karar verip işlemi
gerçekleştirir. Büyük veritabanlarında zaman tasarrufu sağlar.
Belirli Bir Veritabanını Geri Yükleme
# Veritabanı listesini görmek için pgbackrest --stanza=mx --set=20220824-083022F info pg_ctl -o '--config-file=/pg/data/13.6/postgresql.conf' -D /pg/data/13.6/ stop pgbackrest --stanza=mx \ --delta \ --db-include=testdb \ --type=immediate \ --target-action=promote \ restore pg_ctl -o ‘--config-file=/pg/data/13.6/postgresql.conf’ -D /pg/data/13.6/ start mv /pg/data/13.6/recovery.signal /tmp
Cluster’ ın tamamı yerine sadece istenen veritabanının geri yüklenebilmesi performans
artırır ve disk israfını engeller.
