pgBackRest Kurulum ve Konfigürasyonu (Aynı Sunucu Üzerinde)
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 helpUsage:
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 peerThe 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 … okSuccess. 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 backup2019–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 b4ee1361ce1f9647138176493176322087f69eca2019–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://github.com/pgbackrest/pgbackrest/issues/713
https://github.com/edib/pg-dba-egitim/blob/master/yedekleme.md