Vastutusest loobumine
Olen arendaja. Kirjutan koodi ja suhtlen andmebaasiga ainult kasutajana. Ma ei teeskle mitte mingil juhul süsteemiadministraatorit, veel vähem dba-d. Aga…
Juhtus nii, et mul oli vaja korraldada postgresql andmebaasi varukoopia. Pole pilvi – kasutage lihtsalt SSH-d ja veenduge, et kõik töötab ilma raha küsimata. Mida me sellistel juhtudel teeme? Just, me lükkame pgdumpi cronisse, varundame iga päev kõik arhiivi ja kui oleme täiesti kadunud, saadame selle arhiivi kuhugi kaugele.
Seekord oli raskuseks see, et plaanide järgi pidi andmebaas kasvama ca +- 100 MB päevas. Muidugi kaob paari nädala pärast soov pgdumpiga kõike varundada. Siin tulevad appi astmelised varukoopiad.
Täiendav varundamine on varukoopia tüüp, mille puhul ei kopeerita kõiki lähtefaile, vaid ainult uusi ja neid, mida on muudetud pärast eelmise koopia loomist.
Nagu iga arendaja, kes ei tahtnud (tol ajal) absoluutselt postgresi keerukust mõista, tahtsin leida rohelist nuppu. Noh, teate, nagu AWS-is, DigitalOceanis: vajutasite ühte nuppu - saite replikatsiooni, vajutasite teist - seadistasite varukoopiaid, kolmandat - rullisite kõik paar tundi tagasi. Ma ei leidnud nuppu ega ilusat GUI-tööriista. Kui teate mõnda (tasuta või odavat), kirjutage sellest kommentaaridesse.
Peale guugeldamist leidsin kaks tööriista pgbarman и pgseljatugi. Esimesega ma lihtsalt ei õnnestunud (väga hõre dokumentatsioon, püüdsin vanade juhendite järgi kõike selgeks teha), kuid teisega osutus dokumentatsioon tasemel, kuid mitte ilma puudusteta. See artikkel kirjutati, et lihtsustada nende inimeste tööd, kes seisavad silmitsi sarnase ülesandega.
Pärast selle artikli lugemist saate teada, kuidas teha järkjärgulisi varukoopiaid, salvestada need kaugserverisse (varukoopiatega hoidlasse) ja taastada andmete kadumise või muude põhiserveri probleemide korral.
Koolitus
Käsiraamatu taasesitamiseks vajate kahte VPS-i. Esimene on salvestusruum (hoidla, kuhu varukoopiaid salvestatakse) ja teine, tegelikult server ise koos postgresiga (minu puhul postgresi versioon 11).
Eeldatakse, et postgres-iga serveris on root, sudo kasutaja, postgres kasutaja ja postgres ise on installitud (postgres-i kasutaja luuakse automaatselt postgresql-i installimisel) ning hoidlaserveris on root ja sudo kasutaja (juhendis kasutatakse kasutajanime pgbackrest).
Et teil oleks juhendite taasesitamisel vähem probleeme, kirjutan kaldkirjas kus, millise kasutajaga ja milliste õigustega ma käsu täitsin artiklit kirjutades ja kontrollides.
pgbackresti paigaldamine
Hoidla (kasutaja pgbackrest):
1. Laadige arhiiv alla pgbackrestist ja teisaldage selle sisu kausta /build:
sudo mkdir /build
sudo wget -q -O -
https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz |
sudo tar zx -C /build
2. Paigaldage kokkupanekuks vajalikud sõltuvused:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev
3. Pg-seljatoe kokkupanek:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src
4. Kopeerige käivitatav fail kataloogi /usr/bin:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest
5. Pgbackrest nõuab perli. Installige:
sudo apt-get install perl
6. Looge logide jaoks kataloogid, andke neile teatud õigused:
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. Kontrollige:
pgbackrest version
Postgresi server (sudo kasutaja või root):
Pgbackresti installimise protsess postgresiga serverisse sarnaneb hoidlasse installimisega (jah, pgbackrest peab olema installitud mõlemasse serverisse), kuid 6. lõigus käske teine ja viimane:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
asendada järgmisega:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
Serveritevahelise suhtluse seadistamine paroolita SSH kaudu
Pgbackresti korrektseks tööks on vaja võtmefaili abil konfigureerida postgresi serveri ja hoidla vaheline suhtlus.
Hoidla (kasutaja pgbackrest):
Looge võtmepaar:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""
Hoiatus! Käitame ülaltoodud käsud ilma sudota.
Postgresi server (sudo kasutaja või root):
Looge võtmepaar:
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 ""
Hoidla (sudo kasutaja):
Kopeerige postgresi serveri avalik võti hoidla serverisse:
(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
Selles etapis küsitakse teilt juurkasutaja parooli. Peate sisestama postgresi serveri juurkasutaja parooli!
Postgresi server (sudo kasutaja):
Kopeerige hoidla avalik võti serverisse koos postgresiga:
(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
Selles etapis küsitakse teilt juurkasutaja parooli. Peate sisestama täpselt hoidla juurkasutaja parooli!
Kontrollime:
Hoidla (juurkasutaja katse puhtuse huvides):
sudo -u pgbackrest ssh postgres@<postgres_server_ip>
Postgresi server (juurkasutaja katse puhtuse huvides):
sudo -u postgres ssh pgbackrest@<repository_server_ip>
Tagame, et pääseme probleemideta ligi.
Postgresi serveri seadistamine
Postgresi server (sudo kasutaja või root):
1. Lubame väliste IP-aadresside kaudu koputada postgres-serverile. Selleks redigeerige faili postgresql.conf (asub /etc/postgresql/11/peakaustas), lisades sellele rea:
listen_addresses = '*'
Kui selline rida on juba olemas, eemaldage see kommentaaridest või määrake parameetri väärtuseks "*".
Failis pg_hba.conf (asub ka kaustas /etc/postgresql/11/main) lisage järgmised read:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5
kus:
hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля
2. Teeme sisse vajalikud seadistused postgresql.conf (see on kaustas /etc/postgresql/11/main), et pgbackrest töötaks:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica
3. Teeme vajalikud seadistused pgbackrest konfiguratsioonifailis (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=<repository_server_ip>
4. Laadige uuesti postgresql:
sudo service postgresql restart
Hoidlaserveri seadistamine
Hoidla (pgbackresti kasutaja):
Teeme vajalikud seadistused konfiguratsioonifailis pgseljatugi
(/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
Hoidla loomine
Hoidla (pgbackresti kasutaja):
Looge klastri jaoks uus salvestusruum põhiline:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Проверка
Postgresi server (sudo kasutaja või root):
Kontrollime postgresi serveris:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info check
Hoidla (pgbackresti kasutaja):
Kontrollime hoidlaserveris:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check
Veenduge, et väljundis näeme rida "kontrolli käsu lõppu: edukalt lõpetatud".
Väsinud? Liigume edasi kõige huvitavama osa juurde.
Varukoopia tegemine
Hoidla (pgbackresti kasutaja):
1. Tehke varukoopia:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Veenduge, et varukoopia oleks loodud:
ls /var/lib/pgbackrest/backup/main/
Pgbackrest loob esimese täieliku varukoopia. Soovi korral saate varunduskäsu uuesti käivitada ja veenduda, et süsteem loob järkjärgulise varukoopia.
Kui soovite uuesti täieliku varukoopia teha, määrake täiendav lipp:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backup
Kui soovite konsooli üksikasjalikku väljundit, määrake ka:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup
Varukoopia taastamine
Postgresi server (sudo kasutaja või root):
1. Peatage töötav klaster:
sudo pg_ctlcluster 11 main stop
2. Varukoopiast taastamine:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore
Andmebaasi taastamiseks viimase FULL varukoopia olekusse kasutage käsku ilma recovery_target määramata:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore
Tähtis! Pärast taastamist võib juhtuda, et andmebaas takerdub taasterežiimi (esineb tõrkeid nagu VIGA: kirjutuskaitstud tehingus ei saa DROP DATABASE'i käivitada). Ausalt öeldes pole ma veel aru saanud, millega see seotud on. Lahendus on järgmine (peate pärast käsu täitmist veidi ootama):
sudo -u postgres psql -c "select pg_wal_replay_resume()"
Tegelikult on võimalik konkreetne varukoopia selle nime järgi taastada. Siin ma olen ainult
3. Käivitage klaster:
sudo pg_ctlcluster 11 main start
Pärast varukoopia taastamist peame tegema teise varukoopia:
Hoidla (pgbackresti kasutaja):
sudo pgbackrest --stanza=main backup
See on kõik. Kokkuvõtteks tuletan meelde, et ma ei ürita mingil juhul teeselda, et olen vanem dba ja kasutan pilvi vähimalgi võimalusel. Hetkel hakkan ise uurima erinevaid teemasid nagu varundamine, replikatsioon, monitooring jne. ja kirjutan tulemustest väikseid raporteid, et anda väike panus kogukonna heaks ja jätta endale väikesed petulehed.
Järgmistes artiklites püüan rääkida lisavõimalustest - andmete taastamine puhtasse klastrisse, varukoopiate krüpteerimine ja S3-le avaldamine, varukoopiad rsynci kaudu.
Allikas: www.habr.com