Press ESC to close

POSTGRESQL YEDEKLEME VE KURTARMA -4 PGBACKREST

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
pgBackRest 2.43 - General help

Usage:
    pgbackrest [options] [command]

Commands:
    annotate        Add or modify backup annotation.
    archive-get     Get a WAL segment from the archive.
    archive-push    Push a WAL segment to the archive.
    backup          Backup a database cluster.
    check           Check the configuration.
    expire          Expire backups that exceed retention.
    help            Get help.
    info            Retrieve information about backups.
    repo-get        Get a file from a repository.
    repo-ls         List files in a repository.
    restore         Restore a database cluster.
    server          pgBackRest server.
    server-ping     Ping pgBackRest server.
    stanza-create   Create the required stanza data.
    stanza-delete   Delete a stanza.
    stanza-upgrade  Upgrade a stanza.
    start           Allow pgBackRest processes to run.
    stop            Stop pgBackRest processes from running.
    verify          Verify contents of the repository.
    version         Get version.

Use 'pgbackrest help [command]' for more information.

Örnek olarak versiyonuna bakalım;

$ pgbackrest version
pgBackRest 2.43

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

[frk]
pg1-path=/postgres/14/data      #$PGDATA
pg1-port=5434                   # Database Port
pg1-socket-path=/tmp            #.s.PGSQL.5434 dosyasının konumu

[global]
repo1-path=/pgbackrest/backup      #Yedek dizini
log-path=/pgbackrest/backup/log     #yedekerlin loglanacağı dizin
log-level-file=detail               #Yedekleme log seviyes
backup-user=postgres                #yedekleri alacak user
retention-full=3                    #retention 
retention-type=count       #retention türü (yedek saklama şekli)
process-max=4              #Yedek paralellik seviyesi
start-fast=y               #Yedek öncesi checkpoint alınsın mı?

[global:archive-push]
compress-level=3

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-pathbackup 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;

alter system set archive_command = 'pgbackrest --stanza=frk archive-push %p';

$ pg_ctl restart

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
2023-01-09 11:28:45.265 P00   INFO: stanza-create for stanza 'frk' on repo1
2023-01-09 11:28:45.276 P00   INFO: stanza-create command end: completed successfully (617ms)

Stanza yı durdurmak istersek;

pgbackrest --stanza=frk --log-level-console=info stop

2023-01-09 12:10:01.260 P00   INFO: stop command begin 2.43: --exec-id=2288055-7ce3b48c --log-level-console=info --log-level-file=detail --log-path=/pgbackrest/backup/log --stanza=frk
2023-01-09 12:10:01.262 P00   INFO: stop command end: completed successfully (4ms)

Silmek için (DİKKAT Stanza silinirse frk stanzasının yedekleri de silinir)

$ pg_ctl stop

$ pgbackrest --stanza=frk --log-level-console=info stanza-delete

2023-01-09 12:15:25.138 P00   INFO: stanza-delete command begin 2.43: --exec-id=2288239-b7b397f7 --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
2023-01-09 12:15:25.139 P00   INFO: stanza-delete command end: completed successfully (2ms)

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
00 * * 0,1,2,3,4,5 pgbackrest --type=incr --stanza=frk backup

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

2023-01-09 12:53:06.581 P00   INFO: restore command begin 2.43: --exec-id=2289366-07454a66 --log-level-console=info --log-level-file=detail --log-path=/pgbackrest/backup/log --pg1-path=/postgres/14/data --process-max=4 --repo1-path=/pgbackrest/backup --stanza=frk
2023-01-09 12:53:06.595 P00   INFO: repo1: restore backup set 20230109-123306F_20230109-123403D, recovery will start at 2023-01-09 12:34:03
2023-01-09 12:53:09.245 P00   INFO: write updated /postgres/14/data/postgresql.auto.conf
2023-01-09 12:53:09.251 P00   INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
2023-01-09 12:53:09.251 P00   INFO: restore size = 84MB, file total = 1965
2023-01-09 12:53:09.252 P00   INFO: restore command end: completed successfully (2672ms)

$ pg_ctl start

waiting for server to start....2023-01-09 12:55:03.013 UTC [2289415] LOG:  pgaudit extension initialized
2023-01-09 12:55:03.033 UTC [2289415] LOG:  redirecting log output to logging collector process
2023-01-09 12:55:03.033 UTC [2289415] HINT:  Future log output will appear in directory "log".
 done
server started

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
                                        List of databases
   Name    |    Owner     | Encoding |   Collate   |    Ctype    |       Access privileges
-----------+--------------+----------+-------------+-------------+-------------------------------
 dvdrental | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 frkdb     | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres                 +
           |              |          |             |             | postgres=CTc/postgres        +
           |              |          |             |             | conn=c/postgres
 my_app_db | my_app1_user | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/my_app1_user             +
           |              |          |             |             | my_app1_user=CTc/my_app1_user
 postgres  | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres                  +
           |              |          |             |             | postgres=CTc/postgres
 template1 | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres                  +
           |              |          |             |             | postgres=CTc/postgres
(6 rows)

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
stanza: frk
    status: ok
    cipher: none

    db (current)
        wal archive min/max (14): 000000020000000000000024/00000005000000000000002A

        full backup: 20230109-123306F
            timestamp start/stop: 2023-01-09 12:33:06 / 2023-01-09 12:33:12
            wal start/stop: 000000020000000000000026 / 000000020000000000000026
            database size: 84MB, database backup size: 84MB
            repo1: backup set size: 10.8MB, backup size: 10.8MB

        diff backup: 20230109-123306F_20230109-123403D
            timestamp start/stop: 2023-01-09 12:34:03 / 2023-01-09 12:34:05
            wal start/stop: 000000020000000000000028 / 000000020000000000000028
            database size: 84MB, database backup size: 124.7KB
            repo1: backup set size: 10.8MB, backup size: 9.3KB
            backup reference list: 20230109-123306F

Full backup ID si 20230109-123306F bulduk içeriğine bakalım şimdi;

$ pgbackrest --stanza=frk  --set=20230109-123306F info
stanza: frk
    status: ok
    cipher: none

    db (current)
        wal archive min/max (14): 000000020000000000000024/00000005000000000000002A

        full backup: 20230109-123306F
            timestamp start/stop: 2023-01-09 12:33:06 / 2023-01-09 12:33:12
            wal start/stop: 000000020000000000000026 / 000000020000000000000026
            lsn start/stop: 0/26000028 / 0/26000138
            database size: 84MB, database backup size: 84MB
            repo1: backup set size: 10.8MB, backup size: 10.8MB
            database list: dvdrental (19037), frkdb (17645), my_app_db (17648), postgres (14696)
            tablespaces:
                tbs_emp (16397) => /postgres/14/tablespaces

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 \
> --delta \
> --db-include=my_app_db \
> --type=immediate \
> --target-action=promote \
> restore

Cluster tekrar açalım ve veritabanlarını listeleyelim;

postgres=# \l
                                        List of databases
   Name    |    Owner     | Encoding |   Collate   |    Ctype    |       Access privileges
-----------+--------------+----------+-------------+-------------+-------------------------------
 dvdrental | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 frkdb     | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres                 +
           |              |          |             |             | postgres=CTc/postgres        +
           |              |          |             |             | conn=c/postgres
 my_app_db | my_app1_user | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/my_app1_user             +
           |              |          |             |             | my_app1_user=CTc/my_app1_user
 postgres  | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres                  +
           |              |          |             |             | postgres=CTc/postgres
 template1 | postgres     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres                  +
           |              |          |             |             | postgres=CTc/postgres

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)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir