Atruna
Es esmu izstrādātājs. Es rakstu kodu un mijiedarbojos ar datu bāzi tikai kā lietotājs. Es nekādā gadījumā neizliekos par sistēmas administratoru, vēl jo mazāk par dba. Bet…
Sagadījās, ka man vajadzēja organizēt postgresql datu bāzes dublējumu. Nav mākoņu – vienkārši izmantojiet SSH un pārliecinieties, ka viss darbojas, neprasot naudu. Ko mēs darām šādos gadījumos? Tieši tā, mēs iespiežam pgdump iekšā cron, katru dienu dublējam visu arhīvā un, ja esam galīgi apmaldījušies, nosūtām šo arhīvu kaut kur tālu.
Šoreiz grūtības sagādāja tas, ka saskaņā ar plāniem datubāzei bija paredzēts pieaugt par aptuveni +- 100 MB dienā. Protams, pēc pāris nedēļām vēlme visu dublēt ar pgdump pazudīs. Šeit palīgā nāk papildu dublējumkopijas.
Interesanti? Laipni lūdzam kaķī.
Inkrementālā dublēšana ir dublēšanas veids, kad tiek kopēti ne visi avota faili, bet tikai jauni un tie, kas mainīti kopš iepriekšējās kopijas izveides.
Tāpat kā jebkurš izstrādātājs, kurš ABSOLŪTI nevēlējās (tajā laikā) izprast postgres sarežģītību, es gribēju atrast zaļo pogu. Nu, jūs zināt, tāpat kā AWS, DigitalOcean: jūs nospiedāt vienu pogu - jums bija replikācija, jūs nospiedāt otro - jūs iestatījāt dublējumus, trešo - jūs visu atritinājāt pāris stundas. Es neatradu pogu vai skaistu GUI rīku. Ja zini kādu (bez maksas vai lēti), raksti par to komentāros.
Pēc googlēšanas es atradu divus rīkus pgbarman и pgbackrest. Ar pirmo man vienkārši neveicās (ļoti skopa dokumentācija, mēģināju visu izdomāt pēc vecām rokasgrāmatām), bet ar otro dokumentācija izrādījās līdzvērtīga, bet ne bez trūkumiem. Lai vienkāršotu darbu tiem, kuri saskaras ar līdzīgu uzdevumu, šis raksts tika uzrakstīts.
Pēc šī raksta izlasīšanas jūs uzzināsit, kā izveidot papildu dublējumus, saglabāt tos attālajā serverī (repozitorijā ar dublējumkopijām) un atjaunot tos datu zuduma vai citu problēmu gadījumā galvenajā serverī.
Treniņš
Lai pavairotu rokasgrāmatu, jums būs nepieciešami divi VPS. Pirmā būs krātuve (repozitorijs, kurā tiks glabāti dublējumkopijas), bet otrā, faktiski, pats serveris ar postgres (manā gadījumā postgres 11. versija).
Tiek pieņemts, ka serverī ar postgres jums ir root, sudo lietotājs, postgres lietotājs un pats postgres ir instalēts (postgres lietotājs tiek izveidots automātiski, instalējot postgresql), un repozitorija serverī ir root un sudo lietotājs (rokasgrāmatā tiks izmantots lietotājvārds pgbackrest).
Lai jums būtu mazāk problēmu, atkārtojot instrukcijas, es rakstu slīprakstā kur, ar kādu lietotāju un ar kādām tiesībām es izpildīju komandu rakstot un pārbaudot rakstu.
pgbackrest uzstādīšana
Repozitorijs (lietotāja pgbackrest):
1. Lejupielādējiet arhīvu no vietnes pgbackrest un pārsūtiet tā saturu uz mapi /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. Uzstādiet montāžai nepieciešamās atkarības:
sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev
libpq-dev
3. Pg atzveltnes salikšana:
cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src
4. Kopēt izpildāmo failu /usr/bin direktorijā:
sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest
5. Pgbackrest prasa perl. Uzstādīt:
sudo apt-get install perl
6. Izveidojiet žurnālu katalogus, piešķiriet tiem noteiktas tiesības:
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. Pārbaudiet:
pgbackrest version
Postgres serveris (sudo lietotājs vai root):
Pgbackrest instalēšanas process serverī ar postgres ir līdzīgs instalēšanas procesam repozitorijā (jā, pgbackrest ir jāinstalē abos serveros), bet 6.rindkopā otrā un pēdējā komanda:
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
aizvietot ar:
sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
Mijiedarbības iestatīšana starp serveriem, izmantojot bezparoles SSH
Lai pgbackrest darbotos pareizi, ir jākonfigurē mijiedarbība starp postgres serveri un repozitoriju, izmantojot atslēgas failu.
Repozitorijs (lietotāja pgbackrest):
Izveidojiet atslēgu pāri:
mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa
-t rsa -b 4096 -N ""
Uzmanību! Mēs izpildām iepriekš minētās komandas bez sudo.
Postgres serveris (sudo lietotājs vai root):
Izveidojiet atslēgu pāri:
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 ""
Repozitorijs (sudo lietotājs):
Kopējiet postgres servera publisko atslēgu uz repozitorija serveri:
(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
Šajā darbībā jums tiks lūgts ievadīt root lietotāja paroli. Jums jāievada postgres servera root lietotāja parole!
Postgres serveris (sudo lietotājs):
Kopējiet repozitorija publisko atslēgu uz serveri ar 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
Šajā darbībā jums tiks lūgts ievadīt root lietotāja paroli. Jums jāievada tieši repozitorija root lietotāja parole!
Pārbaude:
Repozitorijs (saknes lietotājs eksperimenta tīrības labad):
sudo -u pgbackrest ssh postgres@<postgres_server_ip>
Postgres serveris (saknes lietotājs eksperimenta tīrības labad):
sudo -u postgres ssh pgbackrest@<repository_server_ip>
Mēs nodrošinām piekļuvi bez problēmām.
Postgres servera iestatīšana
Postgres serveris (sudo lietotājs vai root):
1. Atļausim pieklauvēt postgres serverim no ārējiem IP. Lai to izdarītu, rediģējiet failu postgresql.conf (atrodas mapē /etc/postgresql/11/main), pievienojot tai rindu:
listen_addresses = '*'
Ja šāda rindiņa jau pastāv, vai nu noņemiet komentāru, vai iestatiet parametra vērtību kā “*”.
Failā pg_hba.conf (atrodas arī mapē /etc/postgresql/11/main) pievienojiet šādas rindas:
hostssl all all 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5
ja:
hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля
2. Veicam nepieciešamos iestatījumus postgresql.conf (tas atrodas mapē /etc/postgresql/11/main), lai pgbackrest darbotos:
archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica
3. Veicam nepieciešamos iestatījumus pgbackrest konfigurācijas failā (/etc/pgbackrest/pgbackrest.conf):
[main]
pg1-path=/var/lib/postgresql/11/main
[global]
log-level-file=detail
repo1-host=<repository_server_ip>
4. Pārlādēt postgresql:
sudo service postgresql restart
Repozitorija servera iestatīšana
Repozitorijs (pgbackrest lietotājs):
Konfigurācijas failā veiksim nepieciešamos iestatījumus 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
Repozitorija izveide
Repozitorijs (pgbackrest lietotājs):
Izveidojiet klasterim jaunu krātuvi galvenais:
sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create
Проверка
Postgres serveris (sudo lietotājs vai root):
Mēs pārbaudām postgres serverī:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info check
Repozitorijs (pgbackrest lietotājs):
Mēs pārbaudām repozitorija serverī:
sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check
Mēs pārliecināmies, ka izvadā mēs redzam rindu “pārbaudīt komandas beigas: veiksmīgi pabeigta”.
Noguris? Pāriesim pie interesantākās daļas.
Dublējuma veidošana
Repozitorijs (pgbackrest lietotājs):
1. Veiciet dublējumu:
sudo -u pgbackrest pgbackrest --stanza=main backup
2. Pārliecinieties, vai ir izveidots dublējums:
ls /var/lib/pgbackrest/backup/main/
Pgbackrest izveidos pirmo pilno dublējumu. Ja vēlaties, varat vēlreiz palaist dublēšanas komandu un pārliecināties, ka sistēma izveido papildu dublējumu.
Ja vēlaties vēlreiz izveidot pilnu dublējumu, norādiet papildu karogu:
sudo -u pgbackrest pgbackrest --stanza=main --type=full backup
Ja vēlaties detalizētu konsoles izvadi, norādiet arī:
sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup
Dublējuma atjaunošana
Postgres serveris (sudo lietotājs vai root):
1. Apturiet darbīgo kopu:
sudo pg_ctlcluster 11 main stop
2. Atjaunošana no dublējuma:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore
Lai atjaunotu datubāzi uz pēdējās FULL dublējuma stāvokli, izmantojiet komandu, nenorādot recovery_target:
sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore
Svarīgs! Pēc atkopšanas var gadīties, ka datu bāze iestrēgst atkopšanas režīmā (tiks parādītas kļūdas, piemēram, ERROR: nevar izpildīt DROP DATABASE tikai lasāmā transakcijā). Godīgi sakot, es vēl neesmu sapratis, ar ko tas ir saistīts. Risinājums ir šāds (pēc komandas izpildes jums būs nedaudz jāgaida):
sudo -u postgres psql -c "select pg_wal_replay_resume()"
Faktiski ir iespējams atjaunot konkrētu dublējumu pēc tā nosaukuma. Šeit esmu tikai es
3. Sāciet klasteru:
sudo pg_ctlcluster 11 main start
Pēc dublējuma atjaunošanas mums ir jāveic otra dublēšana:
Repozitorijs (pgbackrest lietotājs):
sudo pgbackrest --stanza=main backup
Tas ir viss. Nobeigumā vēlos atgādināt, ka nekādā gadījumā nemēģinu izlikties par senioru dba un izmantošu mākoņus pie mazākās izdevības. Šobrīd pats sāku pētīt dažādas tēmas kā dublēšana, replikācija, monitorings utt. un es rakstu nelielas atskaites par rezultātiem, lai sniegtu nelielu pienesumu sabiedrībai un atstātu sev mazas krāpšanās lapas.
Nākamajos rakstos mēģināšu runāt par papildu iespējām - datu atkopšanu uz tīru klasteru, dublējumu šifrēšanu un publicēšanu S3, dublēšanu caur rsync.
Avots: www.habr.com