Backup postgresql incremental miaraka amin'ny pgbackrest - taranja ho an'ny mpiady tanora avy amin'ny developer

Disclaimer

Mpanamboatra aho. Manoratra kaody aho ary mifandray amin'ny angon-drakitra amin'ny maha mpampiasa azy fotsiny. Na ahoana na ahoana dia tsy miseho ho mpitantana rafitra aho, mainka fa dba. Fa…

Nitranga izany fa nila nandamina backup ny angon-drakitra postgresql aho. Tsy misy rahona - ampiasao SSH fotsiny ary ataovy azo antoka fa mandeha ny zava-drehetra tsy misy vola. Inona no ataontsika amin'ny tranga toy izany? Marina izany, manosika ny pgdump amin'ny cron izahay, mamerina ny zava-drehetra ao amin'ny arisiva isan'andro, ary raha very tanteraka izahay dia alefanay any amin'ny toerana lavitra ity arisiva ity.

Tamin'ity indray mitoraka ity ny fahasarotana dia araka ny drafitra dia tokony hitombo +- 100 MB isan'andro ny angon-drakitra. Mazava ho azy fa rehefa afaka herinandro vitsivitsy dia hanjavona ny faniriana hanao backup ny zava-drehetra amin'ny pgdump. Eto no tonga ny backup incremental ho famonjena.

Mahaliana? Tongasoa eto amin'ny saka.

Ny backup incremental dia karazana backup rehefa tsy ny rakitra loharano rehetra no adika, fa ny vaovao sy ireo niova hatramin'ny namoronana ny kopia teo aloha.

Tahaka ny mpamorona rehetra izay tsy te-hahatakatra (tamin'izany fotoana izany) ny fahasarotan'ny postgres, te hahita ny bokotra maitso aho. Eny, fantatrao, toy ny ao amin'ny AWS, DigitalOcean: nanindry bokotra iray ianao - nahazo replication ianao, nanindry ny faharoa - nanangana backup ianao, ny fahatelo - naverinao ny zava-drehetra nandritra ny adiny roa. Tsy nahita bokotra na fitaovana GUI tsara tarehy aho. Raha fantatrao ny iray (maimaim-poana na mora), manorata momba izany ao amin'ny fanehoan-kevitra.

Taorian'ny google dia nahita fitaovana roa aho pgbarman и pgbackrest. Tsy nahomby tamin'ny voalohany aho (taratasy kely dia kely, niezaka ny hamantatra ny zava-drehetra aho araka ny boky tranainy), fa tamin'ny faharoa kosa dia nihaona ny antontan-taratasy, saingy tsy nisy lesoka. Mba hanatsorana ny asan'ireo izay miatrika asa mitovy amin'izany, dia nosoratana ity lahatsoratra ity.

Rehefa avy mamaky ity lahatsoratra ity ianao dia hianatra ny fomba fanaovana backup incremental, tehirizo amin'ny mpizara lavitra (fitehirizam-bokatra misy backup) ary avereno amin'ny laoniny izy ireo raha misy ny fahaverezan'ny data na olana hafa amin'ny lohamilina lehibe.

Fiomanana

Mba hamerenana ny boky dia mila VPS roa ianao. Ny voalohany dia ny fitahirizana (ny tahiry izay hitahirizana ny backup), ary ny faharoa, raha ny marina, ny mpizara miaraka amin'ny postgres (raha ny ahy, version 11 of postgres).

Heverina fa ao amin'ny server miaraka amin'ny postgres dia manana faka ianao, mpampiasa sudo, mpampiasa postgres ary postgres mihitsy no apetraka (ny mpampiasa postgres dia noforonina ho azy rehefa mametraka postgresql), ary ao amin'ny server repository dia misy root sy sudo user (ao amin'ny manual). ny anaran'ny mpampiasa pgbackrest dia hampiasaina).

Mba ho vitsy kokoa ny olanao rehefa mamerina ny toromarika, dia manoratra amin'ny sora-mandry aho aiza, amin'ny mpampiasa inona ary amin'ny zo inona no nanatanteraka ny baiko rehefa manoratra sy manamarina ny lahatsoratra.

Fametrahana pgbackrest

Repository (mpampiasa pgbackrest):

1. Ampidino avy amin'ny pgbackrest ny arisiva ary afindrao amin'ny lahatahiry /build ny ao anatiny:

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

2. Apetraho ireo fiankinana ilaina amin'ny fivoriambe:

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

3. Fametrahana pgbackrest:

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

4. Adikao amin'ny lahatahiry /usr/bin ny rakitra azo tanterahana:

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

5. Pgbackrest dia mila perl. Mametraka:

sudo apt-get install perl

6. Mamorona lahatahiry ho an'ny diary, omeo zo sasany izy ireo:

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

pgbackrest version

Mpizara Postgres (mpampiasa sudo na faka):

Ny dingan'ny fametrahana pgbackrest amin'ny mpizara misy postgres dia mitovy amin'ny fizotry ny fametrahana ao amin'ny tahiry (eny, pgbackrest tsy maintsy apetraka amin'ny mpizara roa), fa ao amin'ny paragrafy faha-6 ny baiko faharoa sy farany:

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

soloy amin'ny:

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

Mametraka fifandraisana eo amin'ireo mpizara amin'ny alàlan'ny SSH tsy misy tenimiafina

Mba hahafahan'ny pgbackrest miasa tsara dia ilaina ny manamboatra ny fifandraisana eo amin'ny mpizara postgres sy ny tahiry amin'ny fampiasana ny rakitra fototra.

Repository (mpampiasa pgbackrest):

Mamorona mpivady fanalahidy:

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

Miangavy azafady! Manatanteraka ireo baiko etsy ambony tsy misy sudo izahay.

Mpizara Postgres (mpampiasa sudo na faka):

Mamorona mpivady fanalahidy:

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

Repository (mpampiasa sudo):

Adikao amin'ny mpizara fitehirizana ny fanalahidin'ny daholobe an'ny mpizara postgres:

(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

Amin'ity dingana ity dia hangatahana ny tenimiafina ho an'ny mpampiasa root ianao. Mila miditra ny tenimiafina an'ny mpampiasa root amin'ny server postgres ianao!

Mpizara Postgres (mpampiasa sudo):

Adikao amin'ny mpizara miaraka amin'ny postgres ny fanalahidin'ny daholobe:

(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

Amin'ity dingana ity dia hangatahana ny tenimiafina ho an'ny mpampiasa root ianao. Mila ampidirinao tsara ny tenimiafina an'ny mpampiasa root amin'ny tahiry!

Hamarininay:

Repository (mpampiasa root, ho an'ny fahadiovan'ny fanandramana):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Mpizara Postgres (mpampiasa root, ho an'ny fahadiovan'ny andrana):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ataovy azo antoka fa mahazo fidirana tsy misy olana izahay.

Mametraka mpizara postgres

Mpizara Postgres (mpampiasa sudo na faka):

1. Andao avela handondona ny mpizara postgres avy amin'ny IP ivelany. Mba hanaovana izany, manova ny rakitra postgresql.conf ( hita ao amin'ny /etc/postgresql/11/main folder), ampio ny tsipika aminy:

listen_addresses = '*'

Raha toa ka efa misy ny tsipika toy izany, dia asio fanamarihana izany na apetraho ho '*' ny sandan'ny parameter.

Ao anaty rakitra pg_hba.conf (misy koa ao amin'ny lahatahiry /etc/postgresql/11/main) ampio ireto andalana manaraka ireto:

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

izay:

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

2. Andeha isika hanao ny toe-javatra ilaina ao postgresql.conf (misy ao amin'ny folder /etc/postgresql/11/main) mba hiasa ny pgbackrest:

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

3. Andeha hataontsika ao amin'ny fichier configuration pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Avereno indray ny postgresql:

sudo service postgresql restart

Mametraka mpizara fitahirizana

Repository (mpampiasa pgbackrest):

Andao hanao ny fanovana ilaina ao amin'ny fichier configuration 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

Mamorona tahiry

Repository (mpampiasa pgbackrest):

Mamorona fitahirizana vaovao ho an'ny cluster tena:

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

fanaraha-maso

Mpizara Postgres (mpampiasa sudo na faka):

Manamarina ny mpizara postgres izahay:

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

Repository (mpampiasa pgbackrest):

Manamarina ny mpizara repository izahay:

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

Ataovy azo antoka fa ao amin'ny famoahana dia hitantsika ny tsipika "jereo ny baiko farany: vita soa aman-tsara".

Reraka? Andeha isika hifindra any amin'ny ampahany mahaliana indrindra.

Manao backup

Repository (mpampiasa pgbackrest):

1. Manaova backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Ataovy azo antoka fa efa noforonina ny backup:

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

Pgbackrest dia hamorona ny backup feno voalohany. Raha tianao dia azonao atao ny mamerina ny baiko backup ary ataovy azo antoka fa mamorona backup fanampiny ny rafitra.

Raha te hanao backup feno indray ianao dia manendry saina fanampiny:

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

Raha mila vokatra console amin'ny antsipiriany ianao, dia soraty ihany koa:

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

Famerenana ny backup

Mpizara Postgres (mpampiasa sudo na faka):

1. Atsaharo ny cluster mihazakazaka:

sudo pg_ctlcluster 11 main stop

2. Famerenana amin'ny backup:

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

Чтобы восстановить базу в состояние последнего ПОЛНОГО бэкапа используйте команду без указания recovery_target:

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

Важно! После восстановления может оказаться так, что база зависнет в режиме восстановления (будут ошибки в духе ERROR: cannot execute DROP DATABASE in a read-only transaction). Честно говоря, я еще не понял, с чем это связано. Решается следующим образом (нужно будет малость подождать после исполнения команды):

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

На самом деле, есть возможность восстановить конкретный бэкап по его имени. Здесь я лишь укажу ссылку на описание данной фичи в документации. Разработчики советуют использовать данный параметр с осторожностью и объясняют почему. От себя могу добавить, что я его использовал. Если очень нужно — убедитесь, что после восстановления база вышла из recovery mode (select pg_is_in_recovery() должен показать «f») и на всякий случай сделайте полный бэкап после восстановления.

3. Atombohy ny cluster:

sudo pg_ctlcluster 11 main start

Aorian'ny famerenana ny backup dia mila manao backup faharoa isika:

Repository (mpampiasa pgbackrest):

sudo pgbackrest --stanza=main backup

Izay ihany. Fehiny, tiako ny mampahatsiahy anao fa tsy miezaka ny mody ho zokiny dba aho ary hampiasa ny rahona na dia kely aza. Amin'izao fotoana izao, ny tenako dia manomboka mianatra lohahevitra isan-karazany toy ny backup, replication, fanaraha-maso, sns. ary manoratra tatitra kely momba ny vokatra aho mba hanomezana anjara kely ho an'ny fiaraha-monina ary hamela taratasy fitaka kely ho ahy.

Amin'ireto lahatsoratra manaraka ireto dia hiezaka hiresaka momba ny endri-javatra fanampiny aho - famerenana ny angon-drakitra amin'ny cluster madio, fanafenana backups ary famoahana amin'ny S3, backups amin'ny rsync.

Source: www.habr.com

Add a comment