Papildomos postgresql atsarginės kopijos su pgbackrest - kūrėjo kursas jaunam kovotojui

Atsakomybės apribojimas

Aš esu kūrėjas. Rašau kodą ir bendrauju su duomenų baze tik kaip vartotojas. Jokiu būdu neapsimetinėju sistemos administratoriumi, juo labiau dba. Bet…

Taip atsitiko, kad man reikėjo sukurti atsarginę postgresql duomenų bazės kopiją. Jokių debesų – tiesiog naudokite SSH ir įsitikinkite, kad viskas veikia neprašydami pinigų. Ką mes darome tokiais atvejais? Tai va, stumiame pgdump į cron, kasdien viskam atsarginę kopiją į archyvą, o jei visiškai pasiklydome, tai siunčiame šį archyvą kažkur toli.

Šį kartą sunkumas buvo tas, kad pagal planus duomenų bazė turėjo padidėti apie +- 100 MB per dieną. Žinoma, po poros savaičių dings noras viską daryti atsargines kopijas su pgdump. Čia į pagalbą ateina papildomos atsarginės kopijos.

Įdomus? Sveiki atvykę į katę.

Prieauginis atsarginis kopijavimas yra atsarginės kopijos tipas, kai kopijuojami ne visi šaltinio failai, o tik nauji ir tie, kurie buvo pakeisti nuo ankstesnės kopijos sukūrimo.

Kaip ir bet kuris kūrėjas, kuris (tuo metu) VISIŠKAI nenorėjo suprasti postgres subtilybių, norėjau rasti žalią mygtuką. Na, žinote, kaip AWS, DigitalOcean: paspaudėte vieną mygtuką - gavote replikaciją, paspaudėte antrą - sukūrėte atsargines kopijas, trečią - viską atsukate pora valandų. Neradau nei mygtuko, nei gražaus GUI įrankio. Jei žinote vieną (nemokamą ar pigų), parašykite apie tai komentaruose.

Googlinęs radau du įrankius pgbarmanas и pgbackrest. Su pirmuoju man tiesiog nepavyko (labai menka dokumentacija, bandžiau viską išsiaiškinti pagal senus vadovus), bet su antruoju dokumentacija pasirodė lygi, bet ne be trūkumų. Šis straipsnis buvo parašytas siekiant supaprastinti darbą tiems, kurie susiduria su panašia užduotimi.

Perskaitę šį straipsnį, sužinosite, kaip daryti laipsniškas atsargines kopijas, išsaugoti jas nuotoliniame serveryje (saugykloje su atsarginėmis kopijomis) ir atkurti duomenų praradimo ar kitų problemų pagrindiniame serveryje atveju.

Mokymai

Norėdami atkurti vadovą, jums reikės dviejų VPS. Pirmasis bus saugykla (saugykla, kurioje bus saugomos atsarginės kopijos), o antrasis, tiesą sakant, pats serveris su postgres (mano atveju, postgres 11 versija).

Daroma prielaida, kad serveryje su postgres turite root, sudo vartotoją, postgres vartotoją ir yra įdiegtas pats postgres (postgres vartotojas sukuriamas automatiškai diegiant postgresql), o saugyklos serveryje yra root ir sudo vartotojas (instrukcijoje bus naudojamas vartotojo vardas pgbackrest).

Kad atkurdami instrukcijas kiltų mažiau problemų, rašau kursyvu kur, su kokiu vartotoju ir su kokiomis teisėmis įvykdžiau komandą rašant ir tikrinant straipsnį.

Pgbackrest montavimas

Saugykla (vartotojo pgbackrest):

1. Atsisiųskite archyvą iš pgbackrest ir perkelkite jo turinį į /build aplanką:

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

2. Sumontuokite surinkimui reikalingas priklausomybes:

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

3. Pg atlošo surinkimas:

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

4. Nukopijuokite vykdomąjį failą į /usr/bin katalogą:

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

5. Pgbackrest reikia perl. Diegti:

sudo apt-get install perl

6. Sukurkite žurnalų katalogus, suteikite jiems tam tikras teises:

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

pgbackrest version

Postgres serveris (sudo vartotojas arba root):

„pgbackrest“ diegimo procesas serveryje su „postgres“ yra panašus į diegimo procesą saugykloje (taip, pgbackrest turi būti įdiegtas abiejuose serveriuose), bet 6-oje pastraipoje antroji ir paskutinė komandos:

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

pakeisti:

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

Sąveikos tarp serverių nustatymas naudojant SSH be slaptažodžio

Kad pgbackrest veiktų tinkamai, būtina sukonfigūruoti postgres serverio ir saugyklos sąveiką naudojant rakto failą.

Saugykla (vartotojo pgbackrest):

Sukurkite raktų porą:

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

Dėmesio! Aukščiau pateiktas komandas vykdome be sudo.

Postgres serveris (sudo vartotojas arba root):

Sukurkite raktų porą:

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

Saugykla (sudo vartotojas):

Nukopijuokite viešąjį postgres serverio raktą į saugyklos serverį:

(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

Šiame žingsnyje jūsų bus paprašyta įvesti root vartotojo slaptažodį. Turite įvesti postgres serverio root vartotojo slaptažodį!

Postgres serveris (sudo vartotojas):

Nukopijuokite saugyklos viešąjį raktą į serverį naudodami postgres:

(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

Šiame žingsnyje jūsų bus paprašyta įvesti root vartotojo slaptažodį. Turite tiksliai įvesti saugyklos root vartotojo slaptažodį!

Mes patikriname:

Saugykla (šakninis vartotojas, siekiant eksperimento grynumo):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

„Postgres“ serveris (root vartotojas, siekiant eksperimento grynumo):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Užtikriname, kad prieigą gautume be problemų.

Postgres serverio nustatymas

Postgres serveris (sudo vartotojas arba root):

1. Leiskime pasibelsti į postgres serverį iš išorinių IP. Norėdami tai padaryti, redaguokite failą postgresql.conf (esantis /etc/postgresql/11/pagrindiniame aplanke), pridedant prie jo eilutę:

listen_addresses = '*'

Jei tokia eilutė jau yra, panaikinkite jos komentarą arba nustatykite parametro reikšmę kaip „*“.

Byloje pg_hba.conf (taip pat yra aplanke /etc/postgresql/11/main) pridėkite šias eilutes:

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

, jeigu:

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

2. Atlikime reikiamus nustatymus postgresql.conf (jis yra aplanke /etc/postgresql/11/main), kad pgbackrest veiktų:

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

3. Atlikime reikiamus nustatymus pgbackrest konfigūracijos faile (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Iš naujo įkelti postgresql:

sudo service postgresql restart

Saugyklos serverio nustatymas

Saugykla (pgbackrest naudotojas):

Atlikime reikiamus nustatymus konfigūracijos faile 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

Saugyklos kūrimas

Saugykla (pgbackrest naudotojas):

Sukurkite naują saugyklą klasteriui pagrindinis:

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

Проверка

Postgres serveris (sudo vartotojas arba root):

Tikriname postgres serveryje:

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

Saugykla (pgbackrest naudotojas):

Mes tikriname saugyklos serveryje:

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

Įsitikiname, kad išvestyje matome eilutę „tikrinti komandos pabaigą: sėkmingai baigta“.

Pavargęs? Pereikime prie įdomiausios dalies.

Atsarginės kopijos darymas

Saugykla (pgbackrest naudotojas):

1. Padarykite atsarginę kopiją:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Įsitikinkite, kad buvo sukurta atsarginė kopija:

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

Pgbackrest sukurs pirmąją pilną atsarginę kopiją. Jei norite, galite dar kartą paleisti atsarginės kopijos komandą ir įsitikinti, kad sistema sukuria laipsnišką atsarginę kopiją.

Jei norite dar kartą sukurti visą atsarginę kopiją, nurodykite papildomą vėliavėlę:

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

Jei norite išsamios konsolės išvesties, taip pat nurodykite:

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

Atsarginės kopijos atkūrimas

Postgres serveris (sudo vartotojas arba root):

1. Sustabdykite veikiančią grupę:

sudo pg_ctlcluster 11 main stop

2. Atkūrimas iš atsarginės kopijos:

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

Norėdami atkurti duomenų bazę į paskutinės VISOS atsarginės kopijos būseną, naudokite komandą nenurodydami recovery_target:

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

Svarbu! Po atkūrimo gali atsitikti taip, kad duomenų bazė užstrigs atkūrimo režimu (bus tokių klaidų kaip KLAIDA: negalima vykdyti DROP DATABASE tik skaitomoje operacijoje). Jei atvirai, aš dar nesupratau, su kuo tai susiję. Sprendimas yra toks (įvykdžius komandą turėsite šiek tiek palaukti):

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

Tiesą sakant, galima atkurti konkrečią atsarginę kopiją pagal jos pavadinimą. Čia tik aš Nuorodą į šios funkcijos aprašymą pateiksiu dokumentacijoje. Kūrėjai pataria šią parinktį naudoti atsargiai ir paaiškina, kodėl. Galiu pridurti nuo savęs, kad naudojau. Jei tikrai reikia, įsitikinkite, kad po atkūrimo duomenų bazė išeis iš atkūrimo režimo (pasirinkite pg_is_in_recovery() turėtų rodyti „f“) ir tik tuo atveju po atkūrimo padarykite visą atsarginę kopiją.

3. Paleiskite klasterį:

sudo pg_ctlcluster 11 main start

Atkūrę atsarginę kopiją, turime atlikti antrą atsarginę kopiją:

Saugykla (pgbackrest naudotojas):

sudo pgbackrest --stanza=main backup

Tai viskas. Baigdamas noriu priminti, kad jokiu būdu nesistengiu apsimesti vyresniuoju dba ir pasinaudosiu debesimis esant menkiausiai progai. Šiuo metu aš pats pradedu studijuoti įvairias temas, tokias kaip atsarginių kopijų kūrimas, replikavimas, stebėjimas ir kt. ir aš rašau mažas ataskaitas apie rezultatus, kad galėčiau šiek tiek prisidėti prie bendruomenės ir palikti sau mažus lapelius.

Tolesniuose straipsniuose pabandysiu pakalbėti apie papildomas funkcijas – duomenų atkūrimą į švarų klasterį, atsarginių kopijų šifravimą ir publikavimą į S3, atsargines kopijas per rsync.

Šaltinis: www.habr.com

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