Rezervime shtesë postgresql me pgbackrest - një kurs për një luftëtar të ri nga zhvilluesi

Përgjegjësia

Unë jam një zhvillues. Unë shkruaj kod dhe ndërveproj me bazën e të dhënave vetëm si përdorues. Në asnjë mënyrë nuk pretendoj të jem një administrator sistemi, aq më pak një dba. Por…

Kështu ndodhi që më duhej të organizoja një kopje rezervë të bazës së të dhënave postgresql. Pa re - thjesht përdorni SSH dhe sigurohuni që gjithçka të funksionojë pa kërkuar para. Çfarë bëjmë ne në raste të tilla? Kjo është e drejtë, ne e shtyjmë pgdump në cron, bëjmë kopje rezervë të gjithçkaje në arkiv çdo ditë, dhe nëse humbasim plotësisht, e dërgojmë këtë arkiv diku larg.

Këtë herë vështirësia ishte se sipas planeve, baza e të dhënave supozohej të rritej me rreth +- 100 MB në ditë. Sigurisht, pas disa javësh dëshira për të kopjuar gjithçka me pgdump do të zhduket. Këtu vijnë në shpëtim kopjet rezervë shtesë.

Interesante? Mirë se vini në mace.

Rezervimi në rritje është një lloj rezervimi kur jo të gjithë skedarët burim kopjohen, por vetëm të rinjtë dhe ato të ndryshuara që nga krijimi i kopjes së mëparshme.

Ashtu si çdo zhvillues që nuk ishte absolutisht i gatshëm (në atë kohë) të kuptonte ndërlikimet e postgres, doja të gjeja butonin jeshil. Epo, ju e dini, si në AWS, DigitalOcean: keni shtypur një buton - keni marrë përsëritje, keni shtypur të dytin - keni krijuar kopje rezervë, të tretin - keni kthyer gjithçka pas disa orë. Nuk gjeta një buton ose një mjet të bukur GUI. Nëse e dini një (falas ose të lirë), shkruani për të në komente.

Pasi kërkova në google gjeta dy mjete pgbarman и pgbackrest. Unë thjesht nuk pata sukses me të parën (dokumentacion shumë i rrallë, u përpoqa të kuptoja gjithçka sipas manualeve të vjetra), por me të dytin dokumentacioni doli të ishte në nivel, por jo pa të meta. Për të thjeshtuar punën e atyre që përballen me një detyrë të ngjashme, u shkrua ky artikull.

Pas leximit të këtij artikulli, do të mësoni se si të bëni kopje rezervë në rritje, t'i ruani ato në një server të largët (depo me kopje rezervë) dhe t'i rivendosni ato në rast të humbjes së të dhënave ose problemeve të tjera në serverin kryesor.

Trajnimi

Për të riprodhuar manualin do t'ju duhen dy VPS. E para do të jetë ruajtja (depoja në të cilën do të ruhen kopjet rezervë), dhe e dyta, në fakt, vetë serveri me postgres (në rastin tim, versioni 11 i postgres).

Supozohet se në serverin me postgres keni root, sudo përdorues, përdorues postgres dhe vetë postgres është i instaluar (përdoruesi postgres krijohet automatikisht kur instaloni postgresql), dhe në serverin e depove ka përdorues root dhe sudo (në manual do të përdoret emri i përdoruesit pgbackrest) .

Në mënyrë që të keni më pak probleme gjatë riprodhimit të udhëzimeve, unë shkruaj me shkronja të pjerrëta ku, me çfarë përdoruesi dhe me çfarë të drejtash e kam ekzekutuar komandën gjatë shkrimit dhe kontrollit të artikullit.

Instalimi i pgbackrest

Depoja (pgbackrest i përdoruesit):

1. Shkarkoni arkivin nga pgbackrest dhe transferoni përmbajtjen e tij në dosjen /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. Instaloni varësitë e nevojshme për montim:

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

3. Montimi i mbështetëses pgback:

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

4. Kopjoni skedarin e ekzekutueshëm në drejtorinë /usr/bin:

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

5. Pgbackrest kërkon perl. Instalo:

sudo apt-get install perl

6. Krijoni drejtori për regjistrat, jepuni atyre disa të drejta:

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

pgbackrest version

Serveri Postgres (përdorues sudo ose rrënjë):

Procesi i instalimit të pgbackrest në një server me postgres është i ngjashëm me procesin e instalimit në depo (po, pgbackrest duhet të instalohet në të dy serverët), por në paragrafin e 6-të komanda e dytë dhe e fundit:

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

zëvendësohet me:

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

Vendosja e ndërveprimit midis serverëve përmes SSH pa fjalëkalim

Në mënyrë që pgbackrest të funksionojë siç duhet, është e nevojshme të konfiguroni ndërveprimin midis serverit postgres dhe depove duke përdorur skedarin e çelësit.

Depoja (pgbackrest i përdoruesit):

Krijoni një çift çelësash:

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

Kujdes! Ne ekzekutojmë komandat e mësipërme pa sudo.

Serveri Postgres (përdorues sudo ose rrënjë):

Krijoni një çift çelësash:

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

Depoja (përdoruesi sudo):

Kopjoni çelësin publik të serverit postgres në serverin e depove:

(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

Në këtë hap do t'ju kërkohet fjalëkalimi për përdoruesin rrënjë. Duhet të futni fjalëkalimin e përdoruesit rrënjë të serverit postgres!

Serveri Postgres (përdoruesi sudo):

Kopjoni çelësin publik të depove në server 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

Në këtë hap do t'ju kërkohet fjalëkalimi për përdoruesin rrënjë. Ju duhet të vendosni saktësisht fjalëkalimin e përdoruesit rrënjë të depove!

kontrolloni:

Depoja (përdoruesi rrënjësor, për pastërtinë e eksperimentit):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Serveri Postgres (përdoruesi rrënjësor, për pastërtinë e eksperimentit):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ne sigurohemi që të kemi akses pa probleme.

Vendosja e një serveri postgres

Serveri Postgres (përdorues sudo ose rrënjë):

1. Le të lejojmë të trokasim në serverin postgres nga IP-të e jashtme. Për ta bërë këtë, modifikoni skedarin postgresql.conf (e vendosur në dosjen /etc/postgresql/11/main), duke shtuar rreshtin në të:

listen_addresses = '*'

Nëse një linjë e tillë ekziston tashmë, ose hiqni komentin ose vendosni vlerën e parametrit si '*'.

Në dosje pg_hba.conf (e vendosur gjithashtu në dosje /etc/postgresql/11/main) shtoni rreshtat e mëposhtëm:

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

ku:

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

2. Le të bëjmë cilësimet e nevojshme në postgresql.conf (është në dosje /etc/postgresql/11/main) që pgbackrest të funksionojë:

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

3. Le të bëjmë cilësimet e nevojshme në skedarin e konfigurimit të pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Rifresko postgresql:

sudo service postgresql restart

Vendosja e një serveri të depove

Depoja (përdoruesi i pgbackrest):

Le të bëjmë cilësimet e nevojshme në skedarin e konfigurimit 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

Krijimi i një depoje

Depoja (përdoruesi i pgbackrest):

Krijo një memorie të re për grupin kryesor:

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

Проверка

Serveri Postgres (përdorues sudo ose rrënjë):

Ne kontrollojmë në serverin postgres:

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

Depoja (përdoruesi i pgbackrest):

Ne kontrollojmë në serverin e depove:

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

Sigurohemi që në dalje të shohim rreshtin "kontrolloni fundin e komandës: përfunduar me sukses".

E lodhur? Le të kalojmë në pjesën më interesante.

Bërja e një kopje rezervë

Depoja (përdoruesi i pgbackrest):

1. Kryeni një kopje rezervë:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Sigurohuni që të jetë krijuar një kopje rezervë:

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

Pgbackrest do të krijojë rezervimin e parë të plotë. Nëse dëshironi, mund të ekzekutoni sërish komandën rezervë dhe sigurohuni që sistemi të krijojë një kopje rezervë shtesë.

Nëse dëshironi të bëni përsëri një kopje rezervë të plotë, atëherë specifikoni një flamur shtesë:

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

Nëse dëshironi dalje të detajuar të konsolës, atëherë specifikoni gjithashtu:

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

Rivendosja e një kopje rezervë

Serveri Postgres (përdorues sudo ose rrënjë):

1. Ndalo grupin e ekzekutimit:

sudo pg_ctlcluster 11 main stop

2. Rivendosja nga rezervimi:

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

Për të rivendosur bazën e të dhënave në gjendjen e rezervimit të fundit FULL, përdorni komandën pa specifikuar recovery_target:

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

E rëndësishme! Pas rikuperimit, mund të ndodhë që baza e të dhënave të ngecë në modalitetin e rikuperimit (do të ketë gabime si ERROR: nuk mund të ekzekutohet DROP DATABASE në një transaksion vetëm për lexim). Të them të drejtën, nuk e kam kuptuar ende se me çfarë lidhet kjo. Zgjidhja është si më poshtë (do të duhet të prisni pak pasi të ekzekutohet komanda):

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

Në fakt, është e mundur të rivendosni një kopje rezervë specifike me emrin e tij. Këtu jam vetëm unë Unë do të jap një lidhje me përshkrimin e kësaj veçorie në dokumentacion. Zhvilluesit këshillojnë përdorimin e këtij opsioni me kujdes dhe shpjegojnë pse. Mund të shtoj nga vetja që e kam përdorur. Nëse keni vërtet nevojë, sigurohuni që pas rikuperimit baza e të dhënave të dalë nga mënyra e rikuperimit (zgjidhni pg_is_in_recovery() duhet të tregojë "f") dhe, për çdo rast, bëni një kopje rezervë të plotë pas rikuperimit.

3. Filloni grupin:

sudo pg_ctlcluster 11 main start

Pas rivendosjes së kopjes rezervë, duhet të kryejmë një kopje rezervë të dytë:

Depoja (përdoruesi i pgbackrest):

sudo pgbackrest --stanza=main backup

Kjo eshte e gjitha. Si përfundim, dua t'ju kujtoj se në asnjë mënyrë nuk po përpiqem të pretendoj të jem senior dba dhe do të përdor retë në rastin më të vogël. Aktualisht, unë vetë po filloj të studioj tema të ndryshme si backup, replikim, monitorim etj. dhe shkruaj raporte të vogla për rezultatet në mënyrë që të jap një kontribut të vogël për komunitetin dhe të lë fletë të vogla mashtrimi për veten time.

Në artikujt e mëposhtëm do të përpiqem të flas për veçori shtesë - rikuperimi i të dhënave në një grup të pastër, kriptimi i kopjeve rezervë dhe publikimi në S3, kopje rezervë përmes rsync.

Burimi: www.habr.com

Shto një koment