Нусхаҳои афзояндаи postgresql бо pgbackrest - курс барои муборизи ҷавон аз таҳиякунанда

Радди масъулият

Ман таҳиягар ҳастам. Ман код менависам ва бо махзани маълумот танҳо ҳамчун корбар ҳамкорӣ мекунам. Ба ҳеҷ ваҷҳ ман худро мудири система вонамуд намекунам, на камтар аз dba. Аммо…

Ҳамин тавр шуд, ки ба ман лозим омад, ки нусхаи эҳтиётии пойгоҳи додаҳои postgresql-ро ташкил кунам. Бе абрҳо - танҳо SSH-ро истифода баред ва боварӣ ҳосил кунед, ки ҳама чиз бидуни дархости пул кор мекунад. Дар чунин ҳолатҳо мо чӣ кор мекунем? Дуруст аст, мо pgdump-ро ба cron тела медиҳем, ҳама чизро ба бойгонӣ нусхабардорӣ мекунем ва агар тамоман гум шавем, ин бойгониро ба ҷои дур мефиристем.

Ин дафъа душворӣ дар он буд, ки тибқи нақшаҳо, базаи маълумот бояд дар як рӯз тақрибан +- 100 МБ афзоиш ёбад. Албатта, пас аз чанд ҳафта хоҳиши нусхабардории ҳама чиз бо pgdump аз байн меравад. Дар ин ҷо захираҳои афзоянда ба наҷот меоянд.

Ҷолиб? Хуш омадед ба гурба.

Нусхаи эҳтиётии афзоянда як намуди нусхабардорӣ мебошад, ки на ҳама файлҳои манбаъ нусхабардорӣ карда мешаванд, балки танҳо файлҳои нав ва онҳое, ки аз замони эҷоди нусхаи қаблӣ иваз карда мешаванд.

Мисли ҳар як таҳиякунанда, ки комилан намехост (он вақт) нозукиҳои постгресро дарк кунад, ман мехостам тугмаи сабзро пайдо кунам. Хуб, шумо медонед, ба монанди дар AWS, DigitalOcean: шумо як тугмаро пахш кардед - шумо нусхабардорӣ гирифтед, дуюмро пахш кардед - шумо нусхаҳои эҳтиётиро насб кардед, сеюм - шумо ҳама чизро чанд соат баргардондед. Ман тугма ё асбоби зебои GUI наёфтам. Агар шумо якеро медонед (ройгон ё арзон), дар бораи он дар шарҳҳо нависед.

Пас аз ҷустуҷӯ ман ду асбоб пайдо кардам pgbarman и pgbackrest. Ман танҳо бо аввалинаш муваффақ нашудам (ҳуҷҷатҳои хеле камёфт, ман кӯшиш кардам, ки ҳама чизро мувофиқи дастурҳои кӯҳна муайян кунам), аммо бо дуюмаш ҳуҷҷатгузорӣ ба қадри кофӣ баромад, аммо на бе камбудиҳо. Барои содда кардани кори онҳое, ки бо чунин вазифа рӯ ба рӯ мешаванд, ин мақола навишта шудааст.

Пас аз хондани ин мақола, шумо мефаҳмед, ки чӣ гуна нусхабардории афзоянда, захира кардани онҳо дар сервери дурдаст (анбори захиравӣ) ва барқарор кардани онҳо дар ҳолати гум шудани маълумот ё мушкилоти дигар дар сервери асосӣ.

Омодагӣ

Барои дубора тавлид кардани дастур ба шумо ду VPS лозим аст. Якум анбор (анборе, ки дар он нусхаҳои эҳтиётӣ нигоҳ дошта мешаванд) ва дуюм, воқеан худи сервер бо postgres (дар ҳолати ман, версияи 11-и postgres) хоҳад буд.

Тахмин меравад, ки дар сервер бо postgres шумо root, корбари sudo, корбари postgres ва худи postgres насб карда шудааст (корбари 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 ё реша):

Раванди насби pgbackrest дар сервер бо postgres ба раванди насбкунӣ дар анбор монанд аст (бале, pgbackrest бояд дар ҳарду сервер насб карда шавад), вале дар сархати шашум фармонхои дуюм ва охирин:

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 иҷро мекунем.

Сервери Postgres (корбари 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

Дар ин қадам аз шумо парол барои корбари реша талаб карда мешавад. Шумо бояд пароли корбари решаи сервери 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@<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>

Сервери Postgres (корбари решавӣ, барои тозагии таҷриба):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

Мо боварӣ ҳосил мекунем, ки мо бе мушкилот дастрасӣ пайдо мекунем.

Насб кардани сервери postgres

Сервери Postgres (корбари sudo ё реша):

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=<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 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
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 ё реша):

Мо сервери 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 ё реша):

1. Кластери иҷрошавандаро қатъ кунед:

sudo pg_ctlcluster 11 main stop

2. Барқароркунӣ аз нусхабардорӣ:

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

Барои барқарор кардани пойгоҳи додаҳо ба ҳолати охирини нусхабардории ПУРРА, фармонро бе нишон додани recovery_target истифода баред:

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

Муҳим! Пас аз барқарорсозӣ, мумкин аст, ки пойгоҳи додаҳо дар реҷаи барқарорсозӣ часпида шаванд (хатоҳо ба монанди ERROR: DROP DATABASE-ро дар амалиёти танҳо барои хондан иҷро карда наметавонанд). Ростӣ, ман ҳанӯз нафаҳмидам, ки ин ба чӣ иртибот дорад. Ҳалли ин аст (ба шумо лозим меояд, ки каме пас аз иҷро шудани фармон интизор шавед):

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

Дар асл, имконпазир аст, ки нусхаи эҳтиётии мушаххасро бо номи он барқарор кунед. Дар ин ҷо ман танҳо ҳастам Ман истинод ба тавсифи ин хусусиятро дар ҳуҷҷатҳо пешниҳод мекунам. Таҳиягарон маслиҳат медиҳанд, ки ин хосиятро бо эҳтиёт истифода баранд ва сабаби онро шарҳ диҳанд. Ман метавонам аз худам илова кунам, ки ман онро истифода кардам. Агар ба шумо воқеан лозим бошад, боварӣ ҳосил кунед, ки пас аз барқарорсозӣ пойгоҳи додаҳо аз ҳолати барқарорсозӣ мебарояд (интихоб кунед pg_is_in_recovery() бояд "f"-ро нишон диҳад) ва дар ҳар сурат пас аз барқарорсозӣ нусхаи пурраи нусхабардорӣ кунед.

3. Кластерро оғоз кунед:

sudo pg_ctlcluster 11 main start

Пас аз барқарор кардани нусхабардорӣ, мо бояд нусхаи дуюмро иҷро кунем:

Анбор (корбари pgbackrest):

sudo pgbackrest --stanza=main backup

Ҳамааш ҳамин. Дар хотима, ман мехоҳам ба шумо хотиррасон кунам, ки ман ҳеҷ гоҳ кӯшиш намекунам, ки худро як дба калон вонамуд кунам ва дар хурдтарин фурсат абрҳоро истифода хоҳам кард. Дар айни замон, ман худам ба омӯзиши мавзӯъҳои гуногун, аз қабили нусхабардорӣ, такрорӣ, мониторинг ва ғайра шурӯъ мекунам. ва ман дар бораи натиҷаҳо гузоришҳои хурд менависам, то дар ҷомеа саҳми каме дошта бошам ва барои худ варақаҳои хурди фиреб гузорам.

Дар мақолаҳои зерин ман кӯшиш мекунам, ки дар бораи хусусиятҳои иловагӣ сӯҳбат кунам - барқарорсозии маълумот ба кластери тоза, рамзгузории нусхаҳои эҳтиётӣ ва нашр дар S3, нусхабардорӣ тавассути rsync.

Манбаъ: will.com

Илова Эзоҳ