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
checkpoint record
” hatası alınır.
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.

Kategori seçin...