Backups postgresql inkrementali b'pgbackrest - kors għal ġlied żagħżugħ mill-iżviluppatur

Ċaħda

Jien żviluppatur. Nikteb kodiċi u jinteraġixxi mad-database biss bħala utent. Bl-ebda mod ma nippretendu li nkun amministratur tas-sistema, u wisq inqas dba. Imma...

Ġara li kelli bżonn norganizza backup tad-database postgresql. Ebda sħab - uża biss SSH u kun żgur li kollox jaħdem mingħajr ma titlob flus. X'nagħmlu f'każijiet bħal dawn? Dak id-dritt, aħna nimbottaw pgdump fis-cron, tagħmel backup ta 'kollox fl-arkivju kuljum, u jekk nintilfu kompletament, nibagħtu dan l-arkivju x'imkien 'il bogħod.

Din id-darba d-diffikultà kienet li skont il-pjanijiet, id-database suppost kellha tikber b'madwar +- 100 MB kuljum. Naturalment, wara ftit ġimgħat ix-xewqa li tagħmel backup ta 'kollox ma' pgdump se tisparixxi. Dan huwa fejn backups inkrementali jiġu għas-salvataġġ.

Interessanti? Merħba għall-qattus.

Il-backup inkrementali huwa tip ta 'backup meta mhux il-fajls tas-sors kollha jiġu kkupjati, iżda dawk ġodda biss u dawk mibdula mill-ħolqien tal-kopja preċedenti.

Bħal kull żviluppatur li ma kienx ASSOLUTAMENT lest (dak iż-żmien) li jifhem l-intricacies tal-postgres, ridt insib il-buttuna ħadra. Tajjeb, taf, bħal f'AWS, DigitalOcean: għafast buttuna waħda - għafast replikazzjoni, għafast it-tieni - waqqaft backups, it-tielet - irromblajt kollox lura ftit sigħat. Ma sibtx buttuna jew għodda GUI sabiħa. Jekk taf waħda (b'xejn jew irħisa), ikteb dwarha fil-kummenti.

Wara google sibt żewġ għodod pgbarman и pgbackrest. Sempliċement ma rnexxilix bl-ewwel waħda (dokumentazzjoni skarsa ħafna, ippruvajt nifhem kollox skont manwali qodma), iżda bit-tieni waħda d-dokumentazzjoni rriżultat li kienet sa l-istess, iżda mhux mingħajr difetti. Biex tissimplifika l-ħidma ta 'dawk li huma ffaċċjati b'kompitu simili, dan l-artikolu inkiteb.

Wara li taqra dan l-artikolu, titgħallem kif tagħmel backups inkrementali, issalvahom f'server remot (repożitorju b'backups) u tirrestawrahom f'każ ta 'telf ta' data jew problemi oħra fuq is-server prinċipali.

Taħriġ

Biex tirriproduċi l-manwal ser ikollok bżonn żewġ VPS. L-ewwel se jkun il-ħażna (ir-repożitorju li fuqu se jinħażnu l-backups), u t-tieni, fil-fatt, is-server innifsu ma 'postgres (fil-każ tiegħi, verżjoni 11 ta' postgres).

Huwa preżunt li fuq is-server bil-postgres għandek root, sudo user, postgres user u postgres innifsu huwa installat (l-utent postgres jinħoloq awtomatikament meta jinstalla postgresql), u fuq is-server tar-repożitorju hemm root u sudo user (fil-manwal se jintuża l-isem tal-utent pgbackrest).

Sabiex ikollok inqas problemi meta tirriproduċi l-istruzzjonijiet, nikteb bil-korsiv fejn, b'liema utent u b'liema drittijiet wettaqt il-kmand waqt li tikteb u tiċċekkja l-artiklu.

Installazzjoni ta' pgbackrest

Repożitorju (utent pgbackrest):

1. Niżżel l-arkivju minn pgbackrest u ttrasferixxi l-kontenut tiegħu fil-folder /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. Installa d-dipendenzi meħtieġa għall-assemblaġġ:

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

3. Armar ta 'pgbackrest:

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

4. Ikkopja l-fajl eżekutibbli fid-direttorju /usr/bin:

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

5. Pgbackrest jeħtieġ perl. Installa:

sudo apt-get install perl

6. Oħloq direttorji għal zkuk, agħtihom ċerti drittijiet:

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. Iċċekkja:

pgbackrest version

Server Postgres (utent sudo jew root):

Il-proċess ta 'installazzjoni ta' pgbackrest fuq server b'postgres huwa simili għall-proċess ta 'installazzjoni fuq ir-repożitorju (iva, pgbackrest għandu jkun installat fuq iż-żewġ servers), iżda fis-6 paragrafu it-tieni u l-aħħar kmandi:

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

ibdel bi:

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

Twaqqif ta' interazzjoni bejn servers permezz ta' SSH mingħajr password

Sabiex pgbackrest jaħdem b'mod korrett, huwa meħtieġ li tiġi kkonfigurata l-interazzjoni bejn is-server postgres u r-repożitorju billi tuża l-fajl ewlieni.

Repożitorju (utent pgbackrest):

Oħloq par ewlieni:

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

Attenzjoni! Aħna nħaddmu l-kmandi ta 'hawn fuq mingħajr sudo.

Server Postgres (utent sudo jew root):

Oħloq par ewlieni:

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

Repożitorju (utent sudo):

Ikkopja ċ-ċavetta pubblika tas-server postgres fis-server tar-repożitorju:

(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

F'dan il-pass inti tintalab il-password għall-utent root. Għandek bżonn iddaħħal il-password tal-utent tal-għeruq tas-server postgres!

Server Postgres (utent sudo):

Ikkopja ċ-ċavetta pubblika tar-repożitorju fis-server b'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

F'dan il-pass inti tintalab il-password għall-utent root. Ikollok bżonn iddaħħal eżattament il-password tal-utent għerq tar-repożitorju!

Aħna niċċekkjaw:

Repożitorju (utent għeruq, għall-purità tal-esperiment):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Server Postgres (utent għeruq, għall-purità tal-esperiment):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Aħna niżguraw li jkollna aċċess mingħajr problemi.

Twaqqif ta' server postgres

Server Postgres (utent sudo jew root):

1. Ejja nħallu jħabbtu fuq is-server tal-postgres minn IPs esterni. Biex tagħmel dan, editja l-fajl postgresql.conf (li tinsab fil-folder /etc/postgresql/11/main), żżid il-linja miegħu:

listen_addresses = '*'

Jekk linja bħal din diġà teżisti, jew neħħi l-kumment jew issettja l-valur tal-parametru bħala '*'.

Fil-fajl pg_hba.conf (li tinsab ukoll fil-folder /etc/postgresql/11/main) żid il-linji li ġejjin:

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

fejn:

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

2. Ejja nagħmlu s-settings meħtieġa fi postgresql.conf (huwa fil-folder /etc/postgresql/11/main) biex pgbackrest jaħdem:

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

3. Ejja nagħmlu s-settings meħtieġa fil-fajl tal-konfigurazzjoni pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Reload postgresql:

sudo service postgresql restart

Twaqqif ta' server ta' repożitorju

Repożitorju (utent pgbackrest):

Ejja nagħmlu s-settings meħtieġa fil-fajl tal-konfigurazzjoni 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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий - первые два будут удалены вместе с инкрементами. 
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

Ħolqien ta' repożitorju

Repożitorju (utent pgbackrest):

Oħloq ħażna ġdida għall-cluster prinċipali:

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

Проверка

Server Postgres (utent sudo jew root):

Aħna niċċekkjaw fuq is-server tal-postgres:

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

Repożitorju (utent pgbackrest):

Aħna niċċekkjaw fuq is-server tar-repożitorju:

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

Aħna niżguraw li fl-output naraw il-linja "iċċekkja t-tmiem tal-kmand: komplut b'suċċess".

Għajjien? Ejja ngħaddu għall-aktar parti interessanti.

Nagħmlu backup

Repożitorju (utent pgbackrest):

1. Agħmel backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Kun żgur li tkun inħoloq backup:

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

Pgbackrest se joħloq l-ewwel backup sħiħ. Jekk tixtieq, tista 'tħaddem il-kmand tal-backup mill-ġdid u kun żgur li s-sistema toħloq backup inkrementali.

Jekk trid terġa' tagħmel backup sħiħ, imbagħad speċifika bandiera addizzjonali:

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

Jekk trid output tal-console dettaljati, imbagħad speċifika wkoll:

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

Ir-restawr ta' backup

Server Postgres (utent sudo jew root):

1. Waqqaf il-cluster running:

sudo pg_ctlcluster 11 main stop

2. Ir-restawr mill-backup:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Ibda l-cluster:

sudo pg_ctlcluster 11 main start

Wara li nirrestawraw il-backup, irridu nwettqu t-tieni backup:

Repożitorju (utent pgbackrest):

sudo pgbackrest --stanza=main backup

Dak kollox. Bħala konklużjoni, nixtieq infakkarkom li bl-ebda mod qed nipprova nippretendu li jien dba anzjan u se nuża s-sħab mal-iċken opportunità. Bħalissa, jien stess qed nibda nistudja diversi suġġetti bħal backup, replikazzjoni, monitoraġġ, eċċ. u nikteb rapporti żgħar dwar ir-riżultati sabiex nagħti kontribut żgħir lill-komunità u nħalli cheat sheets żgħar għalija nnifsi.

Fl-artikoli li ġejjin ser nipprova nitkellem dwar karatteristiċi addizzjonali - irkupru tad-data għal cluster nadif, encryption ta 'backups u pubblikazzjoni għal S3, backups permezz ta' rsync.

Sors: www.habr.com

Żid kumment