Инкрементални резервни копии на postgresql со pgbackrest - курс за млад борец од развивачот

Одрекување од одговорност

Јас сум програмер. Пишувам код и комуницирам со базата само како корисник. Во никој случај не се преправам дека сум системски администратор, а уште помалку dba. Но…

Така се случи дека требаше да организирам резервна копија на базата на податоци postgresql. Без облаци - само користете SSH и погрижете се се да работи без да барате пари. Што правиме во такви случаи? Така е, го туркаме pgdump во cron, секој ден правиме резервна копија на сè во архивата и ако сме целосно изгубени, ја испраќаме оваа архива некаде далеку.

Овој пат тешкотијата беше што според плановите, базата на податоци требаше да расте за околу +- 100 MB дневно. Се разбира, по неколку недели желбата да се направи резервна копија на сè со pgdump ќе исчезне. Ова е местото каде што дополнителните резервни копии доаѓаат до помош.

Интересно? Добредојдовте во мачка.

Инкременталната резервна копија е тип на резервна копија кога не се копираат сите изворни датотеки, туку само нови и оние што се сменети од создавањето на претходната копија.

Како и секој развивач кој АПСОЛУТНО не сакаше (во тоа време) да ги разбере сложеноста на постгрес, сакав да го најдам зеленото копче. Па, знаете, како во AWS, DigitalOcean: притиснавте едно копче - добивте репликација, го притиснавте второто - поставивте резервни копии, третото - вративте сè неколку часа назад. Не најдов копче или убава GUI алатка. Ако знаете еден (бесплатен или евтин), пишете за тоа во коментарите.

По гуглање најдов две алатки пгбарман и pgbackrest. Едноставно не успеав со првото (многу ретка документација, се обидов да сфатам сè според старите прирачници), но со вториот документацијата се покажа на ниво, но не без недостатоци. За да се поедностави работата на оние кои се соочени со слична задача, напишан е овој напис.

Откако ќе ја прочитате оваа статија, ќе научите како да правите дополнителни резервни копии, да ги зачувате на оддалечен сервер (складиште со резервни копии) и да ги вратите во случај на загуба на податоци или други проблеми на главниот сервер.

Обука

За да го репродуцирате прирачникот ќе ви требаат два VPS. Првиот ќе биде складиштето (складиштето на кое ќе се чуваат резервните копии), а вториот, всушност, самиот сервер со postgres (во мојот случај, верзија 11 на postgres).

Се претпоставува дека на серверот со postgres имате root, sudo user, postgres user и самиот postgres е инсталиран (корисникот postgres се креира автоматски при инсталирање postgresql), а на серверот за складиште има root и sudo user (во прирачникот ќе се користи корисничкото име pgbackrest) .

За да имате помалку проблеми при репродукција на инструкциите, пишувам со курзив каде, со кој корисник и со кои права ја извршив командата додека ја пишувате и проверувате статијата.

Се инсталира pgbackrest

Репозиториум (кориснички pgbackrest):

1. Преземете ја архивата од pgbackrest и префрлете ја нејзината содржина во папката /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. Инсталирајте ги зависностите потребни за склопување:

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

3. Склопување на pgbackrest:

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

4. Копирајте ја извршната датотека во директориумот /usr/bin:

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

5. Pgbackrest бара perl. Инсталирај:

sudo apt-get install perl

6. Креирајте директориуми за дневници, дајте им одредени права:

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. Проверете:

pgbackrest version

Постгрес сервер (судо корисник или корен):

Процесот на инсталирање pgbackrest на сервер со postgres е сличен на процесот на инсталација на складиштето (да, pgbackrest мора да се инсталира на двата сервери), но во 6-тиот пасус втората и последната команда:

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

замени со:

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

Поставување интеракција помеѓу серверите преку SSH без лозинка

За да може pgbackrest да работи правилно, неопходно е да се конфигурира интеракцијата помеѓу серверот postgres и складиштето користејќи ја датотеката со клучеви.

Репозиториум (кориснички pgbackrest):

Создадете пар клучеви:

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

Предупредување! Ги извршуваме горните команди без sudo.

Постгрес сервер (судо корисник или корен):

Создадете пар клучеви:

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

Репозиториум (корисник на sudo):

Копирајте го јавниот клуч на серверот postgres на серверот за складиште:

(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

На овој чекор ќе ви биде побарана лозинката за root корисникот. Треба да ја внесете лозинката на root корисникот на серверот postgres!

Постгрес сервер (судо корисник):

Копирајте го јавниот клуч на складиштето на серверот со 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

На овој чекор ќе ви биде побарана лозинката за root корисникот. Треба да ја внесете точно лозинката на root корисникот на складиштето!

Проверка:

Репозиториум (корен корисник, за чистотата на експериментот):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Сервер Postgres (корисник на root, за чистотата на експериментот):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Се грижиме да добиеме пристап без проблеми.

Поставување на постгрес сервер

Постгрес сервер (судо корисник или корен):

1. Да дозволиме чукање на серверот postgres од надворешни IP адреси. За да го направите ова, уредете ја датотеката postgresql.conf (се наоѓа во /etc/postgresql/11/главната папка), додавајќи ја линијата во неа:

listen_addresses = '*'

Ако таква линија веќе постои, или отстранете ја од коментар или поставете ја вредноста на параметарот како „*“.

Во датотека pg_hba.conf (исто така се наоѓа во папката /etc/postgresql/11/main) додадете ги следните редови:

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

каде што:

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

2. Ајде да ги направиме потребните поставки внатре postgresql.conf (тоа е во папката /etc/postgresql/11/main) за да работи pgbackrest:

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

3. Да ги направиме потребните поставки во конфигурациската датотека pgbackrest (/etc/pgbackrest/pgbackrest.conf):

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

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

4. Вчитајте повторно postgresql:

sudo service postgresql restart

Поставување сервер за складиште

Репозиториум (корисник на pgbackrest):

Ајде да ги направиме потребните поставки во конфигурациската датотека 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

Креирање на складиште

Репозиториум (корисник на pgbackrest):

Создадете нова меморија за кластерот Главната:

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

Проверка

Постгрес сервер (судо корисник или корен):

Проверуваме на серверот postgres:

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

Репозиториум (корисник на pgbackrest):

Проверуваме на серверот за складиште:

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

Уверуваме дека на излезот ја гледаме линијата „провери ја командата крај: успешно завршена“.

Уморен? Да преминеме на најинтересниот дел.

Правење резервна копија

Репозиториум (корисник на pgbackrest):

1. Направете резервна копија:

sudo -u pgbackrest pgbackrest --stanza=main backup

2. Проверете дали е создадена резервна копија:

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

Pgbackrest ќе ја создаде првата целосна резервна копија. Доколку сакате, можете повторно да ја извршите командата за резервна копија и да бидете сигурни дека системот создава постепена резервна копија.

Ако сакате повторно да направите целосна резервна копија, тогаш наведете дополнително знаменце:

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

Ако сакате детален излез од конзолата, тогаш исто така наведете:

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

Враќање на резервна копија

Постгрес сервер (судо корисник или корен):

1. Запрете го трчачкиот кластер:

sudo pg_ctlcluster 11 main stop

2. Враќање од резервна копија:

sudo -u postgres pgbackrest --stanza=main --delta restore

3. Започнете го кластерот:

sudo pg_ctlcluster 11 main start

По враќањето на резервната копија, треба да извршиме втора резервна копија:

Репозиториум (корисник на pgbackrest):

sudo pgbackrest --stanza=main backup

Тоа е се. Како заклучок, би сакал да ве потсетам дека на ниту еден начин не се обидувам да се преправам дека сум сениор dba и ќе ги користам облаците во најмала прилика. Во моментов, јас самиот почнувам да проучувам различни теми како резервна копија, репликација, следење итн. и пишувам мали извештаи за резултатите со цел да дадам мал придонес за заедницата и да оставам мали мамечки листови за себе.

Во следните написи ќе се обидам да зборувам за дополнителни функции - враќање на податоци во чист кластер, шифрирање на резервни копии и објавување на S3, резервни копии преку rsync.

Извор: www.habr.com

Додадете коментар