Sovgad postgresql ak pgbackrest - yon kou pou yon jèn avyon de gè soti nan pwomotè a

Limit responsabilite nou

Mwen se yon devlopè. Mwen ekri kòd epi kominike avèk baz done a sèlman kòm yon itilizatè. Nan okenn fason mwen pretann yo dwe yon administratè sistèm, anpil mwens yon dba. Men…

Li te rive ke mwen te bezwen òganize yon backup nan baz done a postgresql. Pa gen nwaj - jis itilize SSH epi asire w ke tout bagay ap mache san yo pa mande lajan. Kisa nou fè nan ka konsa? Se vre, nou pouse pgdump nan cron, backup tout bagay nan achiv la chak jou, epi si nou konplètman pèdi, nou voye achiv sa a yon kote byen lwen.

Fwa sa a, difikilte a te ke selon plan yo, baz done a te sipoze grandi pa apeprè +- 100 MB pou chak jou. Natirèlman, apre yon koup de semèn dezi a fè backup tout bagay ak pgdump pral disparèt. Sa a se kote sovgad incrémentielle vin pote sekou.

Enteresan? Byenveni nan chat.

Sovgad enkreman se yon kalite backup lè se pa tout dosye sous yo kopye, men se sèlman nouvo yo ak sa yo ki chanje depi kreyasyon an nan kopi anvan an.

Tankou nenpòt ki pwomotè ki te absoliman pa vle (nan moman sa a) konprann sibtilite yo nan postgres, mwen te vle jwenn bouton vèt la. Oke, ou konnen, tankou nan AWS, DigitalOcean: ou peze yon sèl bouton - ou te resevwa replikasyon, ou peze dezyèm lan - ou mete kanpe sovgad, twazyèm lan - ou woule tout bagay tounen yon koup de èdtan. Mwen pa t jwenn yon bouton oswa yon bèl zouti GUI. Si w konnen youn (gratis oswa bon mache), ekri sou li nan kòmantè yo.

Apre google mwen jwenn de zouti pgbarman и pgbackrest. Mwen tou senpleman pa t reyisi ak premye a (dokimantasyon trè rar, mwen te eseye kalkile tout bagay dapre ansyen manyèl), men ak dezyèm nan dokiman an te tounen jiska par, men se pa san defo. Pou senplifye travay moun ki fè fas ak yon travay menm jan an, atik sa a te ekri.

Apre ou fin li atik sa a, ou pral aprann ki jan fè sovgad incrémentielle, sove yo nan yon sèvè aleka (repozitwa ak sovgad) epi restore yo nan ka ta gen pèt done oswa lòt pwoblèm sou sèvè prensipal la.

Fòmasyon

Pou repwodui manyèl la w ap bezwen de VPS. Premye a pral depo a (repozitwa ki kote sovgad yo pral estoke), ak dezyèm lan, an reyalite, sèvè a tèt li ak postgres (nan ka mwen an, vèsyon 11 nan postgres).

Yo sipoze ke sou sèvè a ak postgres ou gen rasin, itilizatè sudo, itilizatè postgres ak postgres tèt li enstale (se itilizatè a postgres kreye otomatikman lè w ap enstale postgresql), epi sou sèvè depo a gen itilizatè rasin ak sudo (nan manyèl la). yo pral itilize non itilizatè pgbackrest).

Pou w gen mwens pwoblèm lè w repwodui enstriksyon yo, mwen ekri an italik ki kote, ak ki itilizatè ak ki dwa mwen te egzekite kòmandman an pandan w ap ekri ak tcheke atik la.

Enstale pgbackrest

Repozitwa (itilizatè pgbackrest):

1. Telechaje achiv la nan pgbackrest epi transfere sa li nan katab /build la:

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

2. Enstale depandans ki nesesè pou asanble:

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

3. Asanble pgbackrest:

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

4. Kopi fichye ègzekutabl la nan anyè /usr/bin:

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

5. Pgbackrest mande perl. Enstale:

sudo apt-get install perl

6. Kreye anyè pou mòso bwa, ba yo sèten dwa:

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

pgbackrest version

Postgres sèvè (sudo itilizatè oswa rasin):

Pwosesis pou enstale pgbackrest sou yon sèvè ak postgres sanble ak pwosesis enstalasyon sou repozitwa a (wi, pgbackrest dwe enstale sou tou de sèvè), men nan 6yèm paragraf la dezyèm ak dènye kòmandman yo:

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

ranplase ak:

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

Mete kanpe entèraksyon ant serveurs atravè SSH san modpas

Pou pgbackrest travay kòrèkteman, li nesesè pou konfigirasyon entèraksyon ant sèvè postgres la ak depo a lè l sèvi avèk dosye kle a.

Repozitwa (itilizatè pgbackrest):

Kreye yon pè kle:

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

Attention! Nou kouri kòmandman ki anwo yo san sudo.

Postgres sèvè (sudo itilizatè oswa rasin):

Kreye yon pè kle:

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

Repozitwa (sudo itilizatè):

Kopi kle piblik sèvè postgres la sou sèvè depo:

(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

Nan etap sa a, yo pral mande w modpas pou itilizatè rasin lan. Ou bezwen antre modpas itilizatè rasin sèvè postgres la!

Sèvè Postgres (sudo itilizatè):

Kopi kle piblik depo a sou sèvè a ak 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

Nan etap sa a, yo pral mande w modpas pou itilizatè rasin lan. Ou bezwen antre egzakteman modpas itilizatè rasin depo a!

Nou tcheke:

Repozitwa (itilizatè rasin, pou pite eksperyans la):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Sèvè Postgres (itilizatè rasin, pou pite eksperyans la):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Nou asire nou ke nou jwenn aksè san pwoblèm.

Mete kanpe yon sèvè postgres

Postgres sèvè (sudo itilizatè oswa rasin):

1. Ann pèmèt frape sou sèvè postgres la soti nan IP ekstèn. Pou fè sa, edite fichye a postgresql.conf (ki sitiye nan /etc/postgresql/11/main folder), ajoute liy lan nan li:

listen_addresses = '*'

Si yon liy konsa deja egziste, swa retire li oswa mete valè paramèt la kòm '*'.

Nan dosye pg_hba.conf (tou ki sitiye nan katab la /etc/postgresql/11/main) ajoute liy sa yo:

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

kote:

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

2. Ann fè paramèt ki nesesè yo nan postgresql.conf (li nan katab la /etc/postgresql/11/main) pou pgbackrest travay:

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

3. Ann fè paramèt ki nesesè yo nan dosye konfigirasyon pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Rechaje postgresql:

sudo service postgresql restart

Mete kanpe yon sèvè depo

Depo (itilizatè pgbackrest):

Ann fè paramèt ki nesesè yo nan dosye konfigirasyon an 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

Kreye yon depo

Depo (itilizatè pgbackrest):

Kreye yon nouvo depo pou gwoup la prensipal:

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

Проверка

Postgres sèvè (sudo itilizatè oswa rasin):

Nou tcheke sou sèvè postgres la:

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

Depo (itilizatè pgbackrest):

Nou tcheke sou sèvè repozitwa a:

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

Nou asire w ke nan pwodiksyon an nou wè liy "tcheke lòd fini: konplete avèk siksè".

Fatige? Ann ale nan pati ki pi enteresan an.

Fè yon backup

Depo (itilizatè pgbackrest):

1. Fè yon backup:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Asire w ke yo te kreye yon backup:

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

Pgbackrest pral kreye premye backup konplè a. Si ou vle, ou ka kouri lòd la backup ankò epi asire w ke sistèm nan kreye yon backup incrémentielle.

Si ou vle fè yon backup konplè ankò, Lè sa a, presize yon drapo adisyonèl:

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

Si ou vle detay konsole pwodiksyon, lè sa a tou presize:

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

Restore yon backup

Postgres sèvè (sudo itilizatè oswa rasin):

1. Sispann gwoup la kouri:

sudo pg_ctlcluster 11 main stop

2. Restore soti nan backup:

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

Pou retabli baz done a nan eta dènye backup FULL la, sèvi ak lòd la san yo pa espesifye recovery_target:

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

Enpòtan! Apre rekiperasyon an, li ka rive ke baz done a bloke nan mòd rekiperasyon (pral gen erè tankou ERROR: pa ka egzekite DROP DATABASE nan yon tranzaksyon li sèlman). Pou m onèt, mwen poko konprann kisa sa a konekte ak. Solisyon an se jan sa a (ou pral bezwen rete tann yon ti kras apre yo fin egzekite lòd la):

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

An reyalite, li posib retabli yon backup espesifik pa non li. Men mwen sèlman Mwen pral bay yon lyen nan deskripsyon karakteristik sa a nan dokiman an. Devlopè yo konseye w sèvi ak opsyon sa a ak prekosyon epi eksplike poukisa. Mwen ka ajoute nan tèt mwen ke mwen te itilize li. Si ou reyèlman bezwen, asire w ke apre rekiperasyon baz done a soti nan mòd rekiperasyon (chwazi pg_is_in_recovery () ta dwe montre "f") epi, jis nan ka, fè yon backup konplè apre rekiperasyon an.

3. Kòmanse gwoup la:

sudo pg_ctlcluster 11 main start

Apre restore backup la, nou bezwen fè yon dezyèm backup:

Depo (itilizatè pgbackrest):

sudo pgbackrest --stanza=main backup

Se tout. An konklizyon, mwen ta renmen fè ou sonje ke mwen pa nan okenn fason ap eseye pretann yo dwe yon dba granmoun aje epi yo pral sèvi ak nyaj yo nan moindre opòtinite. Kounye a, mwen menm mwen kòmanse etidye divès sijè tankou backup, replikasyon, siveyans, elatriye. epi mwen ekri ti rapò sou rezilta yo nan lòd yo fè yon ti kontribisyon nan kominote a epi kite ti fèy tronpe pou tèt mwen.

Nan atik sa yo mwen pral eseye pale sou karakteristik adisyonèl - rekiperasyon done nan yon grap pwòp, chifreman nan sovgad ak pibliye nan S3, sovgad atravè rsync.

Sous: www.habr.com

Add nouvo kòmantè