Stigvaxandi postgresql öryggisafrit með pgbackrest - námskeið fyrir ungan bardagakappa frá þróunaraðilanum

Fyrirvari

Ég er verktaki. Ég skrifa kóða og hafa samskipti við gagnagrunninn eingöngu sem notandi. Á engan hátt þykist ég vera kerfisstjóri og því síður dba. En…

Það gerðist svo að ég þurfti að skipuleggja öryggisafrit af postgresql gagnagrunninum. Engin ský - notaðu bara SSH og vertu viss um að allt virki án þess að biðja um peninga. Hvað gerum við í slíkum tilfellum? Það er rétt, við ýtum pgdump inn í cron, afritum allt í skjalasafnið á hverjum degi, og ef við erum alveg týnd sendum við þetta skjalasafn eitthvað langt í burtu.

Að þessu sinni var erfiðleikinn sá að samkvæmt áætlunum átti gagnagrunnurinn að stækka um +- 100 MB á dag. Auðvitað, eftir nokkrar vikur mun löngunin til að taka öryggisafrit af öllu með pgdump hverfa. Þetta er þar sem stigvaxandi öryggisafrit koma til bjargar.

Áhugavert? Velkomin í köttinn.

Stigvaxandi öryggisafrit er tegund öryggisafrits þegar ekki eru allar frumskrár afritaðar, heldur aðeins nýjar og þær sem hafa verið breytt frá því að fyrra afritið var búið til.

Eins og allir verktaki sem var ALVEG ófús (á þeim tíma) að skilja ranghala postgres, vildi ég finna græna hnappinn. Jæja, þú veist, eins og í AWS, DigitalOcean: þú ýttir á einn hnapp - þú fékkst afritun, þú ýttir á annan - þú settir upp öryggisafrit, þann þriðja - þú færðir allt aftur í nokkrar klukkustundir. Ég fann ekki hnapp eða fallegt GUI tól. Ef þú þekkir einn (ókeypis eða ódýr), skrifaðu um það í athugasemdunum.

Eftir að hafa googlað fann ég tvö verkfæri pgbarman и pg bakstoð. Mér tókst einfaldlega ekki með þeirri fyrri (mjög dreifð skjöl, ég reyndi að átta mig á öllu samkvæmt gömlum handbókum), en með þeirri seinni reyndust skjölin upp á við, en ekki gallalaus. Til að einfalda vinnu þeirra sem standa frammi fyrir svipuðu verkefni var þessi grein skrifuð.

Eftir að hafa lesið þessa grein muntu læra hvernig á að gera stigvaxandi afrit, vista þau á ytri netþjóni (geymsla með afritum) og endurheimta þau ef gagnatap eða önnur vandamál verða á aðalþjóninum.

Þjálfun

Til að endurskapa handbókina þarftu tvo VPS. Sú fyrsta verður geymslan (geymslan sem afritin verða geymd á) og sú seinni, í raun, þjónninn sjálfur með postgres (í mínu tilfelli, útgáfa 11 af postgres).

Gert er ráð fyrir að á þjóninum með postgres sétu með root, sudo user, postgres user og postgres sjálfur er uppsettur (postgres notandinn er búinn til sjálfkrafa þegar postgresql er sett upp), og á repository servernum er root og sudo user (í handbókinni). notandanafnið pgbackrest verður notað).

Svo að þú hafir færri vandamál þegar þú endurgerir leiðbeiningarnar skrifa ég skáletrað hvar, með hvaða notanda og með hvaða réttindum framkvæmdi ég skipunina á meðan þú skrifar og skoðar greinina.

Setja upp pg bakstoð

Geymsla (notandi pgbackrest):

1. Sæktu skjalasafnið úr pgbackrest og fluttu innihald þess í /build möppuna:

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

2. Settu upp ósjálfstæðin sem nauðsynleg eru fyrir samsetningu:

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

3. Að setja saman bakstoð:

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

4. Afritaðu keyrsluskrána í /usr/bin möppuna:

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

5. Pgbackrest krefst perl. Setja upp:

sudo apt-get install perl

6. Búðu til möppur fyrir annála, gefðu þeim ákveðin réttindi:

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. Athugaðu:

pgbackrest version

Postgres þjónn (sudo notandi eða rót):

Ferlið við að setja upp pgbackrest á netþjóni með postgres er svipað og uppsetningarferlið á geymslunni (já, pgbackrest verður að vera uppsett á báðum netþjónum), en í 6. mgr. skipar annar og síðastur:

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

skipta út fyrir:

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

Að setja upp samskipti milli netþjóna í gegnum lykilorðslausan SSH

Til þess að pgbackrest virki rétt er nauðsynlegt að stilla samspilið milli postgres þjónsins og geymslunnar með því að nota lykilskrána.

Geymsla (notandi pgbackrest):

Búðu til lyklapar:

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

Attention! Við keyrum ofangreindar skipanir án sudo.

Postgres þjónn (sudo notandi eða rót):

Búðu til lyklapar:

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

Geymsla (sudo notandi):

Afritaðu opinbera lykil postgres netþjónsins yfir á geymsluþjóninn:

(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

Í þessu skrefi verður þú beðinn um lykilorð fyrir rótarnotandann. Þú þarft að slá inn lykilorð rótarnotanda postgres þjónsins!

Postgres þjónn (sudo notandi):

Afritaðu opinbera geymslulykilinn á netþjóninn með 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

Í þessu skrefi verður þú beðinn um lykilorð fyrir rótarnotandann. Þú þarft að slá inn nákvæmlega lykilorð rótarnotanda geymslunnar!

Við athugum:

Geymsla (rótnotandi, fyrir hreinleika tilraunarinnar):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres þjónn (rótnotandi, fyrir hreinleika tilraunarinnar):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Við tryggjum að við fáum aðgang án vandræða.

Að setja upp postgres netþjón

Postgres þjónn (sudo notandi eða rót):

1. Leyfum að banka á postgres netþjóninn frá ytri IP-tölum. Til að gera þetta skaltu breyta skránni postgresql.conf (staðsett í /etc/postgresql/11/main möppunni), bætir línunni við hana:

listen_addresses = '*'

Ef slík lína er þegar til, annað hvort afskrifa hana eða stilla færibreytugildið sem '*'.

Í skrá pg_hba.conf (einnig staðsett í möppunni /etc/postgresql/11/main) bætið við eftirfarandi línum:

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

þar sem:

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

2. Við skulum gera nauðsynlegar stillingar í postgresql.conf (það er í möppunni /etc/postgresql/11/main) til að pgbakstoð virki:

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

3. Gerum nauðsynlegar stillingar í pgbackrest stillingarskránni (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Endurhlaða postgresql:

sudo service postgresql restart

Að setja upp geymsluþjón

Geymsla (pgbackrest notandi):

Við skulum gera nauðsynlegar stillingar í stillingarskránni pg bakstoð
(/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

Að búa til geymslu

Geymsla (pgbackrest notandi):

Búðu til nýja geymslu fyrir klasann helstu:

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

Проверка

Postgres þjónn (sudo notandi eða rót):

Við athugum á postgres þjóninum:

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

Geymsla (pgbackrest notandi):

Við athugum á geymsluþjóninum:

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

Við tryggjum að í úttakinu sjáum við línuna „athugaðu skipunarlok: lokið með góðum árangri“.

Þreyttur? Við skulum halda áfram að áhugaverðasta hlutanum.

Að gera öryggisafrit

Geymsla (pgbackrest notandi):

1. Framkvæma öryggisafrit:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Gakktu úr skugga um að öryggisafrit hafi verið búið til:

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

Pgbackrest mun búa til fyrsta fulla öryggisafritið. Ef þú vilt geturðu keyrt öryggisafritsskipunina aftur og gengið úr skugga um að kerfið búi til stigvaxandi öryggisafrit.

Ef þú vilt taka fullt öryggisafrit aftur, tilgreindu þá viðbótarflag:

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

Ef þú vilt nákvæma stjórnborðsúttak skaltu einnig tilgreina:

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

Endurheimtir öryggisafrit

Postgres þjónn (sudo notandi eða rót):

1. Stöðvaðu hlaupandi klasa:

sudo pg_ctlcluster 11 main stop

2. Endurheimt úr öryggisafriti:

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

Til að endurheimta gagnagrunninn í stöðu síðasta FULLU öryggisafritsins, notaðu skipunina án þess að tilgreina recovery_target:

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

Mikilvægt! Eftir endurheimt getur það gerst að gagnagrunnurinn festist í bataham (það verða villur eins og VILLA: getur ekki keyrt DROP DATABASE í skrifvarin færslu). Satt að segja hef ég ekki enn skilið hvað þetta tengist. Lausnin er sem hér segir (þú þarft að bíða aðeins eftir að skipunin er framkvæmd):

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

Í raun er hægt að endurheimta tiltekið öryggisafrit með nafni þess. Hér er ég aðeins Ég mun gefa upp hlekk á lýsingu á þessum eiginleika í skjölunum. Hönnuðir ráðleggja að nota þennan möguleika með varúð og útskýra hvers vegna. Ég get bætt því við frá sjálfum mér að ég notaði það. Ef þú þarft virkilega á því að halda, vertu viss um að eftir endurheimt fari gagnagrunnurinn út úr endurheimtarham (veldu pg_is_in_recovery() ætti að sýna „f“) og, bara ef þú ert að gera öryggisafrit, skaltu taka fullt öryggisafrit eftir endurheimt.

3. Ræstu þyrpinguna:

sudo pg_ctlcluster 11 main start

Eftir að hafa endurheimt öryggisafritið þurfum við að framkvæma annað öryggisafrit:

Geymsla (pgbackrest notandi):

sudo pgbackrest --stanza=main backup

Það er allt og sumt. Að endingu vil ég minna á að ég er á engan hátt að reyna að þykjast vera eldri dba og mun nota skýin við minnsta tækifæri. Eins og er er ég sjálfur að byrja að kynna mér ýmis efni eins og öryggisafrit, afritun, eftirlit o.fl. og ég skrifa litlar skýrslur um niðurstöðurnar til að leggja lítið af mörkum til samfélagsins og skilja eftir lítil svindlblöð fyrir sjálfan mig.

Í eftirfarandi greinum mun ég reyna að tala um viðbótareiginleika - endurheimt gagna í hreinan þyrping, dulkóðun afrita og birting á S3, afrit í gegnum rsync.

Heimild: www.habr.com

Bæta við athugasemd