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 /build2. 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-dev3. Pagtitipon ng pgbackrest:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src4. 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/pgbackrest5. Ang pgbackrest ay nangangailangan ng perl. I-install:
sudo apt-get install perl6. 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.conf7. Suriin:
pgbackrest versionPostgres 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.confpalitan ng:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.confPagse-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_keysSa 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 md5kung 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 = replica3. 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 restartPagse-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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archivingPaglikha 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 checkImbakan (pgbackrest user):
Sinusuri namin ang server ng repositoryo:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info checkTinitiyak 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 backupKung gusto mo ng detalyadong output ng console, tukuyin din ang:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backupPagpapanumbalik ng backup
Postgres server (sudo user o root):
1. Ihinto ang tumatakbong cluster:
sudo pg_ctlcluster 11 main stop2. Pagpapanumbalik mula sa backup:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restoreUpang ibalik ang database sa estado ng huling BUONG backup, gamitin ang command nang hindi tinukoy ang recovery_target:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restoreMahalaga! Pagkatapos ng pagbawi, maaaring mangyari na ang database ay natigil sa recovery mode (magkakaroon ng mga error tulad ng ERROR: hindi maaaring magsagawa ng DROP DATABASE sa isang read-only na transaksyon). Sa totoo lang, hindi ko pa naiintindihan kung ano ang konektado dito. Ang solusyon ay ang mga sumusunod (kailangan mong maghintay ng kaunti pagkatapos maisakatuparan ang utos):
sudo -u postgres psql -c "select pg_wal_replay_resume()"Sa katunayan, posible na ibalik ang isang tiyak na backup sa pamamagitan ng pangalan nito. Dito lang ako . Pinapayuhan ng mga developer na gamitin ang opsyong ito nang may pag-iingat at ipaliwanag kung bakit. Maaari kong idagdag mula sa aking sarili na ginamit ko ito. Kung talagang kailangan mo, siguraduhin na pagkatapos ng pagbawi ang database ay lalabas sa recovery mode (piliin ang pg_is_in_recovery() ay dapat magpakita ng “f”) at, kung sakali, gumawa ng buong backup pagkatapos ng pagbawi.
3. Simulan ang cluster:
sudo pg_ctlcluster 11 main startPagkatapos ibalik ang backup, kailangan naming magsagawa ng pangalawang backup:
Imbakan (pgbackrest user):
sudo pgbackrest --stanza=main backupIyon 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
