Pliaj postgresql-sekurkopioj kun pgbackrest - kurso por juna batalanto de la programisto

Malgarantio

Mi estas programisto. Mi skribas kodon kaj interagas kun la datumbazo nur kiel uzanto. Neniel mi ŝajnigas esti sistemadministranto, des malpli dba. Sed…

Okazis, ke mi bezonis organizi sekurkopion de la postgresql-datumbazo. Neniuj nuboj - nur uzu SSH kaj certigu, ke ĉio funkcias sen peti monon. Kion ni faras en tiaj kazoj? Ĝuste, ni puŝas pgdump en cron, rezervas ĉion al la arkivo ĉiutage, kaj se ni estas tute perditaj, ni sendas ĉi tiun arkivon ien malproksime.

Ĉi-foje la malfacilaĵo estis, ke laŭ la planoj, la datumbazo devis kreski je ĉirkaŭ +- 100 MB tage. Kompreneble, post kelkaj semajnoj la deziro sekurkopii ĉion per pgdump malaperos. Ĉi tie estas kie pliigaj sekurkopioj venas al la savo.

Interesaj? Bonvenon al kato.

Pliiga sekurkopio estas speco de sekurkopio kiam ne ĉiuj fontdosieroj estas kopiitaj, sed nur novaj kaj tiuj ŝanĝitaj ekde la kreado de la antaŭa kopio.

Kiel iu ajn programisto, kiu ABSOLUTE ne volis (tiutempe) kompreni la komplikaĵojn de postgres, mi volis trovi la verdan butonon. Nu, vi scias, kiel en AWS, DigitalOcean: vi premis unu butonon - vi ricevis reproduktadon, vi premis la duan - vi starigis sekurkopiojn, la trian - vi reruligis ĉion kelkajn horojn. Mi ne trovis butonon aŭ belan GUI-ilon. Se vi konas unu (senpaga aŭ malmultekosta), skribu pri ĝi en la komentoj.

Guglinte mi trovis du ilojn pgbarman и pgbackrest. Mi simple ne sukcesis pri la unua (tre malabunda dokumentado, mi provis eltrovi ĉion laŭ malnovaj manlibroj), sed ĉe la dua la dokumentado montriĝis ĝisnorma, sed ne sen mankoj. Por simpligi la laboron de tiuj, kiuj alfrontas similan taskon, ĉi tiu artikolo estis skribita.

Post legado de ĉi tiu artikolo, vi lernos kiel fari pliigajn sekurkopiojn, konservi ilin al fora servilo (deponejo kun sekurkopioj) kaj restarigi ilin en kazo de datumperdo aŭ aliaj problemoj sur la ĉefa servilo.

Trejnado

Por reprodukti la manlibron vi bezonos du VPS. La unua estos la stokado (la deponejo sur kiu la sekurkopioj estos konservitaj), kaj la dua, fakte, la servilo mem kun postgres (en mia kazo, versio 11 de postgres).

Oni supozas, ke sur la servilo kun postgres oni havas root, sudo-uzanto, postgres-uzanto kaj postgres mem estas instalita (la postgres-uzanto estas kreita aŭtomate kiam oni instalas postgresql), kaj sur la deponejo-servilo estas root- kaj sudo-uzanto (en la manlibro). la uzantnomo pgbackrest estos uzata).

Por ke vi havu malpli da problemoj dum reproduktado de la instrukcioj, mi skribas kursive kie, kun kia uzanto kaj kun kiaj rajtoj mi plenumis la komandon dum verkado kaj kontrolo de la artikolo.

Instalante pgbackrest

Deponejo (uzanto pgbackrest):

1. Elŝutu la arkivon de pgbackrest kaj translokigu ĝian enhavon al la /build-dosierujo:

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. Instalu la dependecojn necesajn por kunigo:

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

3. Kunmeti pgbackrest:

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

4. Kopiu la plenumeblan dosieron al la dosierujo /usr/bin:

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

5. Pgbackrest postulas perl. Instali:

sudo apt-get install perl

6. Kreu dosierujojn por protokoloj, donu al ili iujn rajtojn:

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

pgbackrest version

Postgres-servilo (sudo-uzanto aŭ radiko):

La procezo de instalo de pgbackrest sur servilo kun postgres estas simila al la procezo de instalado en la deponejo (jes, pgbackrest devas esti instalita sur ambaŭ serviloj), sed en la 6-a alineo la dua kaj lasta komandoj:

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

anstataŭigi per:

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

Agordi interagadon inter serviloj per senpasvorta SSH

Por ke pgbackrest funkciu ĝuste, necesas agordi la interagadon inter la postgres-servilo kaj la deponejo uzante la ŝlosilan dosieron.

Deponejo (uzanto pgbackrest):

Kreu ŝlosilan paron:

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

Singardemo Ni rulas la suprajn komandojn sen sudo.

Postgres-servilo (sudo-uzanto aŭ radiko):

Kreu ŝlosilan paron:

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

Deponejo (sudo-uzanto):

Kopiu la publikan ŝlosilon de la postgres-servilo al la deponeja servilo:

(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

Je ĉi tiu paŝo oni petos vin pri la pasvorto por la radika uzanto. Vi devas enigi la pasvorton de la radika uzanto de la postgres-servilo!

Postgres-servilo (sudo-uzanto):

Kopiu la deponejon publikan ŝlosilon al la servilo kun 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

Je ĉi tiu paŝo oni petos vin pri la pasvorto por la radika uzanto. Vi devas enigi ĝuste la pasvorton de la radika uzanto de la deponejo!

Ni kontrolas:

Deponejo (radika uzanto, por la pureco de la eksperimento):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres-servilo (radika uzanto, por la pureco de la eksperimento):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Ni certigas, ke ni ricevas aliron sen problemoj.

Agordante postgres-servilon

Postgres-servilo (sudo-uzanto aŭ radiko):

1. Ni permesu frapi la postgres-servilon de eksteraj IP-oj. Por fari tion, redaktu la dosieron postgresql.conf (situanta en la /etc/postgresql/11/ĉefa dosierujo), aldonante la linion al ĝi:

listen_addresses = '*'

Se tia linio jam ekzistas, aŭ malkomentu ĝin aŭ agordu la parametran valoron kiel '*'.

En dosiero pg_hba.conf (ankaŭ troviĝas en la dosierujo /etc/postgresql/11/main) aldonu la sekvajn liniojn:

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

kie:

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

2. Ni faru la necesajn agordojn en postgresql.conf (ĝi estas en la dosierujo /etc/postgresql/11/main) por ke pgbackrest funkciu:

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

3. Ni faru la necesajn agordojn en la agorda dosiero de pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Reŝargi postgresql:

sudo service postgresql restart

Agordi deponejan servilon

Deponejo (uzanto pgbackrest):

Ni faru la necesajn agordojn en la agorda dosiero 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

Kreante deponejon

Deponejo (uzanto pgbackrest):

Kreu novan stokadon por la areto ĉefa:

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

inspektado

Postgres-servilo (sudo-uzanto aŭ radiko):

Ni kontrolas sur la postgres-servilo:

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

Deponejo (uzanto pgbackrest):

Ni kontrolas sur la deponeja servilo:

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

Ni certigas, ke en la eligo ni vidas la linion "kontrolu komandon finon: kompletigita sukcese".

Laca? Ni transiru al la plej interesa parto.

Farante sekurkopion

Deponejo (uzanto pgbackrest):

1. Faru sekurkopion:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Certiĝu, ke sekurkopio estas kreita:

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

Pgbackrest kreos la unuan plenan sekurkopion. Se vi volas, vi povas ruli la rezervan komandon denove kaj certigi, ke la sistemo kreas pliigan sekurkopion.

Se vi volas fari plenan sekurkopion denove, tiam specifu plian flagon:

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

Se vi volas detalan konzolan eligon, tiam ankaŭ specifu:

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

Restarigante sekurkopion

Postgres-servilo (sudo-uzanto aŭ radiko):

1. Ĉesu la kurantan areton:

sudo pg_ctlcluster 11 main stop

2. Restarigi de sekurkopio:

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

Por restarigi la datumbazon al la stato de la lasta PLENA sekurkopio, uzu la komandon sen specifi recovery_target:

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

Grave! Post reakiro, povas okazi, ke la datumbazo blokiĝas en reakira reĝimo (estos eraroj kiel ERARO: ne povas efektivigi DROP DATABASE en nurlegebla transakcio). Verdire, mi ankoraŭ ne komprenis, al kio tio rilatas. La solvo estas kiel sekvas (vi devos atendi iom post kiam la komando estos ekzekutita):

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

Fakte, eblas restarigi specifan sekurkopion laŭ ĝia nomo. Jen mi nur Mi provizos ligilon al la priskribo de ĉi tiu funkcio en la dokumentado. La programistoj konsilas uzi ĉi tiun opcion singarde kaj klarigi kial. Mi povas aldoni de mi mem, ke mi uzis ĝin. Se vi vere bezonas, certigu, ke post reakiro la datumbazo forlasas reakiran reĝimon (elektu pg_is_in_recovery() devus montri "f") kaj, ĉiaokaze, faru plenan sekurkopion post reakiro.

3. Komencu la areton:

sudo pg_ctlcluster 11 main start

Post restarigo de la sekurkopio, ni devas fari duan sekurkopion:

Deponejo (uzanto pgbackrest):

sudo pgbackrest --stanza=main backup

Tio estas ĉio. Konklude, mi ŝatus memorigi vin, ke mi neniel provas ŝajnigi esti altranga dba kaj uzos la nubojn ĉe la plej eta okazo. Nuntempe mi mem komencas studi diversajn temojn kiel sekurkopion, reproduktadon, monitoradon ktp. kaj mi skribas malgrandajn raportojn pri la rezultoj por fari malgrandan kontribuon al la komunumo kaj lasi malgrandajn trompfoliojn por mi.

En la sekvaj artikoloj mi provos paroli pri pliaj funkcioj - reakiro de datumoj al pura areto, ĉifrado de sekurkopioj kaj eldonado al S3, sekurkopioj per rsync.

fonto: www.habr.com

Aldoni komenton