Pgbackrest bilan qo'shimcha postgresql zaxiralari - dasturchining yosh jangchisi uchun kurs

Rad etish

Men dasturchiman. Men kod yozaman va ma'lumotlar bazasi bilan faqat foydalanuvchi sifatida ishlayman. Hech qanday holatda men o'zimni tizim administratori sifatida ko'rsatmayman, bundan tashqari, dba. Lekin…

Shunday qilib, men postgresql ma'lumotlar bazasining zaxira nusxasini tashkil qilishim kerak edi. Bulutlar yo'q - faqat SSH dan foydalaning va hamma narsa pul so'ramasdan ishlashiga ishonch hosil qiling. Bunday hollarda nima qilamiz? To'g'ri, biz pgdumpni cronga suramiz, har kuni arxivga hamma narsani zaxiralaymiz va agar biz butunlay yo'qolgan bo'lsak, bu arxivni uzoqroqqa jo'natamiz.

Bu safargi qiyinchilik shundaki, rejalarga ko'ra, ma'lumotlar bazasi kuniga taxminan +-100 MB ga o'sishi kerak edi. Albatta, bir necha hafta o'tgach, hamma narsani pgdump bilan zaxiralash istagi yo'qoladi. Bu erda qo'shimcha zaxiralar yordamga keladi.

Qiziqmi? Mushukga xush kelibsiz.

Qo'shimcha zaxira nusxasi barcha manba fayllardan nusxa ko'chirilmasa, faqat yangilari va oldingi nusxasi yaratilganidan keyin o'zgartirilganlar nusxa ko'chirilsa, zaxiralash turidir.

Postgresning nozik tomonlarini tushunishni mutlaqo istamagan (o'sha paytda) har qanday ishlab chiquvchi singari, men yashil tugmani topmoqchi edim. Bilasizmi, AWS, DigitalOcean-da bo'lgani kabi: siz bitta tugmani bosdingiz - siz replikatsiyaga ega bo'ldingiz, ikkinchisini bosdingiz - siz zaxira nusxalarini o'rnatdingiz, uchinchisi - hamma narsani bir necha soat orqaga qaytardingiz. Men tugma yoki chiroyli GUI vositasini topmadim. Agar siz bilsangiz (bepul yoki arzon), bu haqda sharhlarda yozing.

Googlingdan so'ng men ikkita vositani topdim pgbarman ΠΈ pgbackrest. Birinchisi bilan muvaffaqiyatga erisha olmadim (juda siyrak hujjatlar, men hamma narsani eski qo'llanmalarga ko'ra aniqlashga harakat qildim), lekin ikkinchisida hujjatlar teng bo'lib chiqdi, ammo kamchiliklarsiz emas. Shu kabi vazifaga duch kelganlarning ishini soddalashtirish uchun ushbu maqola yozilgan.

Ushbu maqolani o'qib chiqqandan so'ng, siz qo'shimcha zaxira nusxalarini yaratishni, ularni uzoq serverga (zaxira nusxalari bilan ombor) saqlashni va ma'lumotlar yo'qolishi yoki asosiy serverdagi boshqa muammolarda ularni qanday tiklashni o'rganasiz.

o'quv

Qo'llanmani takrorlash uchun sizga ikkita VPS kerak bo'ladi. Birinchisi, saqlash joyi (zaxira nusxalari saqlanadigan ombor) va ikkinchisi, aslida postgresli serverning o'zi (mening holimda, postgresning 11-versiyasi).

Postgresli serverda root, sudo foydalanuvchisi, postgres foydalanuvchisi va postgresning o'zi o'rnatilgan (postgres foydalanuvchisi postgresql-ni o'rnatishda avtomatik ravishda yaratiladi) va ombor serverida root va sudo foydalanuvchisi (qo'llanmada) mavjud deb taxmin qilinadi. pgbackrest foydalanuvchi nomi ishlatiladi).

Ko'rsatmalarni takrorlashda kamroq muammolarga duch kelishingiz uchun men kursiv bilan yozaman qayerda, qaysi foydalanuvchi bilan va qanday huquqlar bilan buyruqni bajardim maqolani yozish va tekshirish paytida.

Pgbackrest o'rnatilmoqda

Repository (foydalanuvchi pgbackrest):

1. Arxivni pgbackrest-dan yuklab oling va uning mazmunini /build papkasiga o'tkazing:

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

2. Yig'ish uchun zarur bo'lgan bog'liqliklarni o'rnating:

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

3. Pgbackrestni yig'ish:

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

4. Bajariladigan faylni /usr/bin katalogiga nusxalash:

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

5. Pgbackrest uchun Perl kerak. O'rnatish:

sudo apt-get install perl

6. Jurnallar uchun kataloglar yarating, ularga ma'lum huquqlarni bering:

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. Tekshiring:

pgbackrest version

Postgres serveri (sudo foydalanuvchisi yoki root):

Postgresli serverga pgbackrest-ni o'rnatish jarayoni ombordagi o'rnatish jarayoniga o'xshaydi (ha, pgbackrest ikkala serverda ham o'rnatilishi kerak), lekin 6-bandda ikkinchi va oxirgi buyruqlar:

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

bilan almashtiring:

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

Parolsiz SSH orqali serverlar o'rtasida o'zaro aloqani o'rnatish

Pgbackrest to'g'ri ishlashi uchun kalit fayli yordamida postgres serveri va ombor o'rtasidagi o'zaro aloqani sozlash kerak.

Repository (foydalanuvchi pgbackrest):

Kalitlar juftligini yarating:

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

E'tibor bering! Yuqoridagi buyruqlarni sudosiz bajaramiz.

Postgres serveri (sudo foydalanuvchisi yoki root):

Kalitlar juftligini yarating:

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 ""

Repozitoriy (sudo foydalanuvchisi):

Postgres serverining ochiq kalitini ombor serveriga nusxalash:

(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

Ushbu bosqichda sizdan root foydalanuvchisi uchun parol so'raladi. Postgres serverining asosiy foydalanuvchisi parolini kiritishingiz kerak!

Postgres serveri (sudo foydalanuvchisi):

Postgres yordamida omborning ochiq kalitini serverga nusxalash:

(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

Ushbu bosqichda sizdan root foydalanuvchisi uchun parol so'raladi. Siz omborning ildiz foydalanuvchisining parolini aniq kiritishingiz kerak!

Biz tekshiramiz:

Repozitoriy (eksperimentning tozaligi uchun ildiz foydalanuvchisi):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres server (eksperimentning tozaligi uchun ildiz foydalanuvchisi):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Biz muammosiz kirishimizga ishonch hosil qilamiz.

Postgres serverini sozlash

Postgres serveri (sudo foydalanuvchisi yoki root):

1. Postgres serverini tashqi IP-lardan taqillatishga ruxsat beraylik. Buning uchun faylni tahrirlang postgresql.conf (/etc/postgresql/11/main papkasida joylashgan), unga qator qo'shing:

listen_addresses = '*'

Agar bunday qator allaqachon mavjud bo'lsa, uni izohdan olib tashlang yoki parametr qiymatini "*" sifatida o'rnating.

Fayl ichida pg_hba.conf (shuningdek, jildda joylashgan /etc/postgresql/11/main) quyidagi qatorlarni qoβ€˜shing:

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

qaerda:

hostssl/host - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Ρ‡Π΅Ρ€Π΅Π· SSL (ΠΈΠ»ΠΈ Π½Π΅Ρ‚)
all - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм Π±Π°Π·Π°ΠΌ
all - имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (всСм)
0.0.0.0/0 - маска сСти с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ
md5 - способ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ пароля

2. Kerakli sozlamalarni o'rnatamiz postgresql.conf (u papkada joylashgan /etc/postgresql/11/main) pgbackrest ishlashi uchun:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Π“Π΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ кластСра. ΠŸΡ€ΠΈ установкС postgres автоматичСски создаСт кластСр main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. Pgbackrest konfiguratsiya faylida (/etc/pgbackrest/pgbackrest.conf) kerakli sozlamalarni o'rnatamiz:

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

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

4. Postgresql-ni qayta yuklang:

sudo service postgresql restart

Repozitoriy serverni sozlash

Repository (pgbackrest foydalanuvchisi):

Konfiguratsiya faylida kerakli sozlamalarni o'rnatamiz 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

Repozitoriy yaratish

Repository (pgbackrest foydalanuvchisi):

Klaster uchun yangi xotira yarating asosiy:

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

tekshirish

Postgres serveri (sudo foydalanuvchisi yoki root):

Biz postgres serverini tekshiramiz:

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

Repository (pgbackrest foydalanuvchisi):

Biz ombor serverini tekshiramiz:

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

Biz chiqishda "buyruqning tugashini tekshirish: muvaffaqiyatli yakunlandi" qatorini ko'rishimizga ishonch hosil qilamiz.

Charchadimi? Keling, eng qiziqarli qismga o'tamiz.

Zaxira nusxasini yaratish

Repository (pgbackrest foydalanuvchisi):

1. Zaxira nusxasini yarating:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Zaxira yaratilganligiga ishonch hosil qiling:

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

Pgbackrest birinchi to'liq zaxira nusxasini yaratadi. Agar xohlasangiz, zaxiralash buyrug'ini qayta ishga tushirishingiz va tizim qo'shimcha zaxira yaratishiga ishonch hosil qilishingiz mumkin.

Agar siz yana to'liq zaxiralashni xohlasangiz, qo'shimcha bayroqni belgilang:

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

Agar siz konsolning batafsil chiqishini istasangiz, quyidagilarni ham belgilang:

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

Zaxira nusxasini tiklash

Postgres serveri (sudo foydalanuvchisi yoki root):

1. Ishlayotgan klasterni to'xtating:

sudo pg_ctlcluster 11 main stop

2. Zaxiradan tiklash:

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

Ma'lumotlar bazasini oxirgi TO'LIQ zahira nusxasi holatiga qaytarish uchun recovery_target ni ko'rsatmasdan buyruqdan foydalaning:

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

Muhim! Qayta tiklashdan so'ng, ma'lumotlar bazasi qayta tiklash rejimida tiqilib qolishi mumkin (XATA kabi xatolar bo'ladi: faqat o'qish uchun tranzaksiyada DROP DATABASE-ni bajarib bo'lmaydi). Rostini aytsam, bu nima bilan bog'liqligini hali tushunmadim. Yechim quyidagicha (buyruq bajarilgandan keyin biroz kutishingiz kerak bo'ladi):

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

Aslida, ma'lum bir zaxira nusxasini uning nomi bilan tiklash mumkin. Mana men faqat Men hujjatlarda ushbu xususiyatning tavsifiga havola beraman. Ishlab chiquvchilar ushbu variantni ehtiyotkorlik bilan ishlatishni maslahat berishadi va sababini tushuntiradilar. Men undan foydalanganimni o'zimdan qo'shishim mumkin. Agar sizga haqiqatan ham kerak bo'lsa, qayta tiklashdan so'ng ma'lumotlar bazasi tiklash rejimidan chiqishiga ishonch hosil qiling (pg_is_in_recovery() ni tanlang "f" ko'rinishi kerak) va har qanday holatda qayta tiklangandan keyin to'liq zaxira nusxasini yarating.

3. Klasterni ishga tushiring:

sudo pg_ctlcluster 11 main start

Zaxira nusxasini tiklagandan so'ng, biz ikkinchi zahirani amalga oshirishimiz kerak:

Repository (pgbackrest foydalanuvchisi):

sudo pgbackrest --stanza=main backup

Ana xolos. Xulosa qilib shuni eslatib o'tmoqchimanki, men hech qanday holatda o'zimni katta dba sifatida ko'rsatishga harakat qilmayman va eng kichik imkoniyatda bulutlardan foydalanaman. Hozirda men o'zim zaxira, replikatsiya, monitoring va hokazo kabi turli mavzularni o'rganishni boshlayapman. va men jamiyatga ozgina hissa qo'shish uchun natijalar haqida kichik hisobotlar yozaman va o'zim uchun kichik cheat varaqlarini qoldiraman.

Keyingi maqolalarda men qo'shimcha funktsiyalar haqida gapirishga harakat qilaman - toza klasterga ma'lumotlarni qayta tiklash, zaxira nusxalarini shifrlash va S3-ga nashr qilish, rsync orqali zaxiralash.

Manba: www.habr.com

a Izoh qo'shish