pgBackRest Kurulum ve Konfigürasyonu (Aynı Sunucu Üzerinde)

sami lekesiz
9 min readJan 10, 2020

--

Not: Bu yazı, sayfa sonunda yer alan kaynaklardan derlenmiş ve uygulaması yapılmıştır.

BackUp -Yedekleme

Yedekleme, donanım arızası, çökme vb. durumunda point-in-time-recovery (İstenilen zamandan kurtarma) gerçekleştirmek veya yeni bir standby sunucu sağlamak için geri yüklenebilen veritabanı kümesinin tutarlı bir kopyasıdır.

Full Backup, Differential Backup ve Incremental Backup olarak 3 çeşit backup vardır.

Restore (Geri Yükleme)

Geri yükleme; yedeklemenin, canlı veritabanı kümesi olarak başlatılacağı bir sisteme kopyalanması işlemidir. Geri yüklemenin düzgün çalışması için yedek dosyaları, bir veya daha fazla WAL segmentini gerektirir.

WAL, PostgreSQL’in commit edilen değişikliklerin kaybolmamasını sağlamak için kullandığı mekanizmadır. Transactionlar WAL’a sırayla yazılır ve bu yazma işlemleri diske akıtıldığında bir işlem-transaction gerçekleştirilmiş sayılır

pgBackRest, depoyu kullanıcı tarafından sağlanan bir parolaya göre şifreleyerek depoda depolanan verilere yetkisiz erişimi önler.

Kurulum

Aşağıdaki komutlarla kurulumu yapıp, gerekli izinleri verelim.

apt install pgbackrest
sudo chmod 755 /usr/bin/pgbackrest
apt-get install perl

pgBackRest yapılandırma dosyası ve dizinleri oluşturma

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

PgBackrest’in çalıştığından emin olalım

sami@debian:~$ sudo -u postgres pgbackrest
pgBackRest 2.10 — General help
Usage:
pgbackrest [options] [command]
Commands:
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.
restore Restore a database cluster.
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.
version Get version.
Use ‘pgbackrest help [command]’ for more information.

Demo cluster oluşturma

Bu demo için postgresql cluster oluşturalım

sami@debian:~$ sudo -u postgres /usr/lib/postgresql/11/bin/initdb \
> -D /var/lib/postgresql/11/demo -k -A peer
The files belonging to this database system will be owned by user “postgres”.
This user must also own the server process.
The database cluster will be initialized with locale “en_ZA.UTF-8”.
The default database encoding has accordingly been set to “UTF8”.
The default text search configuration will be set to “english”.
Data page checksums are enabled.creating directory /var/lib/postgresql/11/demo … ok
creating subdirectories … ok
selecting default max_connections … 100
selecting default shared_buffers … 128MB
selecting default timezone … Europe/Istanbul
selecting dynamic shared memory implementation … posix
creating configuration files … ok
running bootstrap script … ok
performing post-bootstrap initialization … ok
syncing data to disk … ok
Success. You can now start the database server using: /usr/lib/postgresql/11/bin/pg_ctl -D /var/lib/postgresql/11/demo -l logfile startsami@debian:~$ sudo pg_createcluster 11 demo
Configuring already existing cluster (configuration: /etc/postgresql/11/demo, data: /var/lib/postgresql/11/demo, owner: 111:120)
Ver Cluster Port Status Owner Data directory Log file
11 demo 5433 down postgres /var/lib/postgresql/11/demo /var/log/postgresql/postgresql-11-demo.log

PostgreSQL varsayılan olarak yalnızca yerel bağlantıları kabul eder. Bu kılavuzdaki örnekler diğer sunuculardan bağlantı gerektirecektir, bu nedenle listen_addresses tüm arabirimleri dinleyecek şekilde yapılandırılmıştır.

Konfigürasyon değişikliğini psql üzerinden postgresql.auto.conf’a otomatik yazdırabiliriz

ALTER SYSTEM SET listen_address to ‘*’;

Veya postgre servisi kapalıysa aşağıdaki dosyaya elle yazılır.

vim /etc/postgresql/11/main/postgresql.conf

Gösterim amacıyla log_line_prefix ayarı minimal olarak yapılandırılacaktır. Bu, önemli bilgileri daha net göstermek için log çıktısını mümkün olduğunca kısa tutar.

listen_addresses = ‘*’
log_line_prefix = ‘’

Stanza cluster yapılnadırma

PgBackrest her bir PostgreSQL cluster yedeğine “stanza” adını vermektedir

Stanza PostgreSQL veritabanı kümesinin nerede bulunduğunu, nasıl backup alınacağını, arşivleme opsiyonlarının konfigüre edilmesidir. Yedeklenmesi gereken her sunucu için stanza gerekir.

pgBackRest, PostgreSQL kümesi için temel veri dizininin nerede olduğunu bilmelidir

Pg-path, postgresql.conf dosyasındaki data_directory değerine tam olarak eşit olduğundan emin olun.

/etc/pgbackrest/pgbackrest.conf dosyasını oluştururken, veritabanı sahibine okuma ayrıcalıkları verilmelidir.

/etc/pgbackrest/pgbackrest.conf Postgresql cluster data dizinini pgbackrest konfigürasyon dosyasına yazalım

[demo]
pg1-path=/var/lib/postgresql/11/demo

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 yok sayılır ve yorum olarak kullanılabilir.

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]

NOTE:

— config, — config-include-path and — config-path are command-line only options.

Depo Oluştruma

Depo, pgBackRest’in yedekleri depoladığı ve WAL segmentlerini arşivlediği yerdir.

Ne kadar alana ihtiyacınız olduğunu önceden tahmin etmek zor olabilir. Yapılacak en iyi şey, bazı yedekleri almak ve ardından farklı yedekleme türlerinin (full / incr / diff) boyutunu kaydetmek ve günde üretilen WAL miktarını ölçmektir. Bu, veritabanınız geliştikçe elbette gereksinimlerin zaman içinde değişmesine rağmen, ne kadar alana ihtiyacınız olacağına dair genel bir fikir verecektir.

PgBackRest ile birden çok Postgres kümesi yedeklenebilir, pgbackrest farklı sunucu üzerinde olabilir. Bu demoda depo PostgreSQL sunucusuyla aynı sunucuda saklanacaktır.

pgBackRest deposu oluşturalım, yetki ve sahipliğini ayarlayalım.

sudo mkdir -p /var/lib/pgbackrest
sudo chmod 750 /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest

Repo-Path (Depo dizini), pgBackRest’in postgresi nerede bulacağını bileceği şekilde yapılandırılmalıdır.

/etc/pgbackrest/pgbackrest.conf pgBackRest deposunun dizinini konfigürasyona yazalım

sami@debian:~$ sudo cat /etc/pgbackrest/pgbackrest.conf
[demo]
pg1-path=/var/lib/postgresql/11/demo
[global]
repo1-path=/var/lib/pgbackrest

Arşivleme Yapılandırması

Çalışan bir PostgreSQL kümesini yedeklemek için WAL arşivlemesinin etkinleştirilmesi gerekir. Kümeye hiçbir yazma yapılmasa bile yedekleme işlemi sırasında en az bir WAL segmentinin oluşturulacağını unutmayın.

/etc/postgresql/11/demo/postgresql.conf Arşiv ayarlarını yapalım

archive_command = ‘pgbackrest — stanza=demo archive-push %p’
archive_mode = on
listen_addresses = ‘*’
log_line_prefix = ‘’
max_wal_senders = 3
wal_level = replica

İlk kurulum esnasında replika kurmasanız bile, max_wal_senders ve wal_level=replica ayarlarını yapmak iyi olur, ileride replika kurulunca servis restrartı gerekmez.

PostgreSQL kümesi, bu değişiklikler yapıldıktan sonra ve bir yedekleme gerçekleştirilmeden önce yeniden başlatılmalıdır.

sudo pg_ctlcluster 11 demo restart

Bir WAL segmentinin arşivlenmesinin pgBackRest deposuna ulaşması için 60 saniyeden uzun sürüyorsa(varsayılan), pgBackRest arşiv zaman aşımı seçeneğinin artırılması gerekir

(UYARI! bu timeout postgresql archive_tiemout dan farklı )

Archive-push komutu kendi seçenekleriyle yapılandırılabilir. Örneğin, yedeklemeler için kullanılan sıkıştırmayı etkilemeden arşivlemeyi hızlandırmak için daha düşük bir sıkıştırma düzeyi ayarlanabilir

/etc/pgbackrest/pgbackrest.conf Düşük sıkıştırma düzeyi için konfigürasyon

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

Configure Retention (Saklama Yapılandırması)

Bu yapılandırmalara göre backupların saklama süresi ayarlanır.

pg-primary:/etc/pgbackrest/pgbackrest.conf Demo için 2 full backup saklanacak şekilde ayarlıyoruz

repo1-retention-full=2

Depo Şifreleme Yapılandırması

Şifre anahtarı için uzun, rastgele bir parola kullanmak önemlidir. Bir tane oluşturmak için şu komutu çalıştıralım: openssl rand -base64 48

Oluşturulan şifreyi pgbackrest.conf a yazalım.

/etc/pgbackrest/pgbackrest.conf Depo şifrelemesini yapılandıralım.

[demo]
pg1-path=/var/lib/postgresql/11/demo
[global]
repo1-cipher-pass=2Ow3jNE+DnrIO4bAxDYiNUak8pR9uISUnACpihebqsapDnnABwhmDAxzlQbtWpif
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
[global:archive-push]
compress-level=3

pgbackrest.conf dosyamızın son hali.

UYARI ! Depo yapılandırıldıktan ve stanza oluşturulduktan sonra depo şifrelemesi değiştirilemez.

Stanza Oluşturma

Dikkat! Stanza-create komutu, stanza’yı başlatmak için deponun bulunduğu ana bilgisayarda çalıştırılmalıdır. Arşivleme ve yedeklemelerin doğru şekilde yapılandırıldığından emin olmak için stanza-create işleminden sonra kontrol komutunun çalıştırılması önerilir.

Stanza oluştur ve konfigürasyonu kontrol et

sami@debian:~$ sudo -u postgres pgbackrest — stanza=demo — log-level-console=info stanza-create2019–12–27 16:28:08.940 P00 INFO: stanza-create command begin 2.10: — log-level-console=info — pg1-path=/var/lib/postgresql/11/demo — repo1-cipher-pass=<redacted> — repo1-cipher-type=aes-256-cbc — repo1-path=/var/lib/pgbackrest — stanza=demo
2019–12–27 16:28:09.412 P00 INFO: stanza-create command end: completed successfully (472ms)

Yapılandırma Kontrolü

Check komutu, pgBackRest ve archive_command ayarının arşivleme ve yedeklemeler için doğru yapılandırıldığını doğrular. Gerekli WAL segmentleri arşive ulaşamadığında, özellikle arşivlemede eksik yedeklemeyle sonuçlanan yanlış yapılandırmaları algılar. Komut, veritabanı veya depo ana bilgisayarında çalıştırılabilir. Komut, standby bilgisayarında da çalıştırılabilir, ancak pg_switch_wal () (pg_switch_xlog () version< v10) bekleme modunda gerçekleştirilemediğinden, komut yalnızca depo yapılandırmasını test eder.

sami@debian:~$ sudo -u postgres pgbackrest — stanza=demo — log-level-console=info check
2019–12–27 16:38:31.190 P00 INFO: check command begin 2.10: — log-level-console=info — pg1-path=/var/lib/postgresql/11/demo — repo1-cipher-pass=<redacted> — repo1-cipher-type=aes-256-cbc — repo1-path=/var/lib/pgbackrest — stanza=demo
2019–12–27 16:38:32.502 P00 INFO: WAL segment 000000010000000000000003 successfully stored in the archive at ‘/var/lib/pgbackrest/archive/demo/11–1/0000000100000000/000000010000000000000003–63a82c8081161dd1bc8f4796f22eefadd8e6ff4f.gz’
2019–12–27 16:38:32.503 P00 INFO: check command end: completed successfully (1313ms)

BackUp Alımı

PostgreSQL kümesinin yedeğini almak için pgBackRest ögesini backup komutuyla çalıştıralım;

Demo cluster yedeğini alalım

sami@debian:~$ sudo -u postgres pgbackrest — stanza=demo \
> — log-level-console=info backup
2019–12–27 16:39:57.468 P00 INFO: backup command begin 2.10: — log-level-console=info — pg1-path=/var/lib/postgresql/11/demo — repo1-cipher-pass=<redacted> — repo1-cipher-type=aes-256-cbc — repo1-path=/var/lib/pgbackrest — repo1-retention-full=2 — stanza=demo
WARN: no prior backup exists, incr backup has been changed to full
2019–12–27 16:39:58.319 P00 INFO: execute non-exclusive pg_start_backup() with label “pgBackRest backup started at 2019–12–27 16:39:57”: backup begins after the next regular checkpoint completes
2019–12–27 16:39:58.922 P00 INFO: backup start archive = 000000010000000000000005, lsn = 0/5000060
2019–12–27 16:40:00.396 P01 INFO: backup file /var/lib/postgresql/11/demo/base/13101/1255 (608KB, 2%) checksum b4ee1361ce1f9647138176493176322087f69eca
2019–12–27 16:40:00.415 P01 INFO: backup file /var/lib/postgresql/11/demo/base/13100/1255 (608KB, 5%) checksum b4ee1361ce1f9647138176493176322087f69eca
2019–12–27 16:40:06.802 P00 INFO: backup command end: completed successfully (9334ms)2019–12–27 16:40:06.802 P00 INFO: expire command begin2019–12–27 16:40:06.810 P00 INFO: full backup total < 2 — using oldest full backup for 11–1 archive retention2019–12–27 16:40:06.813 P00 INFO: expire command end: completed successfully (11ms)

Varsayılan olarak pgBackRest incremental backup yapar. Bununla birlikte, incremental backup full backup a dayandırılmalıdır ve full backup olmadığında pgBackRest incremental yerine otomatik olarak full backup alır.

Üstteki uygulmada da bunu görmüş olduk.

2019–12–27 16:40:06.288 P00 INFO: full backup size = 22.7MB

Differential BackUp almak için,

sudo -u postgres pgbackrest — stanza=demo — type=diff \
— log-level-console=info backup

BackUp Zamanlamak

Crontab ile backup görevleri oluşturabiliriz

30 06 * * 0 pgbackrest — type=full — stanza=demo backup
30 06 * * 1–6 pgbackrest — type=diff — stanza=demo backup

Alınan BackUp’lar Hakkında Bilgi Alma

sami@debian:~$ sudo -u postgres pgbackrest info
stanza: demo
status: ok
cipher: aes-256-cbc
db (current)
wal archive min/max (11–1): 000000010000000000000005/00000001000000000000000E
full backup: 20191227–163957F
timestamp start/stop: 2019–12–27 16:39:57 / 2019–12–27 16:40:06
wal start/stop: 000000010000000000000005 / 000000010000000000000005
database size: 22.7MB, backup size: 22.7MB
repository size: 2.7MB, repository backup size: 2.7MB
incr backup: 20191227–163957F_20200106–153005I
timestamp start/stop: 2020–01–06 15:30:05 / 2020–01–06 15:30:08
wal start/stop: 000000010000000000000007 / 000000010000000000000007
database size: 22.7MB, backup size: 24.2KB
repository size: 2.7MB, repository backup size: 679B
backup reference list: 20191227–163957F
incr backup: 20191227–163957F_20200106–153017I
timestamp start/stop: 2020–01–06 15:30:17 / 2020–01–06 15:30:19
wal start/stop: 000000010000000000000008 / 000000010000000000000008
database size: 22.7MB, backup size: 8.2KB
repository size: 2.7MB, repository backup size: 535B
backup reference list: 20191227–163957F, 20191227–163957F_20200106–153005I
incr backup: 20191227–163957F_20200106–153831I
timestamp start/stop: 2020–01–06 15:38:31 / 2020–01–06 15:38:34
wal start/stop: 00000001000000000000000A / 00000001000000000000000A
database size: 22.7MB, backup size: 8.2KB
repository size: 2.7MB, repository backup size: 535B
backup reference list: 20191227–163957F, 20191227–163957F_20200106–153005I
incr backup: 20191227–163957F_20200106–153942I
timestamp start/stop: 2020–01–06 15:39:42 / 2020–01–06 15:39:49
wal start/stop: 00000001000000000000000C / 00000001000000000000000C
database size: 22.8MB, backup size: 2.3MB
repository size: 2.7MB, repository backup size: 226.2KB
backup reference list: 20191227–163957F, 20191227–163957F_20200106–153005I
diff backup: 20191227–163957F_20200106–161511D
timestamp start/stop: 2020–01–06 16:15:11 / 2020–01–06 16:15:14
wal start/stop: 00000001000000000000000E / 00000001000000000000000E
database size: 22.8MB, backup size: 2.3MB
repository size: 2.7MB, repository backup size: 226.2KB
backup reference list: 20191227–163957F

BackUp’tan Dönme (Restore)

Restore senaryosunu gerçekleştirmek için önemli postgresql cluster dosyalarından birini silelim.

Servisi durduralım ve pg_control dosyasını silelim.

sudo pg_ctlcluster 11 demo stop
sudo -u postgres rm /var/lib/postgresql/11/demo/global/pg_control

Tekrar servisi başlatalım

sami@debian:~$ sudo pg_ctlcluster 11 demo startJob for postgresql@11-demo.service failed because the service did not take the steps required by its unit configuration.
See “systemctl status postgresql@11-demo.service” and “journalctl -xe” for details.

Doğal olarak servis başlayamadı.

PostgreSQL kümesinin bir yedeğini geri yüklemek için pgBackRest’i restore komutuyla çalıştıralım.. Öncesinde tüm dosyaların PostgreSQL veri dizininden kaldırılması gerekir.

sudo -u postgres find /var/lib/postgresql/11/demo -mindepth 1 -delete

Şimdi restore yapalım,

sudo -u postgres pgbackrest — stanza=demo restore

Restore başarılı oldu, artık servisi başlatabiliriz

sudo pg_ctlcluster 11 demo start

Yedekleme

Fast Start Option:

Varsayılan olarak pgBackRest, bir yedeklemeye başlamadan önce düzenli olarak planlanan bir sonraki checkpoint-kontrol noktasını bekleyecektir.

— start-fast aktif hale getirilerek checkpoint beklenmeden backup alınır.

Start-Fast aktif etmek için /etc/pgbackrest/pgbackrest.conf dosyasına yazılır

start-fast=y

Arşiv Timeout (zaman aşımı)

Çevrimiçi yedekleme sırasında pgBackRest, tutarlı yedek arşivi için gerekli olan WAL segmentlerini bekler. Bu bekleme süresi, varsayılan olarak 60 saniye olan pgBackRest arşiv zaman aşımı seçeneğiyle yönetilir. Belirli bir segmentin arşivlenmesinin daha uzun sürdüğü biliniyorsa, bu seçenek artırılmalıdır.

Retention

Saklanacak backup sayısının ayarlanmasıdır. 3 çeşidi var.

Full Backup Retention

Differential Backup Retention

Archive Retention

Konfigürasyonu,

/etc/pgbackrest/pgbackrest.conf altında repo1-retention-full= parametresi ile tutulur.

Restore

sami@debian:~$ sudo pg_ctlcluster 11 demo stopsami@debian:~$ sudo -u postgres pgbackrest — stanza=demo — delta — log-level-console=detail restore

Kaynaklar

https://pgbackrest.org/user-guide.html

https://www.enginyilmaz.gen.tr/82-postgresql-pgbackrest-ile-backup.html

https://pgbackrest.org/command.html

https://medium.com/@aydemirzekiye/postgresql-12de-pgbackrest-kurulumu-ve-kullan%C4%B1m%C4%B1-c65436d02c76

https://github.com/pgbackrest/pgbackrest/issues/713

https://github.com/edib/pg-dba-egitim/blob/master/yedekleme.md

--

--