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

Одрицање од одговорности

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

Десило се да сам морао да организујем резервну копију постгрескл базе података. Без облака - само користите ССХ и уверите се да све функционише без тражења новца. Шта да радимо у таквим случајевима? Тако је, гурамо пгдумп у црон, сваког дана правимо резервну копију свега у архиву, а ако се потпуно изгубимо, шаљемо ову архиву негде далеко.

Овога пута потешкоћа је била у томе што је према плановима база података требало да расте за око +- 100 МБ дневно. Наравно, након неколико недеља жеља за бекапом свега помоћу пгдумп-а ће нестати. Ово је место где инкременталне резервне копије долазе у помоћ.

Занимљиво? Добродошли у мачку.

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

Као и сваки програмер који АПСОЛУТНО није био вољан (у то време) да разуме замршености постгреса, желео сам да пронађем зелено дугме. Па, знате, као у АВС-у, ДигиталОцеан: притиснете једно дугме - добијете репликацију, притиснете друго - поставите резервне копије, треће - вратите све уназад неколико сати. Нисам нашао дугме или прелеп ГУИ алат. Ако знате неку (бесплатну или јефтину), напишите о томе у коментарима.

Након гуглања пронашао сам два алата пгбарман и пгбацкрест. Са првим једноставно нисам успео (веома оскудна документација, све сам покушавао да схватим по старим приручницима), али са другим је документација испала на нивоу, али не и без мана. Да би се поједноставио рад оних који се суочавају са сличним задатком, написан је овај чланак.

Након што прочитате овај чланак, научићете како да направите инкременталне резервне копије, да их сачувате на удаљеном серверу (спремиште са резервним копијама) и вратите их у случају губитка података или других проблема на главном серверу.

Обука

Да бисте репродуковали упутство биће вам потребна два ВПС. Први ће бити складиште (репозиторијум на коме ће се чувати резервне копије), а други, у ствари, сам сервер са постгресом (у мом случају верзија 11 постгреса).

Претпоставља се да на серверу са постгресом имате роот, судо корисника, постгрес корисника и сам постгрес је инсталиран (постгрес корисник се креира аутоматски приликом инсталирања постгрескл-а), а на серверу ризнице постоје роот и судо корисник (у упутству користиће се корисничко име пгбацкрест) .

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

Инсталирање пгбацкрест-а

Репозиторијум (кориснички пгбацкрест):

1. Преузмите архиву са пгбацкрест-а и пренесите њен садржај у фасциклу /буилд:

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. Састављање пг наслона:

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

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

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

5. Пгбацкрест захтева перл. Инсталирај:

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

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

Процес инсталирања пгбацкрест-а на серверу са постгрес-ом је сличан процесу инсталације у спремишту (да, пгбацкрест мора бити инсталиран на оба сервера), али у 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

Подешавање интеракције између сервера преко ССХ без лозинке

Да би пгбацкрест исправно функционисао, потребно је конфигурисати интеракцију између постгрес сервера и спремишта помоћу датотеке кључа.

Репозиторијум (кориснички пгбацкрест):

Направите пар кључева:

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

Упозорење! Покрећемо горње команде без судо.

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

Направите пар кључева:

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

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

Копирајте јавни кључ постгрес сервера на сервер спремишта:

(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

У овом кораку од вас ће се тражити лозинка за роот корисника. Потребно је да унесете лозинку роот корисника постгрес сервера!

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

Копирајте јавни кључ спремишта на сервер помоћу постгреса:

(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

У овом кораку од вас ће се тражити лозинка за роот корисника. Потребно је да унесете тачно лозинку роот корисника спремишта!

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

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

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Постгрес сервер (роот ​​корисник, ради чистоће експеримента):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Осигуравамо приступ без проблема.

Подешавање постгрес сервера

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

1. Дозволимо куцање на постгрес сервер са спољних ИП адреса. Да бисте то урадили, уредите датотеку постгрескл.цонф (налази се у директоријуму /етц/постгрескл/11/маин), додајући му ред:

listen_addresses = '*'

Ако таква линија већ постоји, или је уклоните коментар или поставите вредност параметра као '*'.

У фајлу пг_хба.цонф (такође се налази у фасцикли /етц/постгрескл/11/маин) додајте следеће редове:

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. Хајде да извршимо потребна подешавања у постгрескл.цонф (налази се у фасцикли /етц/постгрескл/11/маин) да пгбацкрест ради:

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

3. Хајде да извршимо неопходна подешавања у конфигурационој датотеци пгбацкрест (/етц/пгбацкрест/пгбацкрест.цонф):

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

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

4. Поново учитајте постгрескл:

sudo service postgresql restart

Подешавање сервера спремишта

Репозиторијум (пгбацкрест корисник):

Хајде да извршимо потребна подешавања у конфигурационој датотеци пгбацкрест
(/етц/пгбацкрест/пгбацкрест.цонф):

[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

Креирање репозиторијума

Репозиторијум (пгбацкрест корисник):

Направите ново складиште за кластер главни:

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

Проверка

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

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

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

Репозиторијум (пгбацкрест корисник):

Проверавамо на серверу спремишта:

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

Уверавамо се да у излазу видимо ред „цхецк цомманд енд: цомплетед суццессфулли“.

Уморан? Пређимо на најзанимљивији део.

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

Репозиторијум (пгбацкрест корисник):

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

sudo -u pgbackrest pgbackrest --stanza=main backup

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

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

Пгбацкрест ће направити прву потпуну резервну копију. Ако желите, можете поново покренути команду за прављење резервне копије и уверите се да систем креира инкременталну резервну копију.

Ако желите поново да направите потпуну резервну копију, наведите додатну заставицу:

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

Након враћања резервне копије, морамо да извршимо другу резервну копију:

Репозиторијум (пгбацкрест корисник):

sudo pgbackrest --stanza=main backup

То је све. У закључку, желим да вас подсетим да ни на који начин не покушавам да се претварам да сам виши дба и да ћу искористити облаке у најмањој прилици. Тренутно и сам почињем да проучавам разне теме као што су резервна копија, репликација, надгледање итд. и пишем мале извештаје о резултатима да бих дао мали допринос заједници и оставио мале варалице за себе.

У наредним чланцима покушаћу да говорим о додатним функцијама - опоравка података на чисту кластер, шифровање резервних копија и објављивање на С3, резервне копије путем рсинц-а.

Извор: ввв.хабр.цом

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