pgbackrestతో ఇంక్రిమెంటల్ postgresql బ్యాకప్‌లు - డెవలపర్ నుండి యువ ఫైటర్ కోసం ఒక కోర్సు

నిరాకరణ

నేను డెవలపర్‌ని. నేను కోడ్‌ని వ్రాస్తాను మరియు డేటాబేస్‌తో వినియోగదారుగా మాత్రమే ఇంటరాక్ట్ అవుతాను. నేను ఏ విధంగానూ సిస్టమ్ అడ్మినిస్ట్రేటర్‌గా నటించను, చాలా తక్కువ dba. కానీ…

నేను postgresql డేటాబేస్ యొక్క బ్యాకప్‌ను నిర్వహించాల్సిన అవసరం ఏర్పడింది. మేఘాలు లేవు - కేవలం SSHని ఉపయోగించండి మరియు డబ్బు అడగకుండానే ప్రతిదీ పని చేస్తుందని నిర్ధారించుకోండి. అటువంటి సందర్భాలలో మనం ఏమి చేస్తాము? అది సరియైనది, మేము pgdumpని క్రాన్‌లోకి నెట్టివేస్తాము, ప్రతిరోజూ ఆర్కైవ్‌కి ప్రతిదానిని బ్యాకప్ చేస్తాము మరియు మనం పూర్తిగా పోయినట్లయితే, మేము ఈ ఆర్కైవ్‌ను ఎక్కడికో దూరంగా పంపుతాము.

ఈసారి ఇబ్బంది ఏమిటంటే, ప్లాన్‌ల ప్రకారం, డేటాబేస్ రోజుకు సుమారు +- 100 MB వరకు పెరగాలి. వాస్తవానికి, కొన్ని వారాల తర్వాత pgdumpతో ప్రతిదీ బ్యాకప్ చేయాలనే కోరిక అదృశ్యమవుతుంది. ఇక్కడే పెరుగుతున్న బ్యాకప్‌లు రక్షించబడతాయి.

ఆసక్తికరమైన? పిల్లికి స్వాగతం.

ఇన్క్రిమెంటల్ బ్యాకప్ అనేది అన్ని సోర్స్ ఫైల్‌లు కాపీ చేయబడనప్పుడు ఒక రకమైన బ్యాకప్, కానీ కొత్తవి మరియు మునుపటి కాపీని సృష్టించినప్పటి నుండి మార్చబడినవి మాత్రమే.

పోస్ట్‌గ్రెస్‌లోని చిక్కులను అర్థం చేసుకోవడానికి (ఆ సమయంలో) పూర్తిగా ఇష్టపడని డెవలపర్‌లాగా, నేను గ్రీన్ బటన్‌ను కనుగొనాలనుకుంటున్నాను. సరే, మీకు తెలుసా, AWS, DigitalOceanలో లాగా: మీరు ఒక బటన్‌ను నొక్కినారు - మీకు ప్రతిరూపం వచ్చింది, మీరు రెండవదాన్ని నొక్కారు - మీరు బ్యాకప్‌లను సెటప్ చేసారు, మూడవది - మీరు ప్రతిదీ కొన్ని గంటల తర్వాత వెనక్కి తిప్పారు. నాకు బటన్ లేదా అందమైన GUI సాధనం కనుగొనబడలేదు. మీకు ఒకటి (ఉచిత లేదా చౌక) తెలిస్తే, దాని గురించి వ్యాఖ్యలలో వ్రాయండి.

గూగ్లింగ్ చేసిన తర్వాత నాకు రెండు టూల్స్ దొరికాయి pgbarman и pgbackrest. నేను మొదటిదానితో విజయవంతం కాలేదు (చాలా అరుదైన డాక్యుమెంటేషన్, నేను పాత మాన్యువల్‌ల ప్రకారం ప్రతిదీ గుర్తించడానికి ప్రయత్నించాను), కానీ రెండవదానితో డాక్యుమెంటేషన్ సమానంగా మారింది, కానీ లోపాలు లేకుండా కాదు. ఇదే విధమైన పనిని ఎదుర్కొంటున్న వారి పనిని సరళీకృతం చేయడానికి, ఈ వ్యాసం వ్రాయబడింది.

ఈ కథనాన్ని చదివిన తర్వాత, మీరు పెరుగుతున్న బ్యాకప్‌లను ఎలా తయారు చేయాలో నేర్చుకుంటారు, వాటిని రిమోట్ సర్వర్‌లో (బ్యాకప్‌లతో రిపోజిటరీ) సేవ్ చేయండి మరియు ప్రధాన సర్వర్‌లో డేటా నష్టం లేదా ఇతర సమస్యల విషయంలో వాటిని పునరుద్ధరించండి.

శిక్షణ

మాన్యువల్‌ను పునరుత్పత్తి చేయడానికి మీకు రెండు VPS అవసరం. మొదటిది నిల్వ (బ్యాకప్‌లు నిల్వ చేయబడే రిపోజిటరీ), మరియు రెండవది, వాస్తవానికి, పోస్ట్‌గ్రెస్‌తో కూడిన సర్వర్ (నా విషయంలో, పోస్ట్‌గ్రెస్ వెర్షన్ 11).

పోస్ట్‌గ్రెస్‌తో ఉన్న సర్వర్‌లో మీకు రూట్, సుడో యూజర్, పోస్ట్‌గ్రెస్ యూజర్ మరియు పోస్ట్‌గ్రెస్ ఇన్‌స్టాల్ చేయబడిందని భావించబడుతుంది (postgresqlని ఇన్‌స్టాల్ చేసేటప్పుడు పోస్ట్‌గ్రెస్ వినియోగదారు స్వయంచాలకంగా సృష్టించబడతారు), మరియు రిపోజిటరీ సర్వర్‌లో రూట్ మరియు సుడో యూజర్ (మాన్యువల్‌లో ఉన్నారు. వినియోగదారు పేరు pgbackrest ఉపయోగించబడుతుంది) .

సూచనలను పునరుత్పత్తి చేసేటప్పుడు మీకు తక్కువ సమస్యలు ఉన్నందున, నేను ఇటాలిక్‌లలో వ్రాస్తాను ఎక్కడ, ఏ వినియోగదారుతో మరియు ఏ హక్కులతో నేను ఆదేశాన్ని అమలు చేసాను వ్యాసాన్ని వ్రాసేటప్పుడు మరియు తనిఖీ చేస్తున్నప్పుడు.

pgbackrestని ఇన్‌స్టాల్ చేస్తోంది

రిపోజిటరీ (యూజర్ pgbackrest):

1. pgbackrest నుండి ఆర్కైవ్‌ను డౌన్‌లోడ్ చేయండి మరియు దాని కంటెంట్‌లను /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. అసెంబ్లీకి అవసరమైన డిపెండెన్సీలను ఇన్‌స్టాల్ చేయండి:

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

3. pgbackrest అసెంబ్లింగ్:

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

4. ఎక్జిక్యూటబుల్ ఫైల్‌ని /usr/bin డైరెక్టరీకి కాపీ చేయండి:

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

5. Pgbackrestకి perl అవసరం. ఇన్‌స్టాల్ చేయండి:

sudo apt-get install perl

6. లాగ్‌ల కోసం డైరెక్టరీలను సృష్టించండి, వాటికి నిర్దిష్ట హక్కులను ఇవ్వండి:

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. తనిఖీ:

pgbackrest version

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్ లేదా రూట్):

పోస్ట్‌గ్రెస్‌తో సర్వర్‌లో pgbackrestని ఇన్‌స్టాల్ చేసే ప్రక్రియ రిపోజిటరీలో ఇన్‌స్టాలేషన్ ప్రక్రియను పోలి ఉంటుంది (అవును, pgbackrest రెండు సర్వర్‌లలో తప్పనిసరిగా ఇన్‌స్టాల్ చేయబడాలి), కానీ 6వ పేరాలో రెండవ మరియు చివరి ఆదేశాలు:

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

దీనితో భర్తీ చేయండి:

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

పాస్‌వర్డ్ లేని SSH ద్వారా సర్వర్‌ల మధ్య పరస్పర చర్యను సెటప్ చేస్తోంది

pgbackrest సరిగ్గా పని చేయడానికి, కీ ఫైల్‌ని ఉపయోగించి పోస్ట్‌గ్రెస్ సర్వర్ మరియు రిపోజిటరీ మధ్య పరస్పర చర్యను కాన్ఫిగర్ చేయడం అవసరం.

రిపోజిటరీ (యూజర్ pgbackrest):

కీ జతని సృష్టించండి:

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

హెచ్చరిక మేము పై ఆదేశాలను sudo లేకుండా అమలు చేస్తాము.

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్ లేదా రూట్):

కీ జతని సృష్టించండి:

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

రిపోజిటరీ (సుడో యూజర్):

పోస్ట్‌గ్రెస్ సర్వర్ యొక్క పబ్లిక్ కీని రిపోజిటరీ సర్వర్‌కు కాపీ చేయండి:

(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

ఈ దశలో మీరు రూట్ యూజర్ కోసం పాస్‌వర్డ్ అడగబడతారు. మీరు పోస్ట్‌గ్రెస్ సర్వర్ యొక్క రూట్ యూజర్ యొక్క పాస్‌వర్డ్‌ను నమోదు చేయాలి!

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్):

రిపోజిటరీ పబ్లిక్ కీని పోస్ట్‌గ్రేస్‌తో సర్వర్‌కి కాపీ చేయండి:

(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

ఈ దశలో మీరు రూట్ యూజర్ కోసం పాస్‌వర్డ్ అడగబడతారు. మీరు రిపోజిటరీ యొక్క రూట్ యూజర్ యొక్క పాస్‌వర్డ్‌ను ఖచ్చితంగా నమోదు చేయాలి!

మేము తనిఖీ చేస్తాము:

రిపోజిటరీ (రూట్ యూజర్, ప్రయోగం యొక్క స్వచ్ఛత కోసం):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

పోస్ట్‌గ్రెస్ సర్వర్ (రూట్ యూజర్, ప్రయోగం యొక్క స్వచ్ఛత కోసం):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

మేము సమస్యలు లేకుండా యాక్సెస్ పొందేలా చూసుకుంటాము.

పోస్ట్‌గ్రెస్ సర్వర్‌ని సెటప్ చేస్తోంది

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్ లేదా రూట్):

1. బాహ్య IPల నుండి పోస్ట్‌గ్రెస్ సర్వర్‌పై నాక్ చేయడాన్ని అనుమతించండి. దీన్ని చేయడానికి, ఫైల్‌ను సవరించండి postgresql.conf (/etc/postgresql/11/main ఫోల్డర్‌లో ఉంది), దానికి పంక్తిని జోడించడం:

listen_addresses = '*'

అటువంటి లైన్ ఇప్పటికే ఉన్నట్లయితే, దాన్ని అన్‌కామెంట్ చేయండి లేదా పరామితి విలువను '*'గా సెట్ చేయండి.

ఫైల్‌లో pg_hba.conf (ఫోల్డర్‌లో కూడా ఉంది /etc/postgresql/11/main) కింది పంక్తులను జోడించండి:

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

పేరు:

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

2. అవసరమైన సెట్టింగ్‌లను చేద్దాం postgresql.conf (ఇది ఫోల్డర్‌లో ఉంది /etc/postgresql/11/main) pgbackrest పని చేయడానికి:

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

3. pgbackrest కాన్ఫిగరేషన్ ఫైల్‌లో అవసరమైన సెట్టింగ్‌లను చేద్దాం (/etc/pgbackrest/pgbackrest.conf):

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

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

4. postgresqlని రీలోడ్ చేయండి:

sudo service postgresql restart

రిపోజిటరీ సర్వర్‌ని సెటప్ చేస్తోంది

రిపోజిటరీ (pgbackrest వినియోగదారు):

కాన్ఫిగరేషన్ ఫైల్‌లో అవసరమైన సెట్టింగ్‌లను చేద్దాం 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

రిపోజిటరీని సృష్టిస్తోంది

రిపోజిటరీ (pgbackrest వినియోగదారు):

క్లస్టర్ కోసం కొత్త నిల్వను సృష్టించండి ప్రధాన:

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

ఇన్స్పెక్షన్

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్ లేదా రూట్):

మేము పోస్ట్‌గ్రెస్ సర్వర్‌ని తనిఖీ చేస్తాము:

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

రిపోజిటరీ (pgbackrest వినియోగదారు):

మేము రిపోజిటరీ సర్వర్‌లో తనిఖీ చేస్తాము:

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

అవుట్‌పుట్‌లో “చెక్ కమాండ్ ఎండ్: విజయవంతంగా పూర్తయింది” అనే పంక్తిని చూసేలా చూసుకుంటాము.

అలసిన? అత్యంత ఆసక్తికరమైన భాగానికి వెళ్దాం.

బ్యాకప్ చేయడం

రిపోజిటరీ (pgbackrest వినియోగదారు):

1. బ్యాకప్ చేయండి:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. బ్యాకప్ సృష్టించబడిందని నిర్ధారించుకోండి:

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

Pgbackrest మొదటి పూర్తి బ్యాకప్‌ను సృష్టిస్తుంది. మీరు కోరుకుంటే, మీరు బ్యాకప్ ఆదేశాన్ని మళ్లీ అమలు చేయవచ్చు మరియు సిస్టమ్ పెరుగుతున్న బ్యాకప్‌ను సృష్టిస్తుందని నిర్ధారించుకోండి.

మీరు మళ్లీ పూర్తి బ్యాకప్ చేయాలనుకుంటే, అదనపు ఫ్లాగ్‌ను పేర్కొనండి:

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

మీకు వివరణాత్మక కన్సోల్ అవుట్‌పుట్ కావాలంటే, అప్పుడు కూడా పేర్కొనండి:

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

బ్యాకప్‌ని పునరుద్ధరిస్తోంది

పోస్ట్‌గ్రెస్ సర్వర్ (సుడో యూజర్ లేదా రూట్):

1. నడుస్తున్న క్లస్టర్‌ను ఆపివేయండి:

sudo pg_ctlcluster 11 main stop

2. బ్యాకప్ నుండి పునరుద్ధరించడం:

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

ముఖ్యమైనది! రికవరీ తర్వాత, డేటాబేస్ రికవరీ మోడ్‌లో చిక్కుకుపోయి ఉండవచ్చు (ఎర్రర్ వంటి ఎర్రర్‌లు ఉంటాయి: రీడ్-ఓన్లీ ట్రాన్సాక్షన్‌లో DROP DATABASEని అమలు చేయడం సాధ్యం కాదు). నిజం చెప్పాలంటే, ఇది దేనితో అనుసంధానించబడిందో నాకు ఇంకా అర్థం కాలేదు. పరిష్కారం క్రింది విధంగా ఉంది (కమాండ్ అమలు చేయబడిన తర్వాత మీరు కొంచెం వేచి ఉండాలి):

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

వాస్తవానికి, నిర్దిష్ట బ్యాకప్‌ను దాని పేరుతో పునరుద్ధరించడం సాధ్యమవుతుంది. ఇక్కడ నేను మాత్రమే ఉన్నాను నేను డాక్యుమెంటేషన్‌లో ఈ ఫీచర్ యొక్క వివరణకు లింక్‌ను అందిస్తాను. డెవలపర్లు ఈ ఎంపికను జాగ్రత్తగా ఉపయోగించమని సలహా ఇస్తారు మరియు ఎందుకు వివరించండి. నేను ఉపయోగించినట్లు నా నుండి నేను జోడించగలను. మీకు నిజంగా అవసరమైతే, రికవరీ తర్వాత డేటాబేస్ రికవరీ మోడ్ నుండి నిష్క్రమించిందని నిర్ధారించుకోండి (pg_is_in_recovery() "f"ని చూపాలి) మరియు ఒక వేళ, రికవరీ తర్వాత పూర్తి బ్యాకప్ చేయండి.

3. క్లస్టర్‌ను ప్రారంభించండి:

sudo pg_ctlcluster 11 main start

బ్యాకప్‌ను పునరుద్ధరించిన తర్వాత, మేము రెండవ బ్యాకప్‌ను నిర్వహించాలి:

రిపోజిటరీ (pgbackrest వినియోగదారు):

sudo pgbackrest --stanza=main backup

అంతే. ముగింపులో, నేను సీనియర్ dba వలె నటించడానికి ఏ విధంగానూ ప్రయత్నించడం లేదని మరియు కొద్దిపాటి అవకాశంలో మేఘాలను ఉపయోగించుకుంటానని నేను మీకు గుర్తు చేయాలనుకుంటున్నాను. ప్రస్తుతం, నేను బ్యాకప్, రెప్లికేషన్, మానిటరింగ్ మొదలైన వివిధ అంశాలను అధ్యయనం చేయడం ప్రారంభించాను. మరియు నేను కమ్యూనిటీకి ఒక చిన్న సహకారం అందించడానికి మరియు నా కోసం చిన్న చీట్ షీట్‌లను వదిలివేయడానికి ఫలితాల గురించి చిన్న నివేదికలను వ్రాస్తాను.

కింది కథనాలలో నేను అదనపు ఫీచర్ల గురించి మాట్లాడటానికి ప్రయత్నిస్తాను - శుభ్రమైన క్లస్టర్‌కి డేటా రికవరీ, బ్యాకప్‌ల ఎన్‌క్రిప్షన్ మరియు S3కి ప్రచురించడం, rsync ద్వారా బ్యాకప్‌లు.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి