PGBackRest Backup Server

(Yedekleme Sunucusu-Dedicated Repository Host)


Dedike bir pgbackrest backup server ile backup yönetimi tek bir noktadan yönetilebilir.
Backup ve arşivlenmiş WAL dosyaları başka bir sunucuda olacağı için veritabanı
sunucusundaki sorunlardan daha az etkilenecektir.
Veritabanı boyutları, network hızı, işlemci kapasitesi, veritabanlarının yoğun olduğu
zaman dilimleri göz önünde bulundurularak planlama yapılmalıdır.

Kurulum

ROLEHOSTNAMEIPDB
PGBackRest Backup Serverpgbr192.168.56.60-
Database Serversrvr1192.168.56.61mxdb
Database Serversrvr2192.168.56.62dmdb
pgbr makinesi dedike yedek sunucu rolünde olacak ve sadece yedekleme işlemlerini
gerçekleştirecek. Üzerinde veritabanı koşmayacak.
srv1, mxdb’nin koştuğu veritabanı sunucusu.
srv2, dmdb’nin koştuğu başka bir veritabanı sunucusu.

Her 3 makinenin ;

  • /etc/hosts dosyasına aşağıdaki satırlar girilir.
192.168.56.60       pgbr
192.168.56.61       srv1
192.168.56.62       srv2

  • /etc/sudoers dosyasına aşağıdaki satırlar girilir.
postgres          ALL=(ALL)            NOPASSWD:ALL

Not: sudo hakkı her şirketin BT güvenlik politikalarına uymayabilir. Kurulumlardan
sonra geri alınabilir.

ADIM 1

pgbr makinesinde

root@pgbr:~# apt install postgresql-client libxml2
root@pgbr:~# useradd postgres
root@pgbr:~# mkdir /home/postgres
root@pgbr:~# chown -R postgres:postgres /home/postgres
root@pgbr:~# su - postgres
postgres@pgbr:~$ pwd
/home/postgres
postgres@pgbr:~$ cp /etc/skel/.* .

Bu sunucuya, önceki sayfalarda anlatılan pgbackrest kurulum adımları izlenerek
pgbackrest kurulumu yapılır.
pgbr makinesinde postgresql server kurulu olmadığı için postgresql client
paketi de kurulur.
Backup işlemlerini postgres kullanıcısı ile yapacağımız için pgbr makinesinde postgres
kullanıcısı oluşturulur.

ADIM 2

# 3 makinede de postgres kullanıcısı ile
# Sorulan sorular enterla geçilir. Herhangi bir şey girilmez.
ssh-keygen -t rsa

# pgbr makinesinde
ssh-copy-id srv1
ssh-copy-id srv2

# srv1 makinesinde
ssh-copy-id pgbr

# srv2 makinesinde
ssh-copy-id pgbr

postgres kullanıcısı ile pgbr ile veritabanı sunucuları arasında ssh üzerinden şifresiz
erişim ayarları yapıldıktan sonra bağlantı tek tek test edilmelidir.

ADIM 3

# srv1 ve srv2 makinelerinde
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

# pgbr makinesinde
sudo scp /usr/bin/pgbackrest srv1:/usr/bin/
sudo scp /usr/bin/pgbackrest srv2:/usr/bin/

srv1 ve srv2 veritabanı sunucularında postgres kullanıcısı ile
pgbackrest version
çalıştırılarak kontrol edilmelidir.
Not: Dedike pgbackrest sunucu ile veritabanı sunucularında aynı versiyon
pgbackrest kurulu olmalıdır.

ADIM 4 (Disk ekleme- pgbr makinesinde)

postgres@pgbr:~$ sudo pvcreate /dev/sdb
postgres@pgbr:~$ sudo pvdisplay
postgres@pgbr:~$ sudo vgcreate ra /dev/sdb
# Tüm disk alanını kullanmak için
postgres@pgbr:~$ sudo lvcreate -l 100%FREE -n RA-LV ra
postgres@pgbr:~$ sudo lvdisplay /dev/ra/RA-LV
postgres@pgbr:~$ sudo mkfs.xfs /dev/ra/RA-LV
postgres@pgbr:~$ sudo mount /dev/ra/RA-LV /RA
postgres@pgbr:~$ df -h # ile kontrol edilir.

# Restarttan sonra otomatik olarak diskin /RA’ ya mount
olabilmesi için

# fstab dosyasına aşağıdaki satır eklenir.
sudo vim /etc/fstab
/dev/ra/RA-LV /RA xfs nofail,defaults 0 0
postgres@pgbr:~$ sudo umount /RA
postgres@pgbr:~$ sudo mount -a # test edilmeli
postgres@pgbr:~$ sudo mkdir -p /RA/pgbackrest
postgres@pgbr:~$ sudo chown -R postgres:postgres /RA/

pgbr makinesinde işletim sistemi /dev/sda diskinde yer almaktadır. Yedekler için
ikinci bir disk takılır/verilir. fdisk -l ile kontrol edilerek yeni diskin ID’si öğrenilir.
Burada yapılan örnekte 2. disk /dev/sdb olarak görülmektedir.

ADIM 5 (pgbr’ da pgbackrest ayarları)

[global]
repo1-path=/RA/pgbackrest
repo1-retention-full=2
process-max=4
log-level-console=info
start-fast=y
[global:archive-push]
compress-level=3

[mx]
pg1-path=/pg/data/13.6
pg1-host=srv1
pg1-host-user=postgres

[dm]
pg1-path=/var/lib/postgresql/13/main
pg1-host=srv2
pg1-host-user=postgres

Önceki bölümlerde anlatıldığı üzere srv1 postgresql veritabanı sunucusuna kaynak
kodlardan PGDATA=/pg/data/13.6 dizinine kurulum yapılmıştı.

srv2 veritabanı sunucusuna ise apt ile hazır paketlerde kurulum yapıldı. Bu yüzden
PGDATA=/var/lib/postgresql/13/main dizinlerine default olarak
kurulmuştur.

ADIM 6 (srv1’de pgbackrest ayarları)

vim /etc/pgbackrest/pgbackrest.conf #aşağıdaki satırlar eklenir
[mx]
pg1-path=/pg/data/13.6
pg1-port=5434
pg1-socket-path=/tmp

[global]
repo1-host=pgbr
repo1-host-user=postgres
process-max=4
log-level-console=info
log-level-file=debug
[global:archive-push]
compress-level=3

ADIM 7 (srv2’de pgbackrest ayarları)

vim /etc/pgbackrest/pgbackrest.conf #aşağıdaki satırlar eklenir
[dm]
pg1-path=/var/lib/postgresql/13/main
pg1-port=5432
[global]
repo1-host=pgbr
repo1-host-user=postgres
process-max=4
log-level-console=info
log-level-file=debug
[global:archive-push]
compress-level=3

ADIM 8 (srv1 ve srv2 makinelerinde)

# srv1’de
postgres@srv1:~$ psql
postgres# alter system set archive_mode = 'on' ;
postgres# alter system set archive_command = 'pgbackrest
--stanza=mx archive-push %p'
postgres# select pg_reload_conf();
postgres@srv1:~$ pgbackrest stop
postgres@srv1:~$ pgbackrest start

# srv2’de
postgres@srv2:~$ psql
postgres# alter system set archive_mode = 'on' ;
alter system set archive_command = 'pgbackrest --stanza=dm archive-push %p'
postgres# select pg_reload_conf();
postgres@srv2:~$ pgbackrest stop
postgres@srv2:~$ pgbackrest start

ADIM 9 (pgbr makinesinde)

postgres@pgbr:~$ pgbackrest --stanza=mx stanza-create
postgres@pgbr:~$ pgbackrest --stanza=dm stanza-create
postgres@pgbr:~$ pgbackrest --stanza=mx check
postgres@pgbr:~$ pgbackrest --stanza=dm check
INFO: check command begin 2.40: --exec-id=5984-90166d79 --loglevel-
console=info --pg1-host=srv2 --pg1-host-user=postgres
--pg1-path=/var/lib/postgresql/13/main --repo1-path=/RA/
pgbackrest --stanza=dm
P00 INFO: check repo1 configuration (primary)
P00 INFO: check repo1 archive for WAL (primary)
P00 INFO: WAL segment 000000010000000000000007
successfully archived to ‘/RA/pgbackrest/archive/dm/13-
1/0000000100000000/000000010000000000000007-23bcdb5a5765d40ca93
d09dcadbed85706a8a7d4.gz’ on repo1
P00 INFO: check command end: completed successfully (1271ms)

/RA/pgbackrest/archive/dm/13-1 ve
/RA/pgbackrest/archive/mx/13-1 dizinlerde arşivlenen WAL dosyaları
görülür.

Backup (pgbr makinesinde)

pgbackrest --stanza=dm backup
pgbackrest --stanza=mx backup
pgbackrest --stanza=dm info
pgbackrest --stanza=mx info

Backup, backup (pgbr) sunucu üzerinden alınır.
Restore işlemi ise veritabanının geri yükleneceği (restore) makine üzerinde yapılır.
Örneğin srv2’nin veritabanının geri yüklemesi srv2 üzerinden yapılır.

Restore (Geri yükleme, srv1 veya srv2 makinesinde)

postgres@srv2:~$ sudo systemctl stop postgresql.service
postgres@srv2:~$ pgbackrest --stanza=demo --delta restore
postgres@srv2:~$ sudo systemctl start postgresql.service

Not: “pgbackrest stop“ Bazı durumlarda pgbackrest durdurmak gerekebilir.
Örneğin failover işlemi sırasında problemli primary makineden backup alınması
istenmeyebilir.

Aynı konfigurasyonlarda bir makine daha kurulup veritabanlarının kılonu bu makineye
hızlıca alınarak yazılım ekibine test ortamı hazırlanabilir. Böylece canlı ortam
etkilenmediği gibi tekrar yedek kopyalama vb. İşlemlerle vakit kaybedilmez. Stanby
kurulumu için de pgbackrest kullanılabilir. Detaylar için bölüm 12’ye ve pgbackrest.org
sayfasına bakabilirsiniz.

Monitoring

postgres@srv2:~$ psql
postgres=# \i /pgbackrest-release-2.40/doc/example/pgsqlpgbackrest-
info.sql
postgres=# \i /pgbackrest-release-2.40/doc/example/pgsqlpgbackrest-
query.sql
name | last_successful_backup | last_archived_wal
------+------------------------+--------------------------
“dm” | 06:22:19+03 | 00000001000000000000000B
“mx” | 14:53:15+03 | 0000000400000000000000B4

check ve info ile yedekler izlenebileceği gibi pgbackrest ile birlikte gelen SQL’ler
ile de sorgulanabilir. Bu sorgu eğer boş gelirse (yedek olmadığı anlamına gelir) alarm
tetiklenerek e-posta gönderilmesi sağlanabilir.

Kategori seçin...