Skip to content

Instantly share code, notes, and snippets.

@edib
Created January 26, 2020 19:15
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edib/1b17404437663afd64a06f02f956092f to your computer and use it in GitHub Desktop.
Save edib/1b17404437663afd64a06f02f956092f to your computer and use it in GitHub Desktop.
pgBackRest Kullanımı

Bu yazıyı okumadan önce, ssh ayarlarınızı yaptığınıza emin olun
Bu yazı PostgreSQL 11 ve PgBackRest 2.15 için yazılmıştır

Kurulum

Master ayarları

Öncelikle aşağıdaki komut ile pgbackrest kuralım:

sudo apt-get install pgbackrest -y

Sonra, /etc/pgbackrest.conf'u açalım, içindekileri silelim ve şunları ekleyelim:

[global]
repo1-host=192.168.56.101
repo1-host-user=postgres
process-max=2
log-level-console=info
log-level-file=debug

[main_stanzamiz]
pg1-path=/var/lib/postgresql/11/main
pg1-port=5432

repo1-host: Yedek sunucunuzun IP'si
repo1-host-user: Yedek sunucunuzun kullanıcısı
not: postgres yerine başka bir kullanıcı da oluşturabilirdiniz. Bizim kurulumumuzda postgres kullanıcısı hazır geldiği için ve SSH ayarlarını ona göre yaptığımız için postgres kullandım.

pg1-path: postgres clusterinizin data klasörü


main_stanzamiz olarak istediğiniz ismi verebilirsiniz.
stanza: bir cluster'in yedekleme, arşivleme gibi ayarlarını içeren konfigürasyon
repo: yedeğin alınacağı yer. local veya uzak bir makine olabilir


Şimdi, PostgreSQL'e, WAL dosyalarını pgbackrest'e göndermesini söyleyelim.

/etc/postgresql/11/main/postgresql.conf içinde şu ayarları yapın:

archive_mode = on
archive_command = 'pgbackrest --stanza=main_stanzamiz archive-push %p'

Daha sonra,

systemctl reload postgresql@11-main

çalıştırın.

Repo ayarları (backup/yedek sunucusu)

Yine pgbackrest kuralım:

sudo apt-get install pgbackrest -y

Sonra, /etc/pgbackrest.conf'u açalım, içindekileri silelim ve şunları ekleyelim:

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-retention-diff=2
process-max=2
log-level-console=info

[main_stanzamiz]
pg1-path=/var/lib/postgresql/11/main/
pg1-host=192.168.56.102
pg1-host-user=postgres

repo1-path: backup sunucumuzda yedeklerin kaydedileceği yer
repo1-retention-full: full backupların sınırı, bu sayıdan sonra öncekiler silinir
repo1-retention-diff: üsttekinin diff hali
pg1-path: postgres cluster'inizin data klasörü
pg1-host: postgres cluster IP
pg1-host-user: postgres kullanıcı adı (genelde postgres)

Not: pg1-host-user'in cluster klasörünü okuma ve yazma yetkisi olmalıdır


Şimdi de stanza'yı oluşturalım.

postgres kullanıcısı olarak;

pgbackrest --stanza=main_stanzamiz stanza-create

SSH ile ilgili bir şey sorarsa "yes" yazın.

pgbackrest --stanza=main_stanzamiz check

ile kontrol sağlayın. Son satırda INFO: check command end: completed successfully (2502ms) gibi bir çıktı almanız gerekiyor.
Aynı kontrolü master sunucusunda da yapın.

Backup alma

Kurulumu tamamladık.

Şimdi ilk backup'ımızı alalım.

  • Backup, backup/repo sunucusundan alınır
  • Restore, master sunucudan yapılır

Backup alacağımız için, backup/repo sunucusuna geçin.

pgbackrest --stanza=main_stanzamiz backup

pgbackrest varsayılan olarak incremental backup alacaktır. Fakat bizim full backup'ımız olmadığı için, ilk seferde full backup oluşturmak zorunda.
--type=full ile full backup almaya zorlayabilirsiniz. incr ve diff de seçebilirsiniz.

Incremental backup.



Differential backup.

Yedek Türü Backup Hızı Restore Hızı Depolama
Full En yavaş Normal En fazla
Differential Yavaş Normal En az
Incremental Hızlı Yavaş Orta
Archive* En hızlı En yavaş Fazla

archive: otomatik gelen WAL dosyalarıyla yapılan backup

Benim incelemelerime göre böyle bir tablo çıkardım.
Örneğin, günlük incremental, haftalık differential, aylık full backup alabilirsiniz. Archive zaten otomatik alınıyor.
Restore hızı duruma göre değişkenlik gösterecektir.


Backup'ınız başarılı olduysa, PostgreSQL'i bozup deneyebiliriz. Önce, başarılı olup olmadığına bakalım. ```sh pgbackrest --stanza=main_stanzamiz info ``` Çıktı şöyle bir şey ise problem yok demektir; ``` ... full backup: 20190728-133937F timestamp start/stop: 2019-07-28 13:39:37 / 2019-07-28 13:39:56 wal start/stop: 000000010000000000000019 / 000000010000000000000019 database size: 98MB, backup size: 98MB repository size: 6.6MB, repository backup size: 6.6MB ... ``` # Restore etme **Master** sunucuya geçin, aşağıdaki komutları **root** olarak çalıştırın.
PostgreSQL'i öldürüp dosyalarını silelim.
killall -9 postgres
rm -rf /var/lib/postgresql/11/main/*

Başlatmaya çalışırken hata alacaksınız:

systemctl start postgresql@11-main

Şimdi de restore işlemi yapalım. Restore işlemi olduğu için, master sunucuda çalıştırıyoruz.

pgbackrest --stanza=main_stanzamiz restore

Eğer veritabanı klasörünüz boş değilse, --delta parametresiyle checksum kontrolü yaparak restore yapabilirsiniz. Eğer dosya yoksa, veya farklıysa, değiştirilecektir.
Sadece bir database'i restore etmek için --db-include=test_database kullanabilirsiniz.

PITR (Point-in-Time recovery)

Bir tablonuzu yanlışlıkla sildiniz diyelim. Böyle bir durumda, veritabanını belli bir tarihe geri döndürebilirsiniz.
Belirtilen bir tarihe dönmek için (örn. 2019-07-28 17:30);
(postgres kullanıcısında)

pgbackrest --stanza=main_stanzamiz --delta \
--type=time "--target=2019-07-28 17:30:00.000000+00" \
--target-action=promote restore

Bu işlem recovery.conf'u oluşturacaktır. İsterseniz cat /var/lib/postgresql/11/main/recovery.conf ile inceleyebilirsiniz.

Postgres'i başlatalım, recovery işlemini yapsın, daha sonra da --target-action=promote verdiğimiz için recovery'den çıksın.
(root kullanıcısında)

systemctl start postgresql

Not: PostgreSQL aslında geri gitmiyor. Verilen base backup'dan başlayıp, diğer backup/archive dosyaları ile ileri doğru gidiyor, belirtilen hedefte duruyor.
Eğer son backup'ınızdan daha önceki bir veriyi almak isterseniz,
--set=[backup label idsi] parametresini ekleyebilirsiniz. Label ID'yi az önceki gibi info ile öğrenebilirsiniz.

Not 2: Bir backup'ı sildiğinizde (veya retention ile kendi silinince), referansı olan backuplar da silinir. Örneğin bir full backup altında differential backup'ınız varken, full backup'ı silerseniz, differential backup'ınız da silinir.

Diğer notlar

Yedeği replika sunucusundan aldırma

Backup sunucunuzda /etc/pgbackrest.conf içinde;

[global]  
backup-standby=y

[main_stanzamiz]
pg2-host=192.168.56.104
pg2-host-user=postgres
pg2-path=/var/lib/postgresql/10/demo

şeklinde ekleme yapabilirsiniz. pg2 standby/replika sunucusu anlamına gelmektedir.
Bu sadece backuplar için geçerlidir. WAL dosyalarını zaten master sunucumuz backup'a direk gönderiyor.

Tablespace

Restore ederken bütün tablespace'lar orjinal yerlerinde olmalıdır. Eğer değilse, hata alırsınız.
Bunu çözmek için --tablespace-map kullanılabilir.

pgbackrest ..... --tablespace-map=tablespace_1=/disk/tablespace_1/ restore

Birden fazla tablespace için --tablespace-map-all kullanılabilir.

pgbackrest ..... --tablespace-map-all=/disk/tablespacelar/ restore

Konfigürasyonları yedeklemek

Debian tabanlı sistemlerde konfigürasyonlar /etc/postgresql/ altında olduğu için, pgbackrest bunları yedeklemeyecektir. Bunu siz kendiniz yapmalısınız.
scp komutu ile sunucular arasında dosya kopyalayabilirsiniz.
Dikkat etmeniz gereken bir nokta, postgresql.conf içerisinde "FILE LOCATIONS" altındaki dosya yollarını değiştirmektir. Bazen bunu yapmaya ihtiyacınız olmayabilir.

Neden pgbackrest?

İsterseniz, pg_dumpall kullanarak mantıksal yedekleme de yapmanız mümkündür. Bu komut SQL çıktısı üretir. Recovery daha uzun sürecek, indexler, konfigürasonlar ve daha bir çok şey yedeklenmeyecektir. Fakat daha portatif bir çözümdür.

archive_command'ı direk olarak tar veya cp komutuna da verebilirsiniz. Bu sadece WAL dosyalarını kopyalayacağı için, fazla özelliği olmayacaktır. Backup ve restore işlemleri zor olabilir.

pgbackrest ile, bu yedekleri kolay bir şekilde yönetebilirsiniz.

SSH'sız olmuyor mu?

Aynı makineye yedekleme yapabilirsiniz, fakat bu çoğu zaman mantıklı değildir. repo-host ile aynı makinede farklı bir dizine/diske yedekleme yapabilirsiniz.

Backup sunucusu yanıt vermezse ne olur?

Postgres, WAL dosyalarını göndermeyi belirli aralıklarla tekrar dener. Backup sunucunuzun çalışıp çalışmadığını, disk alanını vs. kontrol eden sistemler (monitoring) kullanmanız önerilir. Postgres bu durumda WAL klasörüne yazmaya devam eder.
Eğer WAL klasörünün disk alanı dolarsa Postgres PANIC verip kendini kapatacaktır.

Hata alıyorum

Hata: /tmp/pgbackrest permission denied
Çözüm: root'a geçip rm -rf /tmp/pgbackrest/ çalıştırın.
Sebep: pgbackrest'i root olarak çalıştırmışsınız. postgres kullanıcısından deneyin. (veya başka kullanıcınız varsa ondan)

Diğer hatalar için iletişime geçerseniz yardımcı olmaya çalışır, buraya da eklerim

Kaynaklar:

https://pgbackrest.org/configuration.html

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

https://pgstef.github.io/2019/03/26/pgbackrest_archiving_tricks.html

https://pgstef.github.io/2018/01/04/introduction_to_pgbackrest.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment