Инкрементални бекъпи на postgresql с pgbackrest — курс за начинаещи от разработчика

Дисклеймер

Аз съм разработчик. Пиша код, а взаимодействието ми с базата данни е само като потребител. Никога не претендирам да бъда системен администратор, а още по-малко – dba. Но…

Така се случи, че трябваше да организирам резервното копие на базата данни PostgreSQL. Никакви облаци – просто SSH и да направим всичко да работи без да иска пари. Какво правим в такива случаи? Верно, поставяме pgdump в cron, всеки ден архивираме всичко и ако нещата се влошат – изпратим архива на далечно място.

Този път трудността беше, че според плановете базата трябваше да нараства с около 100 MB на ден. Разбира се, след няколко седмици желанието да архивираме всичко с pgdump ще изчезне. Тук на помощ идват инкременталните бекъпи.

Интересно? Добре дошли под кат.

Инкрементален бекъп е вид резервно копие, при което се копират не всички файлове от източника, а само новите и променените от момента на създаването на предходното копие.

Както всеки разработчик, АБСОЛЮТНО не желаещ (в онзи момент) да се запознае с тънкостите на Postgres, исках да намеря зелен бутон. Знаете, като в AWS, DigitalOcean: натискаш един бутон – получаваш репликация, натискаш втори – настройваш бекъпи, трети – връщаш всичко назад с няколко часа. Не намерих бутон и красив инструмент с GUI. Ако знаете такъв (безплатен или евтин) – напишете в коментарите.

След малко търсене открих два инструмента pgbarman и pgbackrest. С първия не се получи (много оскъдна документация, опитвах да направя всичко по стари ръководства), а при втория документацията беше на ниво, но не и без недостатъци. За да улесня работата на тези, които ще се сблъскат с подобна задача, написах настоящата статия.

След прочитането на тази статия ще научите как да правите инкрементални бекъпи, да ги запазвате на отдалечен сървер (репозитория с бекъпи) и да ги възстановявате в случай на загуба на данни или други проблеми на основния сървер.

Подготовка

За да възпроизведете ръководството, ще ви трябват два VPS. Първият ще бъде хранилище (репозитория, на който ще стоят бекъпите), а вторият, също собствено, самият сървер с PostgreSQL (в моя случай версия 11 на PostgreSQL).

Предполага се, че на сървера с PostgreSQL имате root, sudo потребител, потребител postgres и самият PostgreSQL е инсталиран (потребителят postgres се създава автоматично при инсталирането на PostgreSQL), а на репозитория-сървера имате root и sudo потребител (в ръководството ще бъде използвано името на потребителя 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

Postgres сървър (sudo потребител или root):

Процесът на инсталиране на 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

Настройка на взаимодействието между сървърите чрез passwordless SSH

За да функционира pgbackrest коректно, е необходимо да се настрои взаимодействието между postgres сървъра и репозитория по ключов файл.

Репозиторий (потребител pgbackrest):

Създаваме ключова двойка:

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

Внимание! Изпълняваме горепосочените команди без sudo.

Postgres сървър (sudo потребител или root):

Създаваме ключова двойка:

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@ cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

На тази стъпка ще поиска паролата на root потребителя. Трябва да се въведе именно паролата на root потребителя на postgres сървъра!

Postgres сървър (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@ cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

На тази стъпка ще поиска паролата на root потребителя. Трябва да се въведе именно паролата на root потребителя на репозитория!

Проверяваме:

Репозитория (root потребител, за чистота на експеримента):

sudo -u pgbackrest ssh postgres@

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

sudo -u postgres ssh pgbackrest@

Убедете се, че получавате достъп без проблеми.

Настройка на postgres сървъра

Postgres сървър (sudo потребител или root):

1. Ще разрешим достъп до postgres сървъра от външни IP адреси. За целта редактираме файла postgresql.conf (намира се в папката /etc/postgresql/11/main), добавяйки следния ред:

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=

4. Рестартиране на postgresql:

sudo service postgresql restart

Настройка на сървър-репозитория

Репозиторий (pgbackrest потребител):

Ще направим необходимите настройки в конфигурационния файл pgbackrest
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=
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 потребител):

Създаваме ново хранилище за клъстера main:

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

Проверка

Postgres сървър (sudo потребител или root):

Проверяваме на 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

Възстановяване на бекъп

Postgres сървър (sudo потребител или root):

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

На това всичко. В заключение, искам да напомня, че никога не се опитвам да се представя за senior dba и при най-малката възможност ще използвам облачни услуги. В момента започвам да изучавам различни теми като резервно копиране, репликации, мониторинг и т.н. и за резултатите пиша кратки отчети, за да направя малък принос в общността и да оставя за себе си някакви бележки.

В следващите статии ще се опитам да разкажа за допълнителни функции — възстановяване на данни на чист кластер, криптиране на резервни копия и публикуване в S3, резервни копия чрез rsync.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster