Pgbackrest ilə artan postgresql ehtiyat nüsxələri - bir tərtibatçıdan gənc döyüşçü kursu

İmtina

Mən tərtibatçıyam. Kod yazıram, verilənlər bazası ilə yalnız istifadəçi kimi əlaqə saxlayıram. Heç bir halda özümü sistem administratoru və üstəlik, dba kimi göstərmirəm. Amma…

Elə oldu ki, postgresql verilənlər bazasının ehtiyat nüsxəsini təşkil etməli oldum. Bulud yoxdur - SSH-ni saxlayın və hər şeyi işləyin və pul istəməyin. Belə hallarda nə edirik? Düzdü, pgdump-u cron-a itələyirik, hər gün hər şeyi arxivə köçürür və tamamilə dağılsaq, bu arxivi uzaq bir yerə göndəririk.

Bu dəfə çətinlik ondan ibarət idi ki, planlara görə verilənlər bazası gündə təxminən + - 100 MB böyüməli idi. Əlbəttə ki, bir neçə həftədən sonra pgdump ilə hər şeyi ehtiyat nüsxələmək istəyi yox olacaq. Artan ehtiyat nüsxələrinin lazımlı olduğu yer budur.

Maraqlıdır? Pişik altında xoş gəlmisiniz.

Artan ehtiyat nüsxə bütün mənbə faylları deyil, əvvəlki nüsxə yaradılandan bəri yalnız yeni və dəyişdirilənlər kopyalandıqda bir növ ehtiyat nüsxəsidir.

Postgresin incəliklərini başa düşmək istəməyən hər hansı bir tərtibatçı kimi (o vaxt) yaşıl düymə tapmaq istədim. Bilirsiniz, AWS, DigitalOcean-da olduğu kimi: bir düyməni basdım - replikasiya əldə etdim, ikincini basdım - ehtiyat nüsxələri qurdum, üçüncüsü - bir neçə saat əvvəl hər şeyi geri qaytardım. Düymə və gözəl GUI aləti tapmadım. Birini bilirsinizsə (pulsuz və ya ucuz) - bu barədə şərhlərdə yazın.

Google-da iki alət tapdım pgbarman и pgbackrest. Birincisi ilə sadəcə müvəffəq olmadım (çox zəif sənədlər, köhnə təlimatlara uyğun olaraq hər şeyi götürməyə çalışdım), amma ikinci sənədlər səviyyədə oldu, amma qüsursuz deyil. Bənzər bir vəzifə ilə qarşılaşanların işini asanlaşdırmaq üçün bu məqalə yazılmışdır.

Bu məqaləni oxuduqdan sonra siz artımlı ehtiyat nüsxələrini necə edəcəyinizi, onları uzaq serverdə (ehtiyat nüsxələri olan repozitoriyada) saxlamağı və məlumat itkisi və ya əsas serverdə digər problemlər zamanı onları necə bərpa etməyi öyrənəcəksiniz.

Təlim

Təlimatı oynamaq üçün sizə iki VPS lazımdır. Birincisi repozitoriya (ehtiyat nüsxələrin yerləşəcəyi anbar), ikincisi isə əslində postgres ilə serverin özü (mənim vəziyyətimdə postgres-in 11-ci versiyası).

Ehtimal olunur ki, postgres ilə serverdə root, sudo istifadəçisi, postgres istifadəçisi və postgres özü quraşdırılıb (postgres istifadəçisi postgresql quraşdırarkən avtomatik olaraq yaradılır), repozitoriya serverində isə root və sudo istifadəçisi var (istifadəçi adı pgbackrest istifadə olunacaq). təlimatda).

Təlimatları təkrarlayarkən daha az problem yaşamağınız üçün - kursivlə yazıram əmri harada, hansı istifadəçi ilə və hansı hüquqlarla icra etdim məqaləni yazarkən və nəzərdən keçirərkən.

pgbackrest quraşdırılması

Repozitoriya (pgbackrest istifadəçisi):

1. Arxivi pgbackrest-dən yükləyin və məzmununu /build qovluğuna köçürün:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Montaj üçün lazım olan asılılıqları quraşdırın:

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. Biz pgbackrest yığırıq:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. İcra olunan faylı /usr/bin qovluğuna kopyalayın:

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. Pgbackrest perl tələb edir. Yüklemek:

sudo apt-get install perl

6. Jurnallar üçün kataloqlar yaradın, onlara müəyyən hüquqlar verin:

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /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 pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. Yoxlayın:

pgbackrest version

Postgres server (sudo istifadəçisi və ya kök):

Postgres serverində pgbackrest quraşdırma prosesi repozitoriyada quraşdırmaya bənzəyir (bəli, pgbackrest hər iki serverdə quraşdırılmalıdır), lakin 6-cı abzasda ikinci və sonuncu əmr:

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

ilə əvəz edin:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Şifrəsiz SSH vasitəsilə serverlər arasında əlaqənin qurulması

Pgbackrest-in düzgün işləməsi üçün açar fayldan istifadə edərək postgres serveri ilə repozitoriya arasında qarşılıqlı əlaqəni konfiqurasiya etmək lazımdır.

Repozitoriya (pgbackrest istifadəçisi):

Bir cüt açar yaradın:

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Diqqət! Yuxarıdakı əmrlər sudo olmadan yerinə yetirilir.

Postgres server (sudo istifadəçisi və ya kök):

Bir cüt açar yaradın:

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

Repozitoriya (sudo istifadəçisi):

Postgres serverinin açıq açarını depo serverinə kopyalayın:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

Bu addımda o, kök istifadəçidən parol istəyəcək. Siz postgres serverinin kök istifadəçisinin parolunu dəqiq daxil etməlisiniz!

Postgres server (sudo istifadəçisi):

Anbarın açıq açarını postgres ilə serverə kopyalayın:

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

Bu addımda o, kök istifadəçidən parol istəyəcək. Siz deponun kök istifadəçisinin parolunu daxil etməlisiniz!

Yoxlayırıq:

Repozitoriya (eksperimentin təmizliyi üçün kök istifadəçi):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres server (eksperimentin təmizliyi üçün kök istifadəçi):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Problemsiz giriş əldə etdiyimizə əminik.

Postgres serverinin qurulması

Postgres server (sudo istifadəçisi və ya kök):

1. Xarici ip-dən postgres serverində “tıqqıltı”ya icazə verək. Bunu etmək üçün faylı redaktə edin postgresql.conf (/etc/postgresql/11/main qovluğunda yerləşir) ona aşağıdakı sətri əlavə etməklə:

listen_addresses = '*'

Əgər belə bir xətt artıq mövcuddursa, ya onu şərhdən çıxarın, ya da parametr dəyərini '*' olaraq təyin edin.

Faylda pg_hba.conf (həmçinin qovluqda yerləşir /etc/postgresql/11/main) aşağıdakı sətirləri əlavə edin:

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

Ü:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. Lazımi parametrləri daxil edək postgresql.conf (qovluqdadır /etc/postgresql/11/main) pgbackrest işləməsi üçün:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Pgbackrest konfiqurasiya faylında (/etc/pgbackrest/pgbackrest.conf) lazımi parametrləri edin:

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

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. Postgresql-i yenidən başladın:

sudo service postgresql restart

Repozitor serverinin qurulması

Repozitoriya (pgbackrest istifadəçisi):

Konfiqurasiya faylında lazımi parametrləri edin pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Kassa yaradın

Repozitoriya (pgbackrest istifadəçisi):

Klaster üçün yeni yaddaş yaradın Elanlar :

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Postgres server (sudo istifadəçisi və ya kök):

Postgres serverini yoxlayın:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Repozitoriya (pgbackrest istifadəçisi):

Repozitor serverini yoxlayın:

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

Çıxışda "kontrolun sonunu yoxlayın: uğurla tamamlandı" sətrini gördüyümüzə əminik.

Yorğun? Ən maraqlısına keçək.

Yedəkləmə

Repozitoriya (pgbackrest istifadəçisi):

1. Yedəkləməni həyata keçirin:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Biz ehtiyat nüsxəsinin yaradıldığına əmin oluruq:

ls /var/lib/pgbackrest/backup/main/

pgbackrest ilk tam ehtiyat nüsxəsini yaradacaq. İstəyirsinizsə, ehtiyat nüsxə əmrini yenidən işlədə və sistemin artımlı ehtiyat nüsxəsini yaratdığından əmin ola bilərsiniz.

Tam ehtiyat nüsxəsini yenidən etmək istəyirsinizsə, əlavə bayraq göstərin:

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

Əgər ətraflı konsol çıxışı istəyirsinizsə, həmçinin qeyd edin:

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

Yedək nüsxəsinin bərpası

Postgres server (sudo istifadəçisi və ya kök):

1. Çalışan klasteri dayandırın:

sudo pg_ctlcluster 11 main stop

2. Yedəkdən bərpa:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

Verilənlər bazasını son FULL ehtiyat nüsxəsinin vəziyyətinə qaytarmaq üçün recovery_target təyin etmədən əmrdən istifadə edin:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore

Vacibdir! Bərpa edildikdən sonra verilənlər bazası bərpa rejimində ilişib qala bilər (ERROR kimi səhvlər olacaq: yalnız oxumaq üçün nəzərdə tutulmuş əməliyyatda DROP DATABASE icra edə bilməz). Düzünü desəm, bunun nə ilə bağlı olduğunu hələ başa düşməmişəm. Həll yolu aşağıdakı kimidir (əmr yerinə yetirildikdən sonra bir az gözləmək lazımdır):

sudo -u postgres psql -c "select pg_wal_replay_resume()"

Əslində, adı ilə müəyyən bir ehtiyat nüsxəsini bərpa etmək mümkündür. Burada yalnız mən varam Sənədlərdə bu xüsusiyyətin təsvirinə keçid verəcəyəm. Tərtibatçılar bu seçimi ehtiyatla istifadə etməyi məsləhət görürlər və bunun səbəbini izah edirlər. Özümdən əlavə edə bilərəm ki, istifadə etmişəm. Əgər həqiqətən ehtiyacınız varsa, bərpa edildikdən sonra verilənlər bazasının bərpa rejimindən çıxdığından əmin olun (seçin pg_is_in_recovery() “f” göstərməlidir) və hər ehtimala qarşı bərpadan sonra tam ehtiyat nüsxəsini çıxarın.

3. Klasteri işə salın:

sudo pg_ctlcluster 11 main start

Yedəkləməni bərpa etdikdən sonra ikinci bir ehtiyat nüsxəsini yerinə yetirməliyik:

Repozitoriya (pgbackrest istifadəçisi):

sudo pgbackrest --stanza=main backup

Hamısı budur. Sonda sizə xatırlatmaq istəyirəm ki, mən heç vaxt özümü yüksək səviyyəli bir dba kimi göstərməyə çalışmıram və ən kiçik fürsətdə buludlardan istifadə edəcəyəm. Hazırda mən özüm ehtiyat nüsxə, replikasiya, monitorinq və s. kimi müxtəlif mövzuları öyrənməyə başlayıram. və cəmiyyətə kiçik bir töhfə vermək üçün nəticələr haqqında kiçik hesabatlar yazıram və özümə kiçik fırıldaq vərəqləri buraxıram.

Növbəti məqalələrdə əlavə funksiyalar haqqında danışmağa çalışacağam - məlumatların təmiz klasterə bərpası, ehtiyat nüsxələrin şifrələnməsi və S3-də dərc edilməsi, rsync vasitəsilə ehtiyat nüsxələri.

Mənbə: www.habr.com

Добавить комментарий