pgBackrest vasitəsilə backup alınması


pgBackRest CrunchyData şirkəti tərəfindən yazılmış open source backup alətidir. pgBackrest-lə bacupları 2 cür , backupını almaq istəyimiz PostgreSQL bazasının yerləşdiyi serverə və yaxud da ayrıca bir backup serveri yaradıb müxtəlif remote serverlərdə yerləşən PostgreSQL bazalarının backupını bir serverə ala bilərik. Aşağıda hər iki üsul göstərilmişdir

  • Serverin öz lokalına backup alınması
  • Ayrılmış remote serverə backup alınması
  • İncremental və Differential backup
  • Backupdan geri qayıtmaq
  • Point In Time Recovery(PITR)
  • Bəzi pgbackrest əmrləri və konfiqləri

Serverin öz lokalına backup alınması

pgBackRest paketlərini PostgreSQL yum repositoriyasından yükləyə bilərik. PostgreSQL quraşdırılmış serverimizin öz lokalına backup almaq üçün pgBackrest-i aşağıdakı qaydada quraşdırırıq :

# yum install pgbackrest
# su - postgres

$ pgbackrest version
pgBackRest 2.32

pgBackrest konfiqurasiya faylı susmaya görə /etc/pgbackrest.conf qovluğunda yerləşdir. Həmin faylı redaktə edib öz konfiqurasiyamızı yazırıq:
[global] Burada global bölməsi Backupları və WAL seqment arxivlərini saxlamaq üçün repozitoriyanı təyin etmək üçündür.
[mydb_stanza] hissəsində isə backupını alacağımız bazanın harada yerləşdiyi, backupın necə alınacağı, onun qalma(retention) müddəti vəs xüsusiyyətləri qeyd olunur.

# vi /etc/pgbackrest.conf
[global]
repo1-path=/var/lib/pgsql/12/backups
log-level-console=info
log-level-file=debug
start-fast=y

[mydb_stanza]
pg1-path=/var/lib/pgsql/12/data
repo1-retention-full=1

Postgresql.conf faylında arxivləməni aktivləşdiririk :

# vi /var/lib/pgsql/12/data/postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=mydb_stanza archive-push %p'

# systemctl restart postgresql-12.service

Burada pgBackRest-in archive-push əmri vasitəsilə WAL segmentləri arxivə göndəririk. 

İndi isə gəlin stanza yaradaq və konfiqurasiyanı yoxlayaq:

$ pgbackrest --stanza=mydb_stanza stanza-create
$ pgbackrest --stanza=mydb_stanza check

Aaşağıdakı üsulla bazanın full backupını alırıq:

$ pgbackrest --stanza=mydb_stanza --type=full backup

Ayrılmış serverə backup alınması

Digər bir nümunəyə baxaq burada biz bir serverden digər serverə backup alacağıq. Burada backup alınacaq serverdən backup alan serverə ssh üzərindən şifrəsiz daxil olma imkanı olmalıdır. Backup serveri və database serverdə postgres userləri arasında ssh üzərindən şifrəsiz qoşulmanı təmin edirk və təhlükəsizlik qaydalarına uyğun olaraq selinux və firewall tənzimləmələrini edirik. Bu nümunədə test olduğu uçün selinux və firewall disable edirik:

### hər iki serverdə
# systemctl stop firewalld  && systemctl disable firewalld && setenforce 0 && sed -i 's/enforcing/disabled/g' /etc/selinux/config /etc/selinux/config
$ ssh-keygen
--Backup serverindən DB serverlərə
$ ssh-copy-id postgres@mydb1
$ ssh-copy-id postgres@mydb2
$ ssh-copy-id postgres@mydb2
---DB serverlərdən Backup serverinə
$ ssh-copy-id postgres@backupsrv

Backup serverinə pgbackrest yazırıq və konfiqurasiya edirik. Aşağıdakı nümunədən göründüyü kimi burada biz 3 stanza, yəni 3 fərqli PostgreSQL bazasının backuplarını almağı planlaşdırırıq:

# yum install pgbackrest
# vi /etc/pgbackrest.conf

[mydb1-stanza]
repo1-path=/backups/mydb1
pg1-host=192.168.1.100
repo1-host-user=postgres
pg1-path=/var/lib/pgsql/12/data
pg1-port=5432
compress=n
repo1-retention-full=1
start-fast=y
stop-auto=y
process-max=8
log-level-console=info
log-level-file=detail

[mydb2-stanza]
repo1-path=/backups/mydb2
pg1-host=192.168.1.101
repo1-host-user=postgres
pg1-path=/var/lib/pgsql/12/data
pg1-port=5432
compress=n
repo1-retention-full=1
start-fast=y
stop-auto=y
process-max=8
log-level-console=info
log-level-file=detail

[mydb3-stanza]
repo1-path=/backups/mydb3
pg1-host=192.168.1.103
repo1-host-user=postgres
pg1-path=/var/lib/pgsql/12/data
pg1-port=5432
compress=n
repo1-retention-full=1
start-fast=y
stop-auto=y
process-max=8
log-level-console=info
log-level-file=detail

Burada :
process-max=4   paralel işləyəcək proses sayını göstərir.
pg1-host=192.168.X.X  backupı alınacaq database serverin ipsini göstərir.
İndi isə mydb1  bazamız yerləşən serverimizə daxil oluruq , pgbackrest quraşdırıb və konfiqurasiya faylını aşağıdakı kimi dəyişirik. Burada repo1-host Backup serverimizin(backupların saxlanılacağı server) ip ünvanıdır:

[root@mydb1~]# yum install pgbackrest
[root@mydb1~]# vi /etc/pgbackrest.conf
[global]
repo1-host=192.168.1.200
repo1-host-user=postgres
log-level-console=info
log-level-file=detail
compress=n

[global:archive-push]
process-max=4
archive-async=y
log-level-console=info
log-level-file=info

[mydb01-stanza]
pg1-path=/var/lib/pgsql/12/data
pg1-port=5432

İndi isə backupını alacağımız serverlərimizdə postgresql.conf faylına dəyişikliklərimizi edirik:

[root@mydb1 ~]# vim /var/lib/pgsql/12/data/postgresql.conf 
archive_mode = on
archive_command = 'pgbackrest --stanza=mydb1-stanza archive-push %p' 

Yuxarıda mydb1-də edilən əməliyyatlar eyni qaydada mydb2 və myb3-də edirik.

pgbackrest –stanza=mydb1-stanza archive-push %p’  bu komandada biz pgbackrest-ə deyirik ki sənə bir stanza verirəm(yəni backup olunacaq db) archive-push komandasini %p (wal fayllarının arxivlənəcəyi direktoriyaya) kopyala

İndi isə backup serverimizdə stanza create edirik:

[postgres@backupsrv~]$ pgbackrest --stanza=mydb1-stanza stanza-create

[postgres@backupsrv ~]$ cd /backups/mydb1
[postgres@backupsrv mydb1]$ ls
archive  backup
[postgres@backupsrv mydb1]$ cd backup/
[postgres@backupsrv backup]$ ls
mydb1-stanza
[postgres@backupsrv backup]$ cd mydb1-stanza/
[postgres@backupsrv mydb1-stanza]$ ls
backup.info  backup.info.copy

Backupını almaq istədiyimiz  PostgreSQL bazalarını restart edirik:

[root@mydb1~]# systemctl restart postgresql-12.service

Bazanın Full backupını aşağıdakı qaydada alırıq:

## Full backup almaq uchun
[postgres@backupsrv]$ pgbackrest --stanza=mydb1-stanza --type=full backup

Bundan əlavə aşağıdakı üsullarla bazanın differential və incremental backuplarını da ala bilərsiniz.

## incremental backup almaq uchun
[postgres@backupsrv]$ pgbackrest --stanza=mydb1-stanza --type=incr backup

## differential backup almaq uchun
[postgres@backupsrv]$ pgbackrest --stanza=mydb1-stanza --type=diff backup

## backuplar barede melumata baxmaq uchun
[postgres@backupsrv]$ pgbackrest --stanza=mydb1-stanza info

Backupdan geri qayıtma

İndi isə deyəlim ki mydb1 db-mız çökdü və biz backupdan geri qayıtmaq istəyirik:

[root@mydb1 ~]# systemctl stop postgresql-12.service
[postgres@mydb1 ~]$  rm -rf /var/lib/pgsql/12/data/
[postgres@mydb1 ~]$ mkdir -m 700 /var/lib/pgsql/12/data


Bazamızı ən son aldığımız backupdan restore edirik:

[postgres@mydb1 ~]$ pgbackrest --stanza=mydb1-stanza restore

Əgər bir neçə backupımız varsa, həmin backupın adını yazmaqla backupdan geri dönə bilərik:

[postgres@mydb1 ]$ pgbackrest --stanza=mydb1-stanza --set=20210218-033202F restore
[root@mydb1 ~]# systemctl start postgresql-12.service

Ola bilər kizim PostgreSQL serverdə bir neçə baza olsun və biz aldığımız backupdan yalnız bir bazanı bərpa etmək istəyək. Misal üçün aşağıdakı nümunədə yalnız testdb bazasını bərpa edirik::

# systemctl stop postgresql-12.service

$ pgbackrest --stanza=my_stanza --delta --db-include=testdb restore

# systemctl start postgresql-12.service

Point in Time Recovery(PITR)

İndi isə point in time recovery üsuluna baxaq. Əgər biz bazamızın incremental backuplarını alırıqsa və hər hansısa zaman anına göri dönmək lazım olarsa o zaman PİTR vasitəsilə aşağıdakı bazamızı lazm olan zamana geri bərpa edə bilərik:

[root@mydb1 ~]# systemctl stop postgresql-12.service
[postgres@mydb1 ~]$  rm -rf /var/lib/pgsql/12/data/
[postgres@mydb1 ~]$ mkdir -m 700 /var/lib/pgsql/12/data

[postgres@mydb1 ~]$ pgbackrest --stanz'2020-05-17 03:31:00' a=mydb-stanza --type=time --target=restore

Stanzanın və Backupların silinməsi

Backupları və stanzanı silmək üçün ilk oncə, backup prosessini dayandırırıq:

 $ pgbackrest --stanza=stanza-adı --log-level-console=info stop

Daha sonra aşağıdakı komanda ilə stanza və backupı silirik. Əgər bir neçə stanza varsa o halda  –stanza parametrindən istifadə edərək stranza adına görə nəticəni filt edə bilərik.

$ pgbackrest --stanza=stanza-adı --log-level-console=info stanza-delete --force

Leave a comment