Inkrementalne varnostne kopije postgresql s pgbackrest - tečaj za mladega borca ​​od razvijalca

Izjava o omejitvi odgovornosti

Sem razvijalec. Pišem kodo in komuniciram z bazo le kot uporabnik. Nikakor se ne pretvarjam, da sem sistemski administrator, še manj dba. ampak...

Tako se je zgodilo, da sem moral organizirati varnostno kopijo baze podatkov postgresql. Brez oblakov - samo uporabite SSH in poskrbite, da vse deluje, ne da bi zahtevali denar. Kaj naredimo v takih primerih? Tako je, pgdump stlačimo v cron, vsak dan naredimo varnostno kopijo vsega v arhiv in če smo čisto izgubljeni, pošljemo ta arhiv nekam daleč stran.

Tokratna težava je bila v tem, da naj bi po načrtih baza rasla za cca +- 100 MB na dan. Seveda bo po nekaj tednih želja po varnostnem kopiranju vsega s pgdump izginila. Tu na pomoč priskočijo inkrementalne varnostne kopije.

zanimivo? Dobrodošli pri mački.

Inkrementalno varnostno kopiranje je vrsta varnostnega kopiranja, pri katerem se ne kopirajo vse izvorne datoteke, temveč samo nove in spremenjene od nastanka prejšnje kopije.

Kot vsak razvijalec, ki ABSOLUTNO ni bil pripravljen (takrat) razumeti zapletenosti postgresa, sem želel najti zeleni gumb. No, saj veste, kot v AWS, DigitalOcean: pritisnete en gumb - dobite replikacijo, pritisnete drugega - nastavite varnostne kopije, tretjega - vrnete vse nekaj ur nazaj. Nisem našel gumba ali čudovitega GUI orodja. Če ga poznate (brezplačnega ali poceni), ga napišite v komentar.

Po googlanju sem našel dve orodji pgbarman и pgnaslon. Pri prvem mi preprosto ni uspelo (zelo skopa dokumentacija, vse sem poskušal pogruntati po starih priročnikih), pri drugem pa se je dokumentacija izkazala na nivoju, a ne brez napak. Za poenostavitev dela tistih, ki se soočajo s podobno nalogo, je bil napisan ta članek.

Po branju tega članka se boste naučili narediti inkrementalne varnostne kopije, jih shraniti na oddaljeni strežnik (repozitorij z varnostnimi kopijami) in obnoviti v primeru izgube podatkov ali drugih težav na glavnem strežniku.

Izobraževanje

Za reprodukcijo priročnika boste potrebovali dva VPS. Prvi bo shramba (repozitorij, na katerem bodo shranjene varnostne kopije), drugi pa pravzaprav sam strežnik s postgresom (v mojem primeru različica 11 postgresa).

Predpostavlja se, da imate na strežniku s postgresom root, uporabnika sudo, uporabnika postgres in sam postgres (uporabnik postgres se ustvari samodejno ob namestitvi postgresql), na strežniku repozitorija pa root in uporabnika sudo (v priročniku uporabljeno bo uporabniško ime pgbackrest) .

Da boste imeli manj težav pri razmnoževanju navodil, pišem ležeče kje, s katerim uporabnikom in s kakšnimi pravicami sem izvršil ukaz med pisanjem in preverjanjem članka.

Namestitev naslonjala za hrbet

Repozitorij (uporabnik pgbackrest):

1. Prenesite arhiv iz pgbackrest in prenesite njegovo vsebino v mapo /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. Namestite odvisnosti, potrebne za sestavljanje:

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

3. Sestavljanje naslonjala:

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

4. Kopirajte izvršljivo datoteko v imenik /usr/bin:

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

5. Pgbackrest zahteva perl. Namesti:

sudo apt-get install perl

6. Ustvarite imenike za dnevnike, jim dajte določene pravice:

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

pgbackrest version

Strežnik Postgres (uporabnik sudo ali root):

Postopek namestitve pgbackrest na strežnik s postgresom je podoben postopku namestitve v repozitorij (da, pgbackrest mora biti nameščen na obeh strežnikih), vendar v 6. odstavku drugi in zadnji ukaz:

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

zamenjati z:

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

Nastavitev interakcije med strežniki prek SSH brez gesla

Da bi pgbackrest deloval pravilno, je treba konfigurirati interakcijo med strežnikom postgres in repozitorijem z uporabo datoteke ključev.

Repozitorij (uporabnik pgbackrest):

Ustvarite par ključev:

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

Opozorilo! Zgornje ukaze izvajamo brez sudo.

Strežnik Postgres (uporabnik sudo ali root):

Ustvarite par ključev:

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

Repozitorij (uporabnik sudo):

Kopirajte javni ključ strežnika postgres na strežnik repozitorija:

(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

V tem koraku boste morali vnesti geslo za uporabnika root. Vnesti morate geslo root uporabnika strežnika postgres!

Strežnik Postgres (uporabnik sudo):

Kopirajte javni ključ repozitorija na strežnik s postgresom:

(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

V tem koraku boste morali vnesti geslo za uporabnika root. Vnesti morate natančno geslo korenskega uporabnika repozitorija!

Preverjamo:

Repozitorij (korenski uporabnik, za čistost poskusa):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Strežnik Postgres (korenski uporabnik, za čistost eksperimenta):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Poskrbimo, da imamo dostop brez težav.

Nastavitev strežnika postgres

Strežnik Postgres (uporabnik sudo ali root):

1. Dovolimo trkanje na strežnik postgres z zunanjih IP-jev. Če želite to narediti, uredite datoteko postgresql.conf (ki se nahaja v mapi /etc/postgresql/11/main), ji dodajte vrstico:

listen_addresses = '*'

Če taka vrstica že obstaja, jo odkomentirajte ali nastavite vrednost parametra na '*'.

V datoteki pg_hba.conf (tudi v mapi /etc/postgresql/11/main) dodajte naslednje vrstice:

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

kjer je:

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

2. Naredimo potrebne nastavitve postgresql.conf (je v mapi /etc/postgresql/11/main), da pgbackrest deluje:

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

3. Naredimo potrebne nastavitve v konfiguracijski datoteki pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Ponovno naložite postgresql:

sudo service postgresql restart

Nastavitev strežnika repozitorija

Repozitorij (uporabnik pgbackrest):

Naredimo potrebne nastavitve v konfiguracijski datoteki pgnaslon
(/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

Ustvarjanje repozitorija

Repozitorij (uporabnik pgbackrest):

Ustvarite novo shrambo za gručo Glavni:

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

Проверка

Strežnik Postgres (uporabnik sudo ali root):

Na strežniku postgres preverimo:

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

Repozitorij (uporabnik pgbackrest):

Na strežniku repozitorija preverimo:

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

Prepričamo se, da v izhodu vidimo vrstico "preverite konec ukaza: uspešno zaključen".

Utrujeni? Preidimo na najbolj zanimiv del.

Izdelava varnostne kopije

Repozitorij (uporabnik pgbackrest):

1. Izvedite varnostno kopijo:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Prepričajte se, da je bila ustvarjena varnostna kopija:

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

Pgbackrest bo ustvaril prvo popolno varnostno kopijo. Če želite, lahko znova zaženete ukaz za varnostno kopiranje in poskrbite, da sistem ustvari inkrementalno varnostno kopijo.

Če želite znova narediti popolno varnostno kopijo, določite dodatno zastavico:

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

Če želite podroben izpis konzole, navedite tudi:

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

Obnavljanje varnostne kopije

Strežnik Postgres (uporabnik sudo ali root):

1. Ustavite delujočo gručo:

sudo pg_ctlcluster 11 main stop

2. Obnovitev iz varnostne kopije:

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

Če želite bazo podatkov obnoviti v stanje zadnje POLNE varnostne kopije, uporabite ukaz brez navedbe recovery_target:

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

Pomembno! Po obnovitvi se lahko zgodi, da se baza podatkov zatakne v obnovitvenem načinu (prišlo bo do napak, kot je NAPAKA: ni mogoče izvesti DROP DATABASE v transakciji samo za branje). Če sem iskren, še nisem razumel, s čim je to povezano. Rešitev je naslednja (po izvedbi ukaza boste morali malo počakati):

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

Pravzaprav je mogoče obnoviti določeno varnostno kopijo po njenem imenu. Tukaj sem samo jaz Posredoval bom povezavo do opisa te funkcije v dokumentaciji. Razvijalci svetujejo, da to možnost uporabljate previdno in pojasnjujejo, zakaj. Od sebe lahko dodam, da sem ga uporabljal. Če res morate, se prepričajte, da baza podatkov po obnovitvi zapusti obnovitveni način (izberite pg_is_in_recovery() mora biti prikazano »f«) in za vsak slučaj naredite popolno varnostno kopijo po obnovitvi.

3. Zaženite gručo:

sudo pg_ctlcluster 11 main start

Po obnovitvi varnostne kopije moramo izvesti drugo varnostno kopijo:

Repozitorij (uporabnik pgbackrest):

sudo pgbackrest --stanza=main backup

To je vse. Na koncu bi vas rad spomnil, da se nikakor ne poskušam pretvarjati, da sem višji dba in bom ob najmanjši priložnosti uporabil oblake. Trenutno tudi sam začenjam študirati različne teme, kot so varnostno kopiranje, replikacija, spremljanje itd. in pišem majhna poročila o rezultatih, da malo prispevam k skupnosti in pustim majhne goljufije zase.

V naslednjih člankih bom poskušal govoriti o dodatnih funkcijah - obnovitev podatkov v čisto gručo, šifriranje varnostnih kopij in objavljanje v S3, varnostne kopije prek rsync.

Vir: www.habr.com

Dodaj komentar