Disclaimer
Ako ay isang developer. Sumulat ako ng code at nakikipag-ugnayan sa database bilang isang user lamang. Sa anumang paraan ay hindi ako nagpapanggap na isang tagapangasiwa ng system, higit na hindi isang dba. Peroβ¦
Nagkataon na kailangan kong ayusin ang isang backup ng database ng postgresql. Walang ulap - gumamit lang ng SSH at tiyaking gumagana ang lahat nang hindi humihingi ng pera. Ano ang gagawin natin sa mga ganitong pagkakataon? Tama, itinutulak namin ang pgdump sa cron, bina-backup ang lahat sa archive araw-araw, at kung tuluyan na kaming nawala, ipinapadala namin ang archive na ito sa isang lugar na malayo.
Sa oras na ito ang kahirapan ay na ayon sa mga plano, ang database ay dapat na lumago ng humigit-kumulang +- 100 MB bawat araw. Siyempre, pagkatapos ng ilang linggo ang pagnanais na i-backup ang lahat gamit ang pgdump ay mawawala. Ito ay kung saan incremental backups dumating sa rescue.
Interesting? Maligayang pagdating sa pusa.
Ang incremental backup ay isang uri ng backup kapag hindi lahat ng source file ay kinopya, ngunit ang mga bago lang at ang mga nabago mula noong ginawa ang nakaraang kopya.
Tulad ng sinumang developer na talagang ayaw (sa oras na iyon) na maunawaan ang mga intricacies ng mga postgres, gusto kong hanapin ang berdeng button. Well, alam mo, tulad ng sa AWS, DigitalOcean: pinindot mo ang isang button - nakakuha ka ng replikasyon, pinindot mo ang pangalawa - nag-set up ka ng mga backup, ang pangatlo - ni-roll mo ang lahat ng ilang oras. Wala akong nakitang button o magandang GUI tool. Kung alam mo ang isa (libre o mura), isulat ang tungkol dito sa mga komento.
Pagkatapos mag-googling nakakita ako ng dalawang tool pgbarman ΠΈ pgbackrest. Hindi lang ako nagtagumpay sa una (napakahiwa-hiwalay na dokumentasyon, sinubukan kong malaman ang lahat ayon sa mga lumang manual), ngunit sa pangalawa ang dokumentasyon ay naging hanggang sa par, ngunit hindi walang mga bahid. Upang gawing simple ang gawain ng mga nahaharap sa isang katulad na gawain, isinulat ang artikulong ito.
Matapos basahin ang artikulong ito, matututunan mo kung paano gumawa ng mga incremental na backup, i-save ang mga ito sa isang malayong server (imbakan na may mga backup) at ibalik ang mga ito sa kaso ng pagkawala ng data o iba pang mga problema sa pangunahing server.
Pagsasanay
Para kopyahin ang manwal kakailanganin mo ng dalawang VPS. Ang una ay ang imbakan (ang imbakan kung saan maiimbak ang mga backup), at ang pangalawa, sa katunayan, ang server mismo na may mga postgres (sa aking kaso, bersyon 11 ng mga postgres).
Ipinapalagay na sa server na may mga postgres mayroon kang root, sudo user, postgres user at postgres mismo ay naka-install (ang postgres user ay awtomatikong nilikha kapag nag-i-install ng postgresql), at sa repository server mayroong root at sudo user (sa manual ang user name pgbackrest ang gagamitin) .
Upang magkaroon ka ng mas kaunting mga problema sa paggawa ng mga tagubilin, sumulat ako sa italics kung saan, sa kung anong gumagamit at kung anong mga karapatan ko pinatupad ang utos habang sinusulat at sinusuri ang artikulo.
Pag-install ng pgbackrest
Imbakan (user pgbackrest):
1. I-download ang archive mula sa pgbackrest at ilipat ang mga nilalaman nito sa /build folder:
sudo mkdir /build
sudo wget -q -O -
https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz |
sudo tar zx -C /build
2. I-install ang mga dependency na kailangan para sa pagpupulong:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev
3. Pagtitipon ng pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src
4. Kopyahin ang executable file sa /usr/bin na direktoryo:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest
5. Ang pgbackrest ay nangangailangan ng perl. I-install:
sudo apt-get install perl
6. Lumikha ng mga direktoryo para sa mga log, bigyan sila ng ilang mga karapatan:
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. Suriin:
pgbackrest version
Postgres server (sudo user o root):
Ang proseso ng pag-install ng pgbackrest sa isang server na may mga postgres ay katulad ng proseso ng pag-install sa repository (oo, dapat na mai-install ang pgbackrest sa parehong mga server), ngunit sa ika-6 na talata ang pangalawa at huling utos:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
palitan ng:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
Pagse-set up ng pakikipag-ugnayan sa pagitan ng mga server sa pamamagitan ng SSH na walang password
Upang gumana nang tama ang pgbackrest, kinakailangang i-configure ang pakikipag-ugnayan sa pagitan ng postgres server at ng repository gamit ang key file.
Imbakan (user pgbackrest):
Gumawa ng key pair:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""
Warning! Pinapatakbo namin ang mga utos sa itaas nang walang sudo.
Postgres server (sudo user o root):
Gumawa ng key pair:
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 ""
Imbakan (sudo user):
Kopyahin ang pampublikong key ng postgres server sa repository server:
(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
Sa hakbang na ito hihilingin sa iyo ang password para sa root user. Kailangan mong ipasok ang password ng root user ng postgres server!
Postgres server (sudo user):
Kopyahin ang repositoryong pampublikong susi sa server na may mga 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
Sa hakbang na ito hihilingin sa iyo ang password para sa root user. Kailangan mong ipasok ang eksaktong password ng root user ng repository!
Namin suriin:
Repository (root user, para sa kadalisayan ng eksperimento):
sudo -u pgbackrest ssh postgres@<postgres_server_ip>
Postgres server (root user, para sa kadalisayan ng eksperimento):
sudo -u postgres ssh pgbackrest@<repository_server_ip>
Tinitiyak namin na makakakuha kami ng access nang walang problema.
Pagse-set up ng postgres server
Postgres server (sudo user o root):
1. Payagan natin ang pagkatok sa postgres server mula sa mga panlabas na IP. Upang gawin ito, i-edit ang file postgresql.conf (matatagpuan sa /etc/postgresql/11/main folder), pagdaragdag ng linya dito:
listen_addresses = '*'
Kung mayroon nang ganoong linya, i-uncomment ito o itakda ang value ng parameter bilang '*'.
Nasa file pg_hba.conf (matatagpuan din sa folder /etc/postgresql/11/main) idagdag ang mga sumusunod na linya:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5
kung saan:
hostssl/host - ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΡΠ΅ΡΠ΅Π· SSL (ΠΈΠ»ΠΈ Π½Π΅Ρ)
all - ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ Π±Π°Π·Π°ΠΌ
all - ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ (Π²ΡΠ΅ΠΌ)
0.0.0.0/0 - ΠΌΠ°ΡΠΊΠ° ΡΠ΅ΡΠΈ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ
md5 - ΡΠΏΠΎΡΠΎΠ± ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠΎΠ»Ρ
2. Gawin natin ang mga kinakailangang setting sa postgresql.conf (ito ay nasa folder /etc/postgresql/11/main) para gumana ang pgbackrest:
archive_command = 'pgbackrest --stanza=main archive-push %p' # ΠΠ΄Π΅ main - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. ΠΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ postgres Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠ»Π°ΡΡΠ΅Ρ main.
archive_mode = on
max_wal_senders = 3
wal_level = replica
3. Gawin natin ang mga kinakailangang setting sa pgbackrest configuration file (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=<repository_server_ip>
4. I-reload ang postgresql:
sudo service postgresql restart
Pagse-set up ng repository server
Imbakan (pgbackrest user):
Gawin natin ang mga kinakailangang setting sa configuration file 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 # ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ ΠΏΠΎΠ»Π½ΡΡ
Π±ΡΠΊΠ°ΠΏΠΎΠ². Π’.Π΅. Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΏΠΎΠ»Π½ΡΡ
Π±ΡΠΊΠ°ΠΏΠ° ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΡΡΠ΅ΡΠΈΠΉ - ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° Π±ΡΠ΄ΡΡ ΡΠ΄Π°Π»Π΅Π½Ρ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ.
start-fast=y # ΠΠ°ΡΠΈΠ½Π°Π΅Ρ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΏΡΠΎ ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving
Paglikha ng repositoryo
Imbakan (pgbackrest user):
Gumawa ng bagong storage para sa cluster pangunahin:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
ΠΡΠΎΠ²Π΅ΡΠΊΠ°
Postgres server (sudo user o root):
Sinusuri namin ang postgres server:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info check
Imbakan (pgbackrest user):
Sinusuri namin ang server ng repositoryo:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check
Tinitiyak namin na sa output makikita namin ang linya na "suriin ang pagtatapos ng command: matagumpay na nakumpleto".
Pagod? Lumipat tayo sa pinakakawili-wiling bahagi.
Gumagawa ng backup
Imbakan (pgbackrest user):
1. Magsagawa ng backup:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Tiyaking nakagawa na ng backup:
ls /var/lib/pgbackrest/backup/main/
Gagawin ng Pgbackrest ang unang buong backup. Kung gusto mo, maaari mong patakbuhin muli ang backup na command at tiyaking gagawa ang system ng incremental backup.
Kung gusto mong gumawa muli ng isang buong backup, pagkatapos ay tumukoy ng karagdagang flag:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backup
Kung gusto mo ng detalyadong output ng console, tukuyin din ang:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup
Pagpapanumbalik ng backup
Postgres server (sudo user o root):
1. Ihinto ang tumatakbong cluster:
sudo pg_ctlcluster 11 main stop
2. Pagpapanumbalik mula sa backup:
sudo -u postgres pgbackrest --stanza=main --delta restore
3. Simulan ang cluster:
sudo pg_ctlcluster 11 main start
Pagkatapos ibalik ang backup, kailangan naming magsagawa ng pangalawang backup:
Imbakan (pgbackrest user):
sudo pgbackrest --stanza=main backup
Iyon lang. Sa konklusyon, nais kong ipaalala sa iyo na hindi ko sinusubukan na magpanggap na isang senior dba at gagamitin ang mga ulap sa pinakamaliit na pagkakataon. Sa kasalukuyan, ako mismo ay nagsisimulang mag-aral ng iba't ibang mga paksa tulad ng backup, replication, monitoring, atbp. at sumusulat ako ng maliliit na ulat tungkol sa mga resulta upang makapagbigay ng maliit na kontribusyon sa komunidad at mag-iwan ng maliliit na cheat sheet para sa aking sarili.
Sa mga sumusunod na artikulo ay susubukan kong pag-usapan ang tungkol sa mga karagdagang tampok - pagbawi ng data sa isang malinis na kumpol, pag-encrypt ng mga backup at pag-publish sa S3, pag-backup sa pamamagitan ng rsync.
Pinagmulan: www.habr.com